From 0f79b0353194f2f782a975fd5defb57ef91c29f4 Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Fri, 13 Nov 2020 17:25:58 +0530 Subject: [PATCH 1/8] Initial development --- Raj_Bhushan/jump_angular/.editorconfig | 13 + Raj_Bhushan/jump_angular/.gitignore | 46 + Raj_Bhushan/jump_angular/README.md | 27 + Raj_Bhushan/jump_angular/angular.json | 130 + Raj_Bhushan/jump_angular/browserslist | 12 + .../jump_angular/e2e/protractor.conf.js | 32 + .../jump_angular/e2e/src/app.e2e-spec.ts | 23 + Raj_Bhushan/jump_angular/e2e/src/app.po.ts | 11 + Raj_Bhushan/jump_angular/e2e/tsconfig.json | 13 + Raj_Bhushan/jump_angular/karma.conf.js | 32 + Raj_Bhushan/jump_angular/package-lock.json | 14182 ++++++++++++++++ Raj_Bhushan/jump_angular/package.json | 52 + .../src/app/app-routing.module.ts | 44 + .../jump_angular/src/app/app.component.css | 1 + .../jump_angular/src/app/app.component.html | 2 + .../src/app/app.component.spec.ts | 31 + .../jump_angular/src/app/app.component.ts | 15 + .../jump_angular/src/app/app.module.ts | 42 + .../src/app/auth/login/login.component.css | 12 + .../src/app/auth/login/login.component.html | 28 + .../app/auth/login/login.component.spec.ts | 25 + .../src/app/auth/login/login.component.ts | 38 + .../app/auth/register/register.component.css | 11 + .../app/auth/register/register.component.html | 62 + .../auth/register/register.component.spec.ts | 25 + .../app/auth/register/register.component.ts | 18 + .../jump_angular/src/app/core/core.module.ts | 35 + .../jump_angular/src/app/core/model/event.ts | 8 + .../src/app/core/security/auth.guard.spec.ts | 16 + .../src/app/core/security/auth.guard.ts | 22 + .../app/core/security/auth.service.spec.ts | 16 + .../src/app/core/security/auth.service.ts | 24 + .../event/event-list/event-list.component.css | 7 + .../event-list/event-list.component.html | 21 + .../event-list/event-list.component.spec.ts | 25 + .../event/event-list/event-list.component.ts | 27 + .../src/app/event/queue/queue.component.css | 43 + .../src/app/event/queue/queue.component.html | 36 + .../app/event/queue/queue.component.spec.ts | 25 + .../src/app/event/queue/queue.component.ts | 63 + .../queue/services/queue.service.spec.ts | 16 + .../app/event/queue/services/queue.service.ts | 32 + .../src/app/header/header.component.css | 12 + .../src/app/header/header.component.html | 21 + .../src/app/header/header.component.spec.ts | 25 + .../src/app/header/header.component.ts | 17 + Raj_Bhushan/jump_angular/src/assets/.gitkeep | 0 .../jump_angular/src/assets/event.json | 36 + .../src/assets/images/jumptheq.png | Bin 0 -> 15841 bytes .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 16 + Raj_Bhushan/jump_angular/src/favicon.ico | Bin 0 -> 948 bytes Raj_Bhushan/jump_angular/src/index.html | 15 + Raj_Bhushan/jump_angular/src/main.ts | 12 + Raj_Bhushan/jump_angular/src/polyfills.ts | 63 + Raj_Bhushan/jump_angular/src/styles.css | 4 + Raj_Bhushan/jump_angular/src/test.ts | 20 + Raj_Bhushan/jump_angular/tsconfig.app.json | 18 + Raj_Bhushan/jump_angular/tsconfig.json | 26 + Raj_Bhushan/jump_angular/tsconfig.spec.json | 18 + Raj_Bhushan/jump_angular/tslint.json | 91 + 61 files changed, 15740 insertions(+) create mode 100644 Raj_Bhushan/jump_angular/.editorconfig create mode 100644 Raj_Bhushan/jump_angular/.gitignore create mode 100644 Raj_Bhushan/jump_angular/README.md create mode 100644 Raj_Bhushan/jump_angular/angular.json create mode 100644 Raj_Bhushan/jump_angular/browserslist create mode 100644 Raj_Bhushan/jump_angular/e2e/protractor.conf.js create mode 100644 Raj_Bhushan/jump_angular/e2e/src/app.e2e-spec.ts create mode 100644 Raj_Bhushan/jump_angular/e2e/src/app.po.ts create mode 100644 Raj_Bhushan/jump_angular/e2e/tsconfig.json create mode 100644 Raj_Bhushan/jump_angular/karma.conf.js create mode 100644 Raj_Bhushan/jump_angular/package-lock.json create mode 100644 Raj_Bhushan/jump_angular/package.json create mode 100644 Raj_Bhushan/jump_angular/src/app/app-routing.module.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/app.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/app.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/app.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/app.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/app.module.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/login/login.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/login/login.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/register/register.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/core.module.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/model/event.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/security/auth.service.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/header/header.component.css create mode 100644 Raj_Bhushan/jump_angular/src/app/header/header.component.html create mode 100644 Raj_Bhushan/jump_angular/src/app/header/header.component.spec.ts create mode 100644 Raj_Bhushan/jump_angular/src/app/header/header.component.ts create mode 100644 Raj_Bhushan/jump_angular/src/assets/.gitkeep create mode 100644 Raj_Bhushan/jump_angular/src/assets/event.json create mode 100644 Raj_Bhushan/jump_angular/src/assets/images/jumptheq.png create mode 100644 Raj_Bhushan/jump_angular/src/environments/environment.prod.ts create mode 100644 Raj_Bhushan/jump_angular/src/environments/environment.ts create mode 100644 Raj_Bhushan/jump_angular/src/favicon.ico create mode 100644 Raj_Bhushan/jump_angular/src/index.html create mode 100644 Raj_Bhushan/jump_angular/src/main.ts create mode 100644 Raj_Bhushan/jump_angular/src/polyfills.ts create mode 100644 Raj_Bhushan/jump_angular/src/styles.css create mode 100644 Raj_Bhushan/jump_angular/src/test.ts create mode 100644 Raj_Bhushan/jump_angular/tsconfig.app.json create mode 100644 Raj_Bhushan/jump_angular/tsconfig.json create mode 100644 Raj_Bhushan/jump_angular/tsconfig.spec.json create mode 100644 Raj_Bhushan/jump_angular/tslint.json diff --git a/Raj_Bhushan/jump_angular/.editorconfig b/Raj_Bhushan/jump_angular/.editorconfig new file mode 100644 index 0000000..e89330a --- /dev/null +++ b/Raj_Bhushan/jump_angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/Raj_Bhushan/jump_angular/.gitignore b/Raj_Bhushan/jump_angular/.gitignore new file mode 100644 index 0000000..86d943a --- /dev/null +++ b/Raj_Bhushan/jump_angular/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Raj_Bhushan/jump_angular/README.md b/Raj_Bhushan/jump_angular/README.md new file mode 100644 index 0000000..48448d3 --- /dev/null +++ b/Raj_Bhushan/jump_angular/README.md @@ -0,0 +1,27 @@ +# FlexTutorial + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.0. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/Raj_Bhushan/jump_angular/angular.json b/Raj_Bhushan/jump_angular/angular.json new file mode 100644 index 0000000..4e7bb60 --- /dev/null +++ b/Raj_Bhushan/jump_angular/angular.json @@ -0,0 +1,130 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "flex-tutorial": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/flex-tutorial", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "flex-tutorial:build" + }, + "configurations": { + "production": { + "browserTarget": "flex-tutorial:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "flex-tutorial:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.css" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "flex-tutorial:serve" + }, + "configurations": { + "production": { + "devServerTarget": "flex-tutorial:serve:production" + } + } + } + } + } + }, + "defaultProject": "flex-tutorial", + "cli": { + "analytics": "164dbad5-005d-4d43-8f56-78af46945733" + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/browserslist b/Raj_Bhushan/jump_angular/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/Raj_Bhushan/jump_angular/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/e2e/protractor.conf.js b/Raj_Bhushan/jump_angular/e2e/protractor.conf.js new file mode 100644 index 0000000..7c798cf --- /dev/null +++ b/Raj_Bhushan/jump_angular/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/e2e/src/app.e2e-spec.ts b/Raj_Bhushan/jump_angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..ae60acc --- /dev/null +++ b/Raj_Bhushan/jump_angular/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('flex-tutorial app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/Raj_Bhushan/jump_angular/e2e/src/app.po.ts b/Raj_Bhushan/jump_angular/e2e/src/app.po.ts new file mode 100644 index 0000000..b8498c2 --- /dev/null +++ b/Raj_Bhushan/jump_angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/Raj_Bhushan/jump_angular/e2e/tsconfig.json b/Raj_Bhushan/jump_angular/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/Raj_Bhushan/jump_angular/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/Raj_Bhushan/jump_angular/karma.conf.js b/Raj_Bhushan/jump_angular/karma.conf.js new file mode 100644 index 0000000..be3ef53 --- /dev/null +++ b/Raj_Bhushan/jump_angular/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/flex-tutorial'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/Raj_Bhushan/jump_angular/package-lock.json b/Raj_Bhushan/jump_angular/package-lock.json new file mode 100644 index 0000000..4d2cc27 --- /dev/null +++ b/Raj_Bhushan/jump_angular/package-lock.json @@ -0,0 +1,14182 @@ +{ + "name": "flex-tutorial", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.901.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0-next.1.tgz", + "integrity": "sha512-K/GNWJs1zOuj+orzeeVptX2Tpq43LBRWXzvuWC+FPvdKP1R3b293sjcJziz00fBphIZS7cE8pmicRzbfF5+b9g==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0-next.1", + "rxjs": "6.5.4" + } + }, + "@angular-devkit/build-angular": { + "version": "0.901.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0-next.1.tgz", + "integrity": "sha512-D2KfymZlsCPhJWBClRjegifnjLsSnJ/or/YWFaWFs/d/+pC2+rUAkGfBHEAhvnOYW4Gez/aWMFqAnWQD3n6Xfg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.901.0-next.1", + "@angular-devkit/build-optimizer": "0.901.0-next.1", + "@angular-devkit/build-webpack": "0.901.0-next.1", + "@angular-devkit/core": "9.1.0-next.1", + "@babel/core": "7.8.4", + "@babel/preset-env": "7.8.4", + "@babel/template": "7.8.3", + "@ngtools/webpack": "9.1.0-next.1", + "ajv": "6.12.0", + "autoprefixer": "9.7.4", + "babel-loader": "8.0.6", + "browserslist": "4.8.6", + "cacache": "15.0.0", + "caniuse-lite": "1.0.30001023", + "circular-dependency-plugin": "5.2.0", + "copy-webpack-plugin": "5.1.1", + "core-js": "3.6.4", + "coverage-istanbul-loader": "2.0.3", + "cssnano": "4.1.10", + "file-loader": "5.1.0", + "find-cache-dir": "3.3.0", + "glob": "7.1.6", + "jest-worker": "25.1.0", + "karma-source-map-support": "1.4.0", + "less": "3.11.1", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.3", + "loader-utils": "1.4.0", + "mini-css-extract-plugin": "0.9.0", + "minimatch": "3.0.4", + "open": "7.0.2", + "parse5": "4.0.0", + "postcss": "7.0.27", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "4.0.0", + "regenerator-runtime": "0.13.3", + "rimraf": "3.0.2", + "rollup": "1.31.1", + "rxjs": "6.5.4", + "sass": "1.26.1", + "sass-loader": "8.0.2", + "semver": "7.1.3", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.16", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.1.3", + "stylus": "0.54.7", + "stylus-loader": "3.0.2", + "terser": "4.6.4", + "terser-webpack-plugin": "2.3.5", + "tree-kill": "1.2.2", + "webpack": "4.41.6", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.10.3", + "webpack-merge": "4.2.2", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.4.0", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "glob": { + "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", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.901.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0-next.1.tgz", + "integrity": "sha512-l2g2ZXAKwG53kltuZfXjpAYeJ7ktv/fhVQx5GeQ2cL0l7y20/CjcHgOEC+SRmrPUnznm4nkUEhgqjRhF0egSPw==", + "dev": true, + "requires": { + "loader-utils": "1.4.0", + "source-map": "0.7.3", + "tslib": "1.11.0", + "typescript": "3.6.4", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "tslib": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", + "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", + "dev": true + }, + "typescript": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.901.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0-next.1.tgz", + "integrity": "sha512-6Z3PLic/49IYWY2KqFDqAN0HRMsicr3pfw1HtDrukw8TfIssSvsTlwsOIEJ82lnLNm6TLP3UGrlqi8jKkeUrnA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.901.0-next.1", + "@angular-devkit/core": "9.1.0-next.1", + "rxjs": "6.5.4" + } + }, + "@angular-devkit/core": { + "version": "9.1.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0-next.1.tgz", + "integrity": "sha512-REazHZJr+9K3Vt9QhArWaTO2w+VYtFBgf4hXQJ4EV+lcllg4IaJOEnJZsEVdrB+0UlqgdtRuE7UUfxp0aFiG9w==", + "dev": true, + "requires": { + "ajv": "6.12.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.6", + "rxjs": "6.5.4", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + } + } + }, + "@angular-devkit/schematics": { + "version": "9.1.0-next.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0-next.1.tgz", + "integrity": "sha512-KoVq0fAdf+NEtLNJ/NRfrlTV844fl36SFKisZlUI7XzPo/tIMbR8UUhZPDE0cAzowL//W+wiisRbPA8ReIQTzA==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0-next.1", + "ora": "4.0.3", + "rxjs": "6.5.4" + } + }, + "@angular/animations": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.4.tgz", + "integrity": "sha512-zTCgrIAA9FYPMbqqpQnoNltiLR58q0FMfzP2t96q/1tjyVy/Y/IaNgVQ7eL0HeQ0nG6IAzQ1HVx8Xeneg4Yj5Q==" + }, + "@angular/cdk": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.0.tgz", + "integrity": "sha512-qKpAudJx9z0MD+ADptS0OZViJBTA49+JCKym0hPQUkcB9Po4Al6gu6oZ1VSXV5Ln3T84z9aAw/AhUGP/YCFNSQ==", + "requires": { + "parse5": "^5.0.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "9.1.0-next.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0-next.1.tgz", + "integrity": "sha512-Ei6+lGRO8UzlNGXxknaTORXNtctLtMcFvkbYj5PLPJFxlwUpvlR7bFfy0lpvUVr+Ws94ZJc8ZGOZRziPtxPRlg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.901.0-next.1", + "@angular-devkit/core": "9.1.0-next.1", + "@angular-devkit/schematics": "9.1.0-next.1", + "@schematics/angular": "9.1.0-next.1", + "@schematics/update": "0.901.0-next.1", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.1.1", + "ini": "1.3.5", + "inquirer": "7.0.4", + "npm-package-arg": "8.0.0", + "npm-pick-manifest": "6.0.0", + "open": "7.0.2", + "pacote": "11.1.0", + "read-package-tree": "5.3.1", + "rimraf": "3.0.2", + "semver": "7.1.3", + "symbol-observable": "1.2.0", + "universal-analytics": "0.4.20", + "uuid": "7.0.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "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" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "uuid": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.1.tgz", + "integrity": "sha512-yqjRXZzSJm9Dbl84H2VDHpM3zMjzSJQ+hn6C4zqd5ilW+7P4ZmLEEqwho9LjP+tGuZlF4xrHQXT0h9QZUS/pWA==", + "dev": true + } + } + }, + "@angular/common": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.4.tgz", + "integrity": "sha512-F3qoYrceEdCd5SlgObcbSIIdKfRXgyTBO2gbbArQHFe4GvewkH3isTn5uqAF6sfJlb7rXWZGrD6C3d9brw/fEw==" + }, + "@angular/compiler": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.4.tgz", + "integrity": "sha512-+Ku8RUU00yHaKVkVw6YIfM3c5Gmvas5gJcEleiagkLbc1f/jKk1cY4gaUP6xn4TLypFM7NQglneWd+E+8wh0hQ==" + }, + "@angular/compiler-cli": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.4.tgz", + "integrity": "sha512-fcln3gJCV88r1CoCASIathOd7kpLJ1c8l4t6P1CQG/MCocxMvVa8bI5LRKTcQ5VTnR46Ne9+5HegIRPk7EePBQ==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "yargs": "13.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 + }, + "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 + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.4.tgz", + "integrity": "sha512-6RqQb1GO2uglSlgiGbxhvy8plztZtABCWLRn0X+T1PnrxoqgxqA5WkKJjGxao+1M/ECW1V0fw4Xy7DE6KvAJwQ==" + }, + "@angular/flex-layout": { + "version": "9.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.29.tgz", + "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" + }, + "@angular/forms": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.4.tgz", + "integrity": "sha512-WyfZ2u2JzGrwkxQmfxHvZMoYHEGfoUL+JlSXa2Sy3T/FPGNckHzIzggqweJij/qGjabWLabZDla4vak42f+4PA==" + }, + "@angular/language-service": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.4.tgz", + "integrity": "sha512-Q/kFQV4mjZ/Mpx6GksriM5lingjX73EwtVc79AfVMA76Pv5XqfYQZuti6tk7DvYQD89sv1Z/iN2di+ZLKsSTnw==", + "dev": true + }, + "@angular/material": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.1.0.tgz", + "integrity": "sha512-KjA1ARoZ1vBg4jUH1y39muynxAFvkD8QZFGKH8Nh4zXW5pOP/7NyjokxXsNx5qSBCq/6ac2xBxCrCYJN7HmoDw==" + }, + "@angular/platform-browser": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.4.tgz", + "integrity": "sha512-mbiqmw0rDGPxEgKVgDuK7yZvtgjJmzpMGBYAMwkQ9YIE0SoA5XP0NvZiFkHZqDXwLgCv2IJ/kvkhfCBwnBKCXQ==" + }, + "@angular/platform-browser-dynamic": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.4.tgz", + "integrity": "sha512-9vAn2QH07khuF4n7kyMJzgE6l30Yxg1AGd8GtOfa/4nbna+EZxFVYOkto9bpv4uEwDr9o7QrFLplko9a8xs7kg==" + }, + "@angular/router": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.4.tgz", + "integrity": "sha512-03A8RpjtqB02y1DWgCPfhCprdCCkhEYU0Fo3qWCHnpa02ikejzKxyjoJyrVU/AMNbljOj5ZMcpSfyj07aPp4tQ==" + }, + "@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": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz", + "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.6.tgz", + "integrity": "sha512-4bpOR5ZBz+wWcMeVtcf7FbjcFzCp+817z2/gHNncIRcM9MmKzUhtWCYAq27RAfUrAFwb+OCG1s9WEaVxfi6cjg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.6.tgz", + "integrity": "sha512-UrJdk27hKVJSnibFcUWYLkCL0ZywTUoot8yii1lsHJcvwrypagmYKjHLMWivQPm4s6GdyygCL8fiH5EYLxhQwQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz", + "integrity": "sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", + "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.8.6", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.6.tgz", + "integrity": "sha512-trGNYSfwq5s0SgM1BMEB8hX3NDmO7EP2wsDGDexiaKMB92BaRpS+qZfpkMqUBhcsOTBwNy9B/jieo4ad/t/z2g==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz", + "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz", + "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.6", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.6.tgz", + "integrity": "sha512-wqz7pgWMIrht3gquyEFPVXeXCti72Rm8ep9b5tQKz9Yg9LzJA3HxosF1SB3Kc81KD1A3XBkkVYtJvCKS2Z/QrA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@material/animation": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-8.0.0.tgz", + "integrity": "sha512-4+rCFDcfJap62a/8luuq1fmMA+EdVMASD4CBd9cN4LNOc/OPzBkLqv0PHFTnmHu9Y9biHD94uyDsbEcvtyGr+Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-8.0.0.tgz", + "integrity": "sha512-lLB3lv/A7TqqfqeVnoguv0NV+wpzM0KAVXj0jrtg2BtbxlOYjkfl4uySyOCLGxB0y4vTv1rSXB5i7Xn73+OQHg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/button": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-8.0.0.tgz", + "integrity": "sha512-16s11brFwfpWvvJxMtOyUZ7J70TNclV37M4aRlQ1Cjxhk2IUQzeRSADpCl/NdNAZQHEIhrGl2oy21sQqaNhBKg==", + "requires": { + "@material/density": "^8.0.0", + "@material/elevation": "^8.0.0", + "@material/feature-targeting": "^8.0.0", + "@material/ripple": "^8.0.0", + "@material/rtl": "^8.0.0", + "@material/shape": "^8.0.0", + "@material/theme": "^8.0.0", + "@material/touch-target": "^8.0.0", + "@material/typography": "^8.0.0" + } + }, + "@material/density": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-8.0.0.tgz", + "integrity": "sha512-44g0S8kZfVw02JfMCLQeYxbt143xiQvouR1mNKqC6+W+XhdBNS1IxKtk+kONiEIXVhb9JKnEp5zag+aC589RTw==" + }, + "@material/dom": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-8.0.0.tgz", + "integrity": "sha512-Y+sGqsyeFEu2whqdQ++LzXwmoRzhG3nEiPPwtX/Fgqrfdy7nyG1tvLXT+P+PLMDM6xO/H5+yjPV5OLFpKJjiIg==", + "requires": { + "@material/feature-targeting": "^8.0.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-8.0.0.tgz", + "integrity": "sha512-DF/bdPv20jnKw35rIGbJmVTaNKA710hzdmI8G4TWrW/asMkxynEjJKQriyXkesLY+c1GP7qJDEhpV+xkQUrJLg==", + "requires": { + "@material/animation": "^8.0.0", + "@material/base": "^8.0.0", + "@material/feature-targeting": "^8.0.0", + "@material/theme": "^8.0.0" + } + }, + "@material/feature-targeting": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-8.0.0.tgz", + "integrity": "sha512-xMJ9RmnOQCLPB6bD0xS0p6NF36vKNkjoPQt8aOoimtBlhSOba68+5jeX/qEQYZgOG4jf0SnWq833gAxx61Ni6g==" + }, + "@material/icon-button": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-8.0.0.tgz", + "integrity": "sha512-OcO2sw21ty7OzEQ+7tkYt5NGrrwwDuCvZegfL/eMUla1iQFYf/pZ+QCb1r3NEtbBJmsXzoBsDcUnaiM4PxFs3g==", + "requires": { + "@material/base": "^8.0.0", + "@material/density": "^8.0.0", + "@material/feature-targeting": "^8.0.0", + "@material/ripple": "^8.0.0", + "@material/rtl": "^8.0.0", + "@material/theme": "^8.0.0", + "tslib": "^1.9.3" + } + }, + "@material/ripple": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-8.0.0.tgz", + "integrity": "sha512-r6Ejin8Qp9e91kHdhfStfXf5I18l5ZuraQIegBqj20OLe7SdrpMaGA3e1g923e/wfDCYEX1sBUVerwVUFJ+rTQ==", + "requires": { + "@material/animation": "^8.0.0", + "@material/base": "^8.0.0", + "@material/dom": "^8.0.0", + "@material/feature-targeting": "^8.0.0", + "@material/theme": "^8.0.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-8.0.0.tgz", + "integrity": "sha512-P7+22B+2r+ol5pnLvq7VUaZPJGBZeX2PpVwELE7J3IruN6SnOZyt1h2LZI/sEMuyQhKrNs8Cpq2PLnbgeQhBJQ==", + "requires": { + "@material/theme": "^8.0.0" + } + }, + "@material/shape": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-8.0.0.tgz", + "integrity": "sha512-VX8QtZkzC6bViTw9krDRgXaMQ+TVdSJSRs2W24V6G7FbYyVQqBreTkp8knAWJPWj68MsGVp1kRRvR6U8tB4GDg==", + "requires": { + "@material/feature-targeting": "^8.0.0", + "@material/rtl": "^8.0.0", + "@material/theme": "^8.0.0" + } + }, + "@material/snackbar": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-8.0.0.tgz", + "integrity": "sha512-VJA3C58o+b2PRpPsPrQ3dnS3S4L8NZ56Y9eEkOdaJ7mQUQqvYC3opYAT/MuawyGC9I7sUgscV7gHnYifm6JJHQ==", + "requires": { + "@material/animation": "^8.0.0", + "@material/base": "^8.0.0", + "@material/button": "^8.0.0", + "@material/dom": "^8.0.0", + "@material/elevation": "^8.0.0", + "@material/feature-targeting": "^8.0.0", + "@material/icon-button": "^8.0.0", + "@material/ripple": "^8.0.0", + "@material/rtl": "^8.0.0", + "@material/shape": "^8.0.0", + "@material/theme": "^8.0.0", + "@material/typography": "^8.0.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-8.0.0.tgz", + "integrity": "sha512-YcU4oi1pd9K8KfPfhZHD7GGnn034SoaVld5534eEnTMgpUn2y7KHZJlPCjrdh1tIy+PBvnYAkxBtx+mKWRCKFQ==", + "requires": { + "@material/feature-targeting": "^8.0.0" + } + }, + "@material/touch-target": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-8.0.0.tgz", + "integrity": "sha512-vRaV8AYiZfN+90SxDrO38rmmwNrTQHwwWGViBWod2uedQLe+TisldKa0UlCBrVscuDMVO3cpDdsgVzzdpCHdxg==", + "requires": { + "@material/base": "^8.0.0", + "@material/feature-targeting": "^8.0.0" + } + }, + "@material/typography": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-8.0.0.tgz", + "integrity": "sha512-1CKckX1JStAh4JvOGwyc3vJ8ggGJXBZJTZJDJNmXSyJeL8SkLdppeTjr02zN09VNrVehS41ArhScPF0zl0rMzQ==", + "requires": { + "@material/feature-targeting": "^8.0.0", + "@material/theme": "^8.0.0" + } + }, + "@ngtools/webpack": { + "version": "9.1.0-next.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0-next.1.tgz", + "integrity": "sha512-ZYG6KSDfG2oc2buA20wWDOUi+nNrtEovyqDa640CFNlRu7wBhWsAuLbVAphqVNoAVp9Yy2rorSkYYdpNC0cUjw==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0-next.1", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.4", + "webpack-sources": "1.4.3" + } + }, + "@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", + "dev": true + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@schematics/angular": { + "version": "9.1.0-next.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0-next.1.tgz", + "integrity": "sha512-psIM0D504/lYmV0mzdv5XnoFheEsoPX+Q5gi70ffV8pbWsh3K+ksgvJzjgigAKwqv7z+4aS4fmwXDDfvPgPDHw==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0-next.1", + "@angular-devkit/schematics": "9.1.0-next.1" + } + }, + "@schematics/update": { + "version": "0.901.0-next.1", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0-next.1.tgz", + "integrity": "sha512-Ilyh3v21C9spBMsuuFMyEMszFhduD4bWU9zj/S0eL0SCc7Xgxy84XExKkIi5bsEQjpKdA1YO7Qb1kCfhAAbsgg==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0-next.1", + "@angular-devkit/schematics": "9.1.0-next.1", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "11.1.0", + "rxjs": "6.5.4", + "semver": "7.1.3", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "dev": true + }, + "@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 + }, + "@types/estree": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.42.tgz", + "integrity": "sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.12.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.29.tgz", + "integrity": "sha512-yo8Qz0ygADGFptISDj3pOC9wXfln/5pQaN/ysDIzOaAWXt73cNHmtEC8zSO2Y+kse/txmwIAJzkYZ5fooaS5DQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", + "integrity": "sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", + "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "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": "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": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "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 + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "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=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "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 + } + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "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 + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "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 + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "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", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "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 + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "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=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001023", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", + "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "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": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "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.3.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "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-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz", + "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "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 + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "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 + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "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 + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "coverage-istanbul-loader": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", + "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.0", + "loader-utils": "^1.2.3", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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": { + "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-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "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 + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "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.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "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": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "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" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.364.tgz", + "integrity": "sha512-V6hyxQ9jzt6Jy6w8tAv4HHKhIaVS6psG/gmwtQ+2+itdkWMHJLHJ4m1sFep/fWkdKvfJcPXuywfnECRzfNa7gw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "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 + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "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" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "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-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": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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 + }, + "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.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "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" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "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 + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "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-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", + "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", + "dev": true, + "requires": { + "loader-utils": "^1.4.0", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "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 + } + } + }, + "find-cache-dir": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.0.tgz", + "integrity": "sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.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" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "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 + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "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-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "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": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.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" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "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": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "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.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "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 + }, + "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 + }, + "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": { + "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" + } + } + } + }, + "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 + } + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "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-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": "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 + }, + "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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "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-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-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "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-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "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==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.0.1.tgz", + "integrity": "sha512-XFY2Mbnmg+8r7MRsxfArVkZcfjxGlF/NjM3LsPXVeCX/GBF/1FTCv+idHBYC4qLPtK7q8HC8bapLoWqnhP/bXw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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-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=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.2.tgz", + "integrity": "sha512-ILBPsXqQ3eomq+oaQsM311/jxsypw5/d0LnZXj26XkfThwq7jZ55A2CFSKJVA5VekbbOGvMyv7d3juZj0SeTxA==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "license-webpack-plugin": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz", + "integrity": "sha512-vTSY5r9HOq4sxR2BIxdIXWKI+9n3b+DoQkhKHedB3TdSxTfXUDRxKXdAj5iejR+qNXprXsxvEu9W+zOhgGIkAw==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "magic-string": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.6.tgz", + "integrity": "sha512-3a5LOMSGoCTH5rbqobC2HuDNRtE2glHZ8J7pK+QZYppyWA36yuNpsX994rIY2nCuyP7CZYy7lQq/X2jygiZ89g==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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 + }, + "make-fetch-happen": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.2.tgz", + "integrity": "sha512-jRqI9zjLyz8ufXfLSbEObJ6a8sv8geeKYEPFpI+b39JjYU14MZtCiJGazSWPZMjCm7161b4r57N/na5fBXpooQ==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.1.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "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 + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "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.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "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": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "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 + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ngx-countdown": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ngx-countdown/-/ngx-countdown-10.0.1.tgz", + "integrity": "sha512-4qxxm1RFV0XqVyUivtsREaHOm3wkUJQ0Q150aJPq+Cbe6W9OVaTaNWu/BlPHvPYTJ3SainUEoS8Owb55p8Sanw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "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-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.7.tgz", + "integrity": "sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.0.tgz", + "integrity": "sha512-JgqZHCEUKvhX7EehLNdySiuB227a0QYra9wpZOkW+jvwsRYKkce7y5Rv2axkxScJU1EP+L32jT2PLhQz7IWHlw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.0.tgz", + "integrity": "sha512-XXqrT4WXVc8M1cdL7LCOUflEdyvCu9lKmM5j5mFwXAK8hUMRxzClNml8ox2d8YIDhS7p51AP6zYWNsgNiWuSLQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "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", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "npm-pick-manifest": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", + "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz", + "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==", + "dev": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^8.0.2", + "minipass": "^3.0.0", + "minipass-fetch": "^1.1.2", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "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" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "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" + } + }, + "open": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", + "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "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 + }, + "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 + }, + "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" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "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 + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.0.tgz", + "integrity": "sha512-JcMmHiK6h6rcncj2HLayiyJZg28iJXJafXcmEGw2NjKH3WE8ZgSwyMZs7+f+aliPD57PDhB31IEgUtLXp0YZxA==", + "dev": true, + "requires": { + "@npmcli/installed-package-contents": "^1.0.5", + "cacache": "^15.0.0", + "chownr": "^1.1.4", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.0", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "semver": "^7.1.3", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "which": "^2.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "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 + }, + "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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "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" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + } + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protractor": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", + "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "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 + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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 + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "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==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", + "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "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" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", + "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "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" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.31.1.tgz", + "integrity": "sha512-2JREN1YdrS/kpPzEd33ZjtuNbOuBC3ePfuZBdKEybvqcEcszW1ckyVqzcEiEe0nE8sqHK+pbJg+PsAgRJ8+1dg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.1.tgz", + "integrity": "sha512-DWtzW0jDu+96MYkEdM8vUigjpisvM9qSlDwNvTFcr+XC7o2+3aXSAbHNcJ+8HzD1857uW9Opbxgu39esytVUKA==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "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-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "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" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "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": { + "shebang-regex": "^1.0.0" + } + }, + "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 + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "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" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "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" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "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" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "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": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "dev": true, + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + } + } + }, + "terser": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", + "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "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 + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "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" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "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.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "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 + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.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" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "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": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.41.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", + "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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 + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "webpack-subresource-integrity": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.0.tgz", + "integrity": "sha512-GB1kB/LwAWC3CxwcedGhMkxGpNZxSheCe1q+KJP1bakuieAdX/rGHEcf5zsEzhKXpqsGqokgsDoD9dIkr61VDQ==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.2.tgz", + "integrity": "sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg==" + } + } +} diff --git a/Raj_Bhushan/jump_angular/package.json b/Raj_Bhushan/jump_angular/package.json new file mode 100644 index 0000000..1465f64 --- /dev/null +++ b/Raj_Bhushan/jump_angular/package.json @@ -0,0 +1,52 @@ +{ + "name": "flex-tutorial", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve --port 4300", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~9.0.4", + "@angular/cdk": "^9.1.0", + "@angular/common": "~9.0.4", + "@angular/compiler": "~9.0.4", + "@angular/core": "~9.0.4", + "@angular/flex-layout": "^9.0.0-beta.29", + "@angular/forms": "~9.0.4", + "@angular/material": "^9.1.0", + "@angular/platform-browser": "~9.0.4", + "@angular/platform-browser-dynamic": "~9.0.4", + "@angular/router": "~9.0.4", + "@material/snackbar": "^8.0.0", + "ngx-countdown": "^10.0.1", + "rxjs": "~6.5.4", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.901.0-next.1", + "@angular/cli": "~9.1.0-next.1", + "@angular/compiler-cli": "~9.0.4", + "@angular/language-service": "~9.0.4", + "@types/node": "^12.11.1", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "codelyzer": "^5.1.2", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.7.5" + } +} diff --git a/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts b/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts new file mode 100644 index 0000000..b83604a --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Routes, RouterModule } from '@angular/router'; +import { LoginComponent } from './auth/login/login.component'; +import { RegisterComponent } from './auth/register/register.component'; +import { EventListComponent } from './event/event-list/event-list.component'; +import { AuthGuard } from './core/security/auth.guard'; + + +const router: Routes = [ + { + path: 'login', + component: LoginComponent + }, + { + path: 'Register', + component: RegisterComponent + }, +// { +// path: 'event/:id', +// component: QueueComponent, +// canActivate: [AuthGuard] +// }, + { + path: 'event-list', + component: EventListComponent, + canActivate: [AuthGuard] + }, + + { + path: '**' , redirectTo: 'login' , pathMatch: 'full' +} +]; + + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + RouterModule.forRoot(router) + ], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/Raj_Bhushan/jump_angular/src/app/app.component.css b/Raj_Bhushan/jump_angular/src/app/app.component.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app.component.css @@ -0,0 +1 @@ + diff --git a/Raj_Bhushan/jump_angular/src/app/app.component.html b/Raj_Bhushan/jump_angular/src/app/app.component.html new file mode 100644 index 0000000..1e15754 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app.component.html @@ -0,0 +1,2 @@ + + diff --git a/Raj_Bhushan/jump_angular/src/app/app.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/app.component.spec.ts new file mode 100644 index 0000000..2ee777f --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app.component.spec.ts @@ -0,0 +1,31 @@ +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'flex-tutorial'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('flex-tutorial'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('flex-tutorial app is running!'); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/app.component.ts b/Raj_Bhushan/jump_angular/src/app/app.component.ts new file mode 100644 index 0000000..9a0a488 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { MediaObserver, MediaChange } from '@angular/flex-layout'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent implements OnInit{ + constructor() { + + } + ngOnInit() {} +} diff --git a/Raj_Bhushan/jump_angular/src/app/app.module.ts b/Raj_Bhushan/jump_angular/src/app/app.module.ts new file mode 100644 index 0000000..097756e --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/app.module.ts @@ -0,0 +1,42 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgModule } from '@angular/core'; + import {FormsModule} from '@angular/forms'; +import { CountdownModule } from 'ngx-countdown'; +import {ReactiveFormsModule} from '@angular/forms'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { AppComponent } from './app.component'; +import { HeaderComponent } from './header/header.component'; +import { AppRoutingModule } from './app-routing.module'; +import { LoginComponent } from './auth/login/login.component'; +import { RegisterComponent } from './auth/register/register.component'; +import { EventListComponent } from './event/event-list/event-list.component'; +import { QueueComponent } from './event/queue/queue.component'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { QueueService } from './event/queue/services/queue.service'; +import { CoreModule } from './core/core.module'; + +@NgModule({ + declarations: [ + AppComponent, + HeaderComponent, + LoginComponent, + RegisterComponent, + EventListComponent, + QueueComponent + ], + imports: [ + BrowserModule, + FormsModule, + ReactiveFormsModule, + BrowserAnimationsModule, + FlexLayoutModule, + AppRoutingModule, + HttpClientModule, + CountdownModule, + CoreModule + ], + providers: [HttpClient, QueueService], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css new file mode 100644 index 0000000..bb3ebec --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css @@ -0,0 +1,12 @@ +.my-form{ + min-width: 300px; + max-width: 100%; + width: 100%; + font-size: 20px; + /* font-weight: 400; */ +} + +.full-width { + width: 100%; + /* display:block; */ +} diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.html b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.html new file mode 100644 index 0000000..30a7835 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.html @@ -0,0 +1,28 @@ + + LOGIN + + + +
+ + Email + + Email is required + Email is not valid + + + Password + + Password is required + Password must be of length 6 or more + + + + + +
+
+
\ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.spec.ts new file mode 100644 index 0000000..d6d85a8 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts new file mode 100644 index 0000000..c69d009 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { MatSnackBar} from '@angular/material/snack-bar'; +import { AuthService } from 'src/app/core/security/auth.service'; +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'] +}) +export class LoginComponent implements OnInit { + + constructor(private route: Router, private snackbar: MatSnackBar, + private authService: AuthService) { } + + ngOnInit(): void { + + } + + loginUser(values: any) + { + if (true) + { + this.snackbar.open('Login success', 'Success', { + duration: 3000, + } + ); + + this.authService.sendToken(values.email); + this.route.navigate(['event-list']); + } else + { + this.snackbar.open('Failed to login', 'Error', { + duration: 3000, + panelClass: ['mat-toolbar', 'mat-warn']} + ); + } + } +} diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css new file mode 100644 index 0000000..2af62a0 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css @@ -0,0 +1,11 @@ +.my-form{ + min-width: 300px; + max-width: 100%; + width: 100%; + font-size: 20px; + /* font-weight: 400; */ + } + + .full-width { + width: 100%; + } diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html new file mode 100644 index 0000000..4f073bf --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html @@ -0,0 +1,62 @@ + + Register + + + +
+ + + + Username + + Email is required + Email is not valid + + + Password + + Password is required + Password must be of length 6 or more + + + Name + + Name is required + + + + Phone Number + + Phone is required + Phone number must be of 10 digit + +
+
+
+    Accept Terms And conditions + +
+
+
+
+
+    I want to receive notifications + +
+
+
+
+ + + + + + + +
+
+
\ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.spec.ts new file mode 100644 index 0000000..6c19551 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts new file mode 100644 index 0000000..f39802a --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.css'] +}) +export class RegisterComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } +registerUser(values) +{ + console.log(values); +} +} diff --git a/Raj_Bhushan/jump_angular/src/app/core/core.module.ts b/Raj_Bhushan/jump_angular/src/app/core/core.module.ts new file mode 100644 index 0000000..d6eac26 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/core.module.ts @@ -0,0 +1,35 @@ +import {NgModule} from '@angular/core'; + +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatButtonModule } from '@angular/material/button'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatCardModule } from '@angular/material/card'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatListModule } from '@angular/material/list'; +import {MatCheckboxModule} from '@angular/material/checkbox'; +import {MatSnackBarModule} from '@angular/material/snack-bar'; + +const MaterialComponents = [ + MatRippleModule, + MatFormFieldModule, + MatInputModule, + MatSidenavModule, + MatCardModule, + MatListModule, + MatCheckboxModule, + MatSnackBarModule, + MatToolbarModule, + MatIconModule, + MatMenuModule, + MatButtonModule, +]; + +@NgModule({ + imports: [], + exports: [MaterialComponents] +}) +export class CoreModule { } \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/core/model/event.ts b/Raj_Bhushan/jump_angular/src/app/core/model/event.ts new file mode 100644 index 0000000..4d35026 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/model/event.ts @@ -0,0 +1,8 @@ +export interface Event{ + id: number; + eventName: string; + currentlyAttended: string; + joined: boolean; + estimateTime?: number; + myNumber?: string; +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.spec.ts b/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.spec.ts new file mode 100644 index 0000000..68889d2 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthGuard } from './auth.guard'; + +describe('AuthGuard', () => { + let guard: AuthGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(AuthGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.ts b/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.ts new file mode 100644 index 0000000..398c0dd --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/security/auth.guard.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { AuthService } from './auth.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate { + + constructor(private route: Router, private authService: AuthService) {} + canActivate( + next: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable | Promise | boolean { + if (this.authService.isLoggedIn()) { + return true; + } else { + this.route.navigate(['login']); + return false; + } + } +} diff --git a/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.spec.ts b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.spec.ts new file mode 100644 index 0000000..f1251ca --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts new file mode 100644 index 0000000..8682a13 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + + constructor(private route: Router) { } + sendToken(token: string) { + localStorage.setItem('LoggedInUser', token); + } + getToken() { + return localStorage.getItem('LoggedInUser'); + } + isLoggedIn() { + return this.getToken() !== null; + } + logout() { + localStorage.removeItem('LoggedInUser'); + this.route.navigate(['login']); + } + +} diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css new file mode 100644 index 0000000..1728fca --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css @@ -0,0 +1,7 @@ +.nav +{ + font-weight: bold; +} +.mat-list-item { + color: #3F51B5 !important; /* Note: You could also use a custom theme */ + } \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html new file mode 100644 index 0000000..c082f15 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html @@ -0,0 +1,21 @@ + + + + + {{event.eventName}} + + + + + + + + + + \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.spec.ts new file mode 100644 index 0000000..5368c6b --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventListComponent } from './event-list.component'; + +describe('EventListComponent', () => { + let component: EventListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EventListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EventListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts new file mode 100644 index 0000000..4868fed --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts @@ -0,0 +1,27 @@ +import { Component, OnInit } from '@angular/core'; +import { QueueService } from '../queue/services/queue.service'; +import {Event} from '../../core/model/event'; +@Component({ + selector: 'app-event-list', + templateUrl: './event-list.component.html', + styleUrls: ['./event-list.component.css'] +}) +export class EventListComponent implements OnInit { + + selectedEventId : any; + // id: any; + allEvents: Event[] = []; + constructor(private queueService: QueueService) { + + } + ngOnInit() { + this.queueService.getAllEvents().subscribe(data=>{ + this.allEvents = data['events']; + }); + } + selectEvent(id: Event) + { + this.selectedEventId = id; + return true; + } +} diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css new file mode 100644 index 0000000..35689a7 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css @@ -0,0 +1,43 @@ +.event-page{ + background-color: #b7bbbd; + } + .my-card{ + margin: 10px; + margin-bottom: 5px; + border-radius: 2%; + } + .header-image{ + width: 100%; + } + .title{ + font-weight: bold; + font-size: x-large; + text-align: center; + } + .content{ + + text-align: center; + } + .my-btn{ + text-align: center; + } + .count{ + font-weight: bolder; + font-size: 75px; + } + .btn-wrapper{ + margin: 10px; + + } + ::ng-deep .success { + font-weight: bold; + color: blue; + background-color: rgb(10, 241, 10); + } + ::ng-deep .leave { + font-weight: bold; + font-size: x-large; + + color: black; + background-color: red; + } \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html new file mode 100644 index 0000000..9fb5072 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html @@ -0,0 +1,36 @@ +
+
+ + + Your Number + +
{{event.myNumber}}
+
+

Currently estimate time: + +

+
+
+ +
+ + Currently Being Attended + +
{{event.currentlyAttended}}
+
+ + + + +
+
+ +
+ +
+ + The queue is not active try again later. + +
\ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.spec.ts new file mode 100644 index 0000000..aad43d9 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QueueComponent } from './queue.component'; + +describe('QueueComponent', () => { + let component: QueueComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ QueueComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QueueComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts new file mode 100644 index 0000000..bf47bc3 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts @@ -0,0 +1,63 @@ +import { Component, OnInit ,Input, OnChanges, SimpleChanges} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { QueueService } from './services/queue.service'; +import {Event} from '../../core/model/event'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-queue', + templateUrl: './queue.component.html', + styleUrls: ['./queue.component.css'] +}) +export class QueueComponent implements OnInit ,OnChanges{ + + constructor(private queueService: QueueService, private route: ActivatedRoute, private snackbar: MatSnackBar ) { } + ngOnChanges(changes: SimpleChanges): void { + this.getEventDetails(); } + + @Input() id: any; + // id: any; + event: Event = null; + ngOnInit(): void { + // this.route.params.subscribe( + // params => { + // this.id = params['id']; + + // this.getEventDetails(); + // } + // ); + + console.log(this.event); + } + + getEventDetails(){ + this.queueService.getAllEvents().subscribe(data=> { + for (let event of data['events']) + { + if(event.id === this.id) + { + this.event = event; + } + } + }) + } + onJoinQueue(eventId){ + this.queueService.joinQueue(eventId).subscribe(data => { + this.event.joined = true ; + this.snackbar.open('Succefully joined the queue ' + this.event.myNumber, '',{ + duration: 3000, + panelClass: ['success'] + }); + }); + } + onLeaveQueue(eventId){ + this.queueService.leaveQueue(eventId).subscribe(data => { + this.event.joined = false ; + this.snackbar.open('Leave the event', '', { + duration: 3000, + panelClass: ['leave'] + }); + }); + } + +} diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.spec.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.spec.ts new file mode 100644 index 0000000..b3af28c --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { QueueService } from './queue.service'; + +describe('QueueService', () => { + let service: QueueService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(QueueService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts new file mode 100644 index 0000000..0a77f4f --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts @@ -0,0 +1,32 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Event } from '../../../core/model/event'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class QueueService { +private allEvents: Event[]; +// constructor(private http: HttpClient) { this.fetchEvents(); } +// fetchEvents(){{ +// this.http.get('./assets/event.json').subscribe(data => this.allEvents = data['events']); +// }} +// getAllEvents(): Event[]{ +// return Observable.create(observer => +// observer.next(this.allEvents); +// observer.complete(); +// ); +// } + + constructor( private http: HttpClient){} + getAllEvents(): Observable { + return this.http.get('./assets/event.json'); + } + leaveQueue(eventId: any): Observable { + return this.http.get('./assets/event.json'); //change link when connected to backend + } + joinQueue(eventId: any): Observable { + return this.http.get('./assets/event.json'); //change link when connected to backend + } +} diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.css b/Raj_Bhushan/jump_angular/src/app/header/header.component.css new file mode 100644 index 0000000..0aa973a --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.css @@ -0,0 +1,12 @@ +.sticky { + padding: 0px; + position: fixed; + width: 100%; + top: 0px; + z-index: 10; +} + +.logo { + padding: 0px 5px; + font-size: 20px; +} diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.html b/Raj_Bhushan/jump_angular/src/app/header/header.component.html new file mode 100644 index 0000000..ca23541 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.html @@ -0,0 +1,21 @@ + + +
+ +
+
+ +
+
+ + + + + + +
\ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.spec.ts b/Raj_Bhushan/jump_angular/src/app/header/header.component.spec.ts new file mode 100644 index 0000000..2d0479d --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeaderComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.ts b/Raj_Bhushan/jump_angular/src/app/header/header.component.ts new file mode 100644 index 0000000..ea6a3a7 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.ts @@ -0,0 +1,17 @@ +import { Component, Input } from "@angular/core"; +import { Router } from '@angular/router'; +import { AuthService } from '../core/security/auth.service'; + +@Component({ + selector: "app-header", + templateUrl: "./header.component.html", + styleUrls: ["./header.component.css"] +}) +export class HeaderComponent { + constructor(public authService: AuthService, private route: Router){} + logout() + { + this.authService.logout(); + this.route.navigate(['login']); + } +} diff --git a/Raj_Bhushan/jump_angular/src/assets/.gitkeep b/Raj_Bhushan/jump_angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Raj_Bhushan/jump_angular/src/assets/event.json b/Raj_Bhushan/jump_angular/src/assets/event.json new file mode 100644 index 0000000..cebf637 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/assets/event.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "id": "001", + "eventName": "Butter Cup", + "currentlyAttended": "Q0001", + "joined": false, + "estimateTime":3600, + "myNumber": "Q0023" + }, + { + "id": "002", + "eventName": "Indigo", + "currentlyAttended": "Q0005", + "joined": false, + "estimateTime":5400, + "myNumber": "Q0015" + }, + { + "id": "003", + "eventName": "Fallas of Valencia", + "currentlyAttended": "Q0021", + "joined": false, + "estimateTime":4000, + "myNumber": "Q0044" + }, + { + "id": "004", + "eventName": "Saint John's Eve", + "currentlyAttended": "Q0011", + "joined": false, + "estimateTime":4000, + "myNumber": "Q0037" + } + ] +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/assets/images/jumptheq.png b/Raj_Bhushan/jump_angular/src/assets/images/jumptheq.png new file mode 100644 index 0000000000000000000000000000000000000000..1c642dfa5e2ffa7d39b1b76a246dcb386a24a24e GIT binary patch literal 15841 zcmXY22RPf^+m2b3+MCvnJ=2n+Hl-Rxm7?~noz|#Tdk3*cO6{txrS=xFsn(`Os6A`1 z@8|u07s8du$#c##&N=sU-;pn1YGfo#Bp?uoO#P{{4hV$f3H;qjgbO?#$D;j#UxXIV z)RaLtw_l%|ixPonh+Ut)eg^{G>$?5HNfx-r3_N+~z4~*NJBx(WWRJFrORC>oXXo9wLgK}rL-aZmsoM}k84`!w1C)cuWgPVbGmlO6voPw%XKnRoC%6WLyD#_|;X}Lc)XfUn#ZC?AMv7zK#clfZWF{{Tc zCb0D^6Zozb!d||enr3|~972+Fr1e!ct$is(Djw^ZfG} z3S~TQq202y&slG)bzU+CA2%;QvMl5J9(yt6`(lwn+^ZGsjr1%_F?ZPD+PXIXq3Oy$ zbkY&+l1)#_6!$e`J1ewqFLub6tKjGS z)z_W^5bTU_b>NE}u{g8$`J4^WJDll+WfxDw8GcG&h*TRic_F#>FOE-1c-Tr1ZS+jv zk~ii_7GZ7%n@iPs1*-S{^7S;3Q#1J{{LNTT^0QM+Or=eGRLyJi3*X{ZOfC>1a$T0! zDL8oJ=XbB42-beX7Oezt`)u|;H&q>;n+Cy31ckm|5*$p#KyP~6rde!eDvrLLb=CUC zqoElKr{rhnBUxf6luFWRZq8L#*{DqHn&~K+1?i@SbK~Ggwz`@aIeC^J*-*8VBa*Z= zm@67lg9mN(_?KJOUp5ymV~M$XcaLj-5veMDU(85104Lb*2>G}5YiTK&(aTj}`S~1eDu z=?9q)hxpV)h_(H09=`r-O%4bLSx;BH7!fkX;*NF9iR|)bxPe{e`r!N5nrx5*_4`&@ zxL;#61?L8RCLXDp+|+*6vu-h|=Wa2GxjUx%xc4(>+Qe@R(T_FacM`pmE+TkSY?MTZ zFYZk}28FIe;7F;*`%0qgqE=r<7CZvFelBVSqnNvhQp($Kx$WxONX*5hnO^iK^RoV4Lb;FmwrmGeH=Sv;*OupACMtrlQ>a2@Y zcj*|;7oummha|f26@xR=gGTM=!+TZ1{4ulaJUW!lTDju{D}Qa=J9`X{gD1dfRK3HY+Uf| zgS$M8S!A)q6c}S`9!jQPzTe4pe%Vu}r{nr$KI#=MCRptlb`^pc1cXVGvnk?L-w72< zFL@RT1s(;e^Oi}EL5V7sT&nlHpU*}zHGZVgVxnboD;?aAsQB}nLNEOs%~Q5RWtpU| z`Xq=rkO^53tQw^9L;rrMLZLzwZRbOYP({vkD?5)mX1QRywEzg!fYlHo_p4~aqx3_C zMe;{Ev>Xxm(pzg%L9&|T&E8;_(M{{@}yQ(kNV$Kd?8lTLnqd`@N8c?3{5%k%r3;Gj>RgHRER_|Gwsqk|(}NNRa;WFjveg{5Z3BNF(M zrnm_w_#dCyBRNTDEWYMIZ4D=QBnstfuZ|DTHE4K?iCkBO9f&2ZV$`>k*7X=k;2cs3 zkCD`#3HvnAKoczX=fnvMRP6EZXlkgo;G2iQ7_nsE*}*7M9zv+t6^1YVshb-Da8zQl1z>W4`*sjSa^0=3AXIEgLoi^On^{64QR)Kff)k9E{F7+e&vhT_CN%d?5yqwh`%DR?oUC=mcF`cI z$)wj5VdZq<`JC_$XB}}_9#6%*7*wU%y^$1Meh#n>{2?v2>pLfS_9qY|98<*nn8?}; zJsjxhtUUsV7Zq3?U$%x@I@f=ZBrgKz&=mJZCcY)q;)CPPVbn9)bpb=bjKH5l!C*wB znS`Ub9w8egql`5slA9SSW{p*LE2{a=(ZT5h5h$woc4}n>KSPKrEi~{6wo6CZ8aq)&1`WiA zs{3dWLy=Sl=NR=ElvPSO2b{xz{WCdKJ5OvM$d{teVJIC;3epI^Z?*SQ4R(-*B7r9u zJl3f#3q$cLy(EKHVL8C{BVRbc_Jmr1<0O>Q#o@R(@C4hveD)%mgEWZM-meH0mQh9z zNgep%3tLf$)t;s>oQm)$8A;6-Tm&SVAu@4xhKsZ4C8B=>oNmQ-n{&q(xo%%Ey&_CK z{q29b;kjkwF<0WDFL{LG6Yr=j=VOSwFnql#%YcKpgNyh9qZ=}i)Lhh1^{Lv&a9n*1 zU-wH@N~pHD7vQ6KVD%zUIyrVI4mkW>bh8>Pi8RYT7DZ(CngB`}g@zIc#rG{O(Ln<# zph$7AuWVpNLMkZ5NcUtxjbu=;&qKxmUTu`MuSm0 zt#&A;+d02ff#K52;9w#zDw2a{0$1e~F7 zO%;sdRapko=QZIlkl9JOZc!NZW1{~1rVp`6_f(dD#V4-jx)qm;6U)QIzW`%uPuAMp z#&RMrR8@`AA-*KGr%-X7$17Z?Va_#N!d zQS_3RsVD*^s)dXbYF34XkY?qd$c?q7M9Kvh!LZ*=X%J(PDC})c$Vw<`D*kX9VGtF4Dsu2)z`pyXAl-*bZ5IEvouFam`Ph({pi-)a39;s0~4 z;@{XLKBgjiXfNP*&LS*5;+Z~LSs4abqmt)@bNt5YD#GGlVwDYf3xfXNXB@yVO0d5F zBFQu9&QE>g%UrieRahURjJmA4+B3uWL`Y#_2x?Yp%Z(kpa_g+fU8llqp=El6F0e8{ zEu~8n{G1c=-*}JVIz-3$@X@;O|I(;TAuvX0fzqfHEtV!V8##G9U-eklm+{p0tdUIc zAS_!^Emf+v5{zprKMG~#QRjihKaZzgIR}E8ixzsOvJ8aS`PZ0mOeC8)6OwxSq151i z-VHJA4dwX_Bn>S-0>k$(3e8sr*RV`xCq@9F-;7az^7K6i7&`L`NLO>rG<;M_51S9v z8A>Qp!?`zJmuR{V%^*SAc}-3@U`EI=%4{o2C?wteM4T|J9Tbz|rzw{rB6Weg>$CHO zG;OruqeJJG(D&VlEF8_$z)y^z0BihUaGU_^Y>A%>Jeo#Sdk zo7!!jJT6Ku6O#95(KnM#In$OT9b%|HqPLB3^G=nJ>#qgoM@58WB=6wR7R2_S?V7$G1rGF$l}k zeIwXZ-}$ognjzPg_uS9fX3d2@CKJ*Gz8Vh=3ba)FC*z^41v03&AO3xFU0s_~{JX79 zq|MjESGcS2V@p}&(f#S?iqF)n@C^J<6)kHhy%dA*DI7k*705q=su>bK>b&c~#{+>& z&~&NZ1Kl(jRg9MkKFSee#U(`>>=vK=z$p_msxQkH`lGmcy0A+&C>i;0?4bR)d4-`+ z#As;nYJPvJ@+x%YTXFa3jpus2Z74qmcv$-K}gpG zc#X0DH)Hj^+F1?kIP!$Jja!fpeJ@|yS z$a667-sTert;dF^BWHeiBd=;9{I_*vz`XGV?_Rb;T*lGKm<*Buv^G(;Rv-s!*{zPu zF_UKx2J3#T5pw^p;B7E_@F7sMv;0== z&lB-rOiQD5qzrL`QX7R5Y7DA|w1~uJu1z4bU$0m-Dw51N2lMAu*s++pQ@w_iuPA|H zCa&QJjNuRB11>&HhqS~Qds=-PA^Hm?e+5OVR*vhzoCW8)=n;64pN@z7=8O*Fd8aEBak4+}8Pt$NAhh>w!`sPB6*Lqnsag@zgF4eEMnPsUH{_-sBNO zYgo}qEkK2_(!{y>;VfOFMIYJaI9200)$rzrY-?SW*p^gqDDM01_>)G7d+DOzGk+Z# z))!wUT>KS{Acv+?YKX^EhxZpy!iq{;%`;|@?3ZuIPOH|+)Rq%#d;fcey(LY^m z;6i3-x}n#T?$7zxSUH+->081P0P{T5&3X8jE0Ee#PkVejfIQ| zQxWa$)>J43&!xHD2s=!YtoLS3UlQ_)kaOqRu}l^@YLC|C_-SbDN9^j|oWJkgVBO(y zGY{$mYS#5)iT=w#1GY~q~BppDaWCJ#KgoSlPQS^NiE#%6$rH`CJnP_5Q%9y_h}H(enjp5mHSh* z@A-rxKJx|GLAm#i#U6CxD62%9?{@eV+?hYMX^#?WT1g6W#9OmiWbnScybu!ct6iPt zJTw0+EzIOOzWqS72iMuRs)9A!CL}2QpTJp9sAbSSyzN74qg|hOub=x(PDv0!R^IC# zh7SxZ{Bmm+k!ol?q?$LVTn`4A4(vbxjLc7-k+6r^+}-+V5me9rw)H<~dq#;j!oBpT2k z%PeJWEP}`WuPAQU{ruEq*YC~o$VCYyC321peNZi7VK7yDg$~rHdniTlWf3$t&uBW%v|7|$? zmA1+CXeoK!NAa_K>Zlpo*7M6}RXg`3{EaJq&Od0r@OO82S5RojCTc}&8*6Ke{q5AU za4i4)d0~>8Co}H&*uh0=eW|S-?+zJs@1sl8+~tRbz+lS@mnq}p?Suk0^BE5_sf(6x z(l!0=CjAp7wWjbtYGDi8H1{Y}_C@F?=&&|^@Co}_>H3D!rCcA|Wiux08FFK&o7W#I zjhk`Fu%bEHA`2Hh#thXPYlgip_wb{&_-D{(Z!AxneEyCW>eIXZ-&K;W)_&bE?5Wqzh@l6u1dN zQPI&wS?_EV6mUQ>OcK*PVj$P)^disg`DEsY1H;2|EC0p@sPI5@KF3n_eSB=a3-hpQn~Iua zrS`TweMIwCy9z3TP9)gYABH|EB85vIl*^q3RL|8gd+c=P1(ub^V}2(qZy zGs+B>b8$a35)}THJuUvIO2}Ei$!w=7xnDmGoGxkNT{D%tK2)bzvS0IQ zNi`x9=d;5P=OKMv&;k%=HBOt44z2#}WbVFv^@@&`)_r}PfT&xTG(ZPg}tm%}D*M08@PS?vF4*`0*}9&ui}_ zEaJ&$>OeAC>gpt7G>R^ zi3ch1H(qC%H0tXEeXjg6vMK~>)4xma_NU39!HXC~$^dzRZ(`&fC&nO`FMUE){^`uV zBMLotbN*xYktV}*a*^xhqUXgwF}IV6?!-IlIrfJh7cTb@7lI!jZ?b8O)+GcDn6V8x zG7~^^o_soZku&-l0vkU8?r(t)QgHyB&lmb*S3p1j$82*|e5bAaYbkC(P>`bSM}7TQ z@8}t~<{E!Yq1fpVo#UdfCLmm;cC!uJ$+M5FAmFi14zj{kd|dRNKewCbD^=c+7PedSvMx5s(;PGNO!8e{3A$=Ub6J@(T z@i6r!>at41)JdC&Br1=W2Jk$PCbFN~^aK*>td8V$phpT9rOAA|=+-pP;p$HR*arqHp^ zCz#@f!oZmXJn!$z746@sqFqBiOqpZ&i-;`m#}KUZgI9#8%y*)oT?iCc`+dT<7axJF7cCH7G@AIoC5JcOeN?V9#S zx}K5k_10aG<5}3;eNDpZ??MiJ{ItW`ug4dX*7Wx`(bm?sw&qSz?~v)JT6soj z(MgNarSBQu8+eD}ii|CT2fI(_gNCG7qt_~)gtZwO<+*Ee*rl?Q%g zD56?OeMTxKauwziev3yua+<{lQO8Q5E@t+_wLk&SH@ERhzUESay#H;qySE!lUmCw~ zARloJvH3MwWt;i3O8PbClWr-C`#aA^` zlX?+q<(zyrgv3ft=G)(h%7yJ0wyzaUhwWXMI>q>KUFy7^nXJyxUatWf9N!i}z z#Kgmpg19}0L&>i(8<|;Wu&P^di7F(Mmr+K61)<>hImx8w-!ggs-Dnb@|Uh}S&<1%Lo4X)Y#WvC@j z46}qk>JVeR-@&J1c7uULCNU0Y;hYyGAu*URK)rt+QXv$Z>AOq>;e zIW;yYq(fW_677-`ounEKRzg-{o(8Y&0_%u+TYcGRT_JOlE5u=Wop@&IyPm`)$cq11 zHbLC$ptKFBEZ zkOQ2Y>tjV{2>mT%5o+9+Urp%jScaD(`a|w#!5R;7FLEzl!Y(o<#7hoSTDu&Y zAXK@x>-E-d?Th-K=!236uYdV=hv85<@AbL;s7;x;Ud=vSb6L~;Xto#|^?0Z5^DlC+ z0egHOrdOX)AGq}JFtM~VWnhSqiGC8K!QUCisj)!&?*M)(@D-QvYa;{P`+QmN@7z)E z@c~o&V8vJax&t}W`O7Xvxw$-te~$5qpAJ$9!qmTpuz;IRSo)3lUW~Gv~5C^ z63)`g+dblm%*^0Ok%w^K@TYuuYQd>?qyMMtqcL+PN6Jsk)4HE@#3rrH8!@eZ@tL#@ z07Ovm=B|WN;OgBn2O<}diuC=xOFwsnkp2DV$4{1o&Hd5jn$`B7e~@x+h1Q~Y$!8C>rv^ZpU|&r6%RZX(9N?Dh&^je-#`DXyis)Ro`|RNF(4-)xgP%XnqtOp11osQ=P|Hi4 zgFPqFXy{I$OMhLZMcsUYQ^M=B<)~!2@|Y;JE#(9V#AZA3>Nm_2OFW=iztp7XH@37;y-N-F> zMHNX{&-F@k>s@%qmQf)>>Wh|7-|O++FD-u&55}F#s%a4tA&QBNBrFn5o5^5OQi=f> z;ohw6rmfJF&L0Xw-BGD)e5((GC=tkzof$_on%ExqFM*kFtzc#jUNiSH!W7G)QFf7h<0A6rrG)MT~VBg^3gsjcIv9Vq^07vHXyjGw5;^ z^YahO>&KqmLq2~DiN&AMciS85iyk3$`AY`U$A*aUm&su>{F)xSQaBM1PQ7V1wh1U+vO1^o{zb)8 z>FV9(J+zbEZ})q4zkY|8vwYwN`Z_1P0(#lp&AjWqZ6pSNY+*3bdg*QDYs-h}^*TFI zYdJj|9`)+GLa!_%RiW!^T|^BL_)K?s%c2PsAAFFF0oI*e(7yibE!4TL4HQ6y}1foERf)$1@3pF;)cd{QhfHj+&8nf zdr6Zv7|7`_M31-EUoB?S>3XT2am`M%-8qk@aND!Fq@2Q|*Q1;3e+oXgdP095Rx3@Q zATP2MGxn)aiZYBc1SO~u!LxZ<#G#&Q>j=ougSLyVly@Jm*pB7*JuoeT+WTYE=v1Di ze+7(Se*O$xA@_59ATRuch}T;qc6(8vCp~YTbfG0$?SoGgaj-OiT?VE~4OR`LjG5jC zkW_;eE>qZgi6%z~`neD|3KPOf%J4KA?bgSfSjLcVhx+y9ZL?u#K#|Mi@xvLDwA9yW ziT2LZF?^jea?dJaKfGq=^e}3y8SWNuE^(x19gC~ZGL1J7c@u>`<6o{>s^e$s!LLD$ z9MtGNJOVmlmlpJCtil5ekzov^z*^y`DmWL$Hu_zU-bvHhl7CWdV$Ap6g5l1wVC>N( zLN|P)E?`jC zyn+nrGj2aga!gPNA!Imr{A*(i0@{&+vmIQDmgmu{5|4inS*CTl@1|9(Kk;sM-FocGl40Y^fAP} zaOT*;))mrPAnzZ}VVlyhV!V96ti@>-xep~E`A+A#VqOxrDB<;-?-{eu- z?yg`|njj5s$HX}n6PdE8^8%4H!xY=a*sxP;-jERU!kgUeCCQ!}`|tvvY{N?yFV5(R z$6r~uOJaHy0TKrvCbC!OcK{>}j|z*=f$g%hj#Hp`jrG3H$kH0TCbgUnfByM{wqV6Q z&r3!bpq*GJ?sd+e_%vq`CeCIyv!G*FXW2slUm~YU;9IUf%CaMs=b}=7nz}K~5z7SD zz^EHSU_gU>>XDrMw?AdQPk`fn@8i{u`or2Jr$rw0O5wxxY4!*27&SjC_i77h-X#DU zl(|LmH@FSvb}8v8cSqzr88VKj-jI>m^&!2)y@Ear%Gv=zGwiuCBOd9|wT|J7NuulT zA6oczfy<2z`9Z-@Nl`7;Qp|lWQ2psBU0hJxuh8jk#=KOAA}`HtCl_eq(P>bfnq7Pn zqBdQ^8=vl12tebAeHp`G=vxi@Pv|&9eRZhF4H!AffWprz>f9g>zs>QT1*ypmn`5Dmb z4X8y?jTBcLc~16=m{!d5L=kSp^>bB%YaEXd<_Wi)mVA|E5YXWDqj(&)#b_}9sMVf2FPMx)L7x`nK zo$)xS%p>C^u9(7z5kL9Cp!U0KN%{9UknDm*|D4jX1a@uRK4ew^$gijw5J2nZ8zm0}uZJfRE@A1Z3;<5Iu9 z4S+;zogGy0(<^tIH|%^97Gn^4nI6$I(4#%P6q(1(?=G6gHP73wPfm){3R=yLXk8_| za6y&#RGBd-;sd{?YgV^(S(%j)KA{>obe|*j)euFR(-!^`JjSk2SUkB`X9zFP*WZ=wnV6M7; z;1!`{t!jXg=pOoxt%%oYsI7)NGSKbke(jRYL8%ka&!6mPH$Bb9^ylB6Ha2B+Y0NhG*87WPv7v)la^+ zIL{};^S+;a_&f5=tDm!op9h#zZ%V6uoZ|OF1*hV+`@r!%KT3r&%j)a#?_u97fh{R8 z;=x|mAeeBVh1wGtcywWum2uJ2(;AUC_2Y@GX-4}PWzRoI3Z>nkCGBW7UYJ;+m_D6S z@1AuJnd^@K&Y~ZhOmH-@U6%kFDei?E(9Wroz{}ux ztuJaux;~c!#PGn2fSO58ce2H8pX0KbSHB%8#45p4cL{S7?GGnv$ev3JY={R1BBV3# zMlmgizn6u3oyZ?@6U4k|`%><7YX5AdR`#LK@i@>Wa^H<_Eom5yBDyzZS>lW8*tr=d$cZ?$bTs;Z}|FzjpOI;=4d9;~cwJDZx) z*xcR18w7#8t~Zo`^r{{)s17H(Xkn8)oVhXK7jNxE%E?}z8NJgV3q^~vnc?5Rp2J4o zIrxvR}4+SQT}r&sq9f^ zimMv{sox%Dr{9bacyQL>=t-txr#Z&J0XZ$}HX5D_7l90$`bF%DaZkO;i72G7bP9yz>BTv2L;GpjKVFx(aXKR-oyFiC6rHtpq^e#p#QDn zqHZbDhFc-jRH%NB{Xil_>6aFF*vQ z{o%^Af-%W0m`*%Tx!+V+zCY&j=<+bRTe|P0d;EOTF)YVV`VG{&%e>Q@@J+enHGFE- z!PbA{UnbY97(1peL8immsC4=|=uhvbc6mgs z?tDZ32h;m@qUE_e2jMLiF(ME`x_7z6WFDE6I7^S$L1w4?i5|!WyAxK4>VL>gm}c$R z9U#4Kwm-=2hoblKEei<_Q06#HngON!=AU|&DVVm3|Ebzlg2;9$vp)2G@qcr-(!}70 z-);=JRl$XV1M<&~jUQsbHR%>AVl2@S*PpKuKsZZ-$ZWQ{`X$$r0g4s)rFOa*N^Nts z{LkbQ3Af6!ayd5VpG-GSar7NJ(-jCqZxik&D(2oYx>J&S$o{ntWPBK z&6XQwW8k!J9#JHJapkCDgpaZQDNXFdl^n{p>7%k{WGhwl)!I<{SY{mek$3#rXKZ8ED zPt88NB%>yfya_7;`mV1KwId5%*k!XBDt&q>`yZ1A`*&I60NHtt0DV1l4bHuvK0*9r*hreiI9p{>dT_@Q=BQ<^|s$tzDHk7CK z4k}z7gvXAyeh}mZ@!m38R#uvhX4PiTKhhb10}kGaA5<&WDn5O9^n5D4T^{$9B)bzS z0UkR$S<`A2cc%Z;9k;s(Cb*&rO3XLeURrUi>6x3t@x=+sNGEA?0gooy3Rny z40^n{!ua=kp$1jA;BNb2Fn`m;d#QQ%Dodli%-5y4SU|VH4pkw}Cj<%7g8{v!gQ&;( zxo#|bhPo4{6%(nXjcdI~QHzh4Xwk4#PA3-8A2^5{1sS-}QE0H?W?#b!i({ z{i_=5tHCEvg|CNmClj|d{cImRwGjx*G#Hj4tqXphW-wf;1Q-@xSJ$^-&-#ER$DTD1 zxIf6`L?W6}WDuksZI2u)CM%n(KUnLI5Gm8ke-9zY!^wjdByRuyAwL2Nc-lqfd5=M; z%nT(}Yo3NZ)+tIV+7=-iU+ySQ%1I&GF-n?OCM1bFYBMSBLi`HKI7*XSnC9O` z#6W0CVYJWC_(J!-ARcJwN$D_w+6g^rvaa)ujK}DzLJ%>ctU`8Z!Je_Or6-BUpE_Q` zOM}JDJj$*OxIX_0pyx^^{uWUdiX@5-ffmbfn$ty!HY%Y5RB}zBMm=d?c$nzQW9InK zY*d4*e5Na140prRmpK@tfqjs{GU>a}ps6$-k6;I|PijKZM$w1W<0Z0i1NuOqS5BrS zWR1;rOL$soN0cDpWq8rApZ<@A$roC{0q+Qcnu*ND2vKzyT04m>^z%U%mGnzc%8MF~ zLiwB;ffeus(+70g)=hSizR;DC`EBQ{$1g<{ug?#vvuj_%Ia(GPQW9fx-GFt^9;r*S zlD`A*Pz6gBz~CZ{}d?QQ&F=oMf|*AfK5d27}+u^3o39ghJ_oZ)pm30w$x^>IEC*X^X%> z)FQS9SNprclI_B-9p|~kauOavu=)CM9w4IXhk&y zl_n17=yLD=jY%`G3rUHs^x!9e2BOjf1q-p|I-qf%)e7+aNn&Qg&077N^?DaK0m66D zjB`JazTYOXlhSRi5nL)FhAy%V2w;^BZ1TcTpg4S=e>?s*5^ULXLh4+tbWCV=H@0=Y*IK%NP72x`@!8P!oK9Ju$}V=bV*uENOG zCZV1mDcv&Ub3>zm9%{{h_Wu07PYUh*94mPLt`}F@#VRpdMGqevI3S+`EQ3{4gdvGC z;TJ^}zV-eySsBk;w|sUttEqv*X<<2%p$vBfpnEgjzgn=Z(pVmJef={2#Y;x6f;j6x zcqSvG87WK-<{C5z2@#c`_W+n8ILIU5v7${ltnb3GJR|NTOjR0#0(D{3(M^1AZ)U?e zDxDU&gjHatM*A>*t|!=#vxv_DsQ6GTd`odChWK*L#fY8>&>gs)$|}IPZmIGzyiBS1 z*bqXCr#n=Vvt@uDC9&j;f2?*%9PlJ3d`XU=Jf6Bc1O&)AK;+9hQE2UQEdYSCsU1O5 z2LMdynmk}z(N)Y#YS(3i=4b_iF_Fys$xl&#F~k5#+So8{K!J-5jFyi;@uoPl+%9vi z^E6P^ih}@bN25(1fKam7k>o1`aEs5hP%*bJ&$&2WVnga1HFawMTR%9oQ)jMB)KJ;UaJ(B0dpd zWAeS=ta*Q{3`o(Xl2~_8f&rx0T9ghQF`c{U$mApWgj@K*>9Md z;TYv0Mo(dnI267DOLaE;rutbZUm}1LFodS#l znPas_qY^X&)E{eXh|%Lnd032VurVhXu)GmeDK-Bk2!+`tSE`OeM{=|Sygj@ZN-(A< zbiE1;1hCYBbxj?~cN~>k2sP5VbIbYXhbKJ8>4?=`A+ zUGq5t6~UiF{QoiuPyuO{h5iUIHEDS~U|)~I5X+a@v0N|syu7947g&u-?a@Jd1>fxR z17rE-Xb;?K39Q@zofB8pdn;mooH+a`?shjt-%D_M(>n#}ZJR{4fB+s{`=>8*cSh zAOwD1?@^l)mTPdKI12Sr!i!{C1&&qjTS%YA^o}dvnyS#uEvvH3m2&UJQo|By77!%z zfH(yR+S3SPex|<<0YC^%&(vevtg;M{>-lErRD*s4{T$AAr(8Rh6+-B}trFnwP^<%q ztuQnJa9YJ%jR_!yNQgi^Wt3S~fVK3U8Y#x#s#U1q8~{~S5f;ISWWy>0f{YMU5@1rH zu&MPW*@FjJfXsk2%ZqEWB-bqisaqY59_4JIuqD)L$H$h$v=WDdfiZq*u&emiuowLT z<_oN-ERg5G80Y-UF5)@J$0QoJ%9&doL}*xb7BfN-P__K;HTCsex231WZBqbDq?|1x z5{(8FNEZLk;3)$wS1G$&E(kyVhqPIl}*hFuO5(*F*oRI;` z@kco!7l@48dW7??>EmB?lse!kV9u#2fIMw=M*NyC&VKo;9qJWU8FMQ`!hiBIC<<+_ z0*e%4`U^}2i3eHG9+mpQrg}f_IiMW*{KJlA*iju2S=<`(EQcLR!r}Q;65e5yM)#jm zL;!x!bh{T^uNvCD2fBF)1&Kcal>{8bRy%vb!C*S#V_<4c6ijW3xhB?o zG~w!AVI=v6w=$ltxP73c_9p1wqWK?n|C6HusbvpPf^W5GI*tF?Mi*C?Z!jvQUPs_* iO%;d&FrRQ!ZCD3;I7O+C&)u literal 0 HcmV?d00001 diff --git a/Raj_Bhushan/jump_angular/src/environments/environment.prod.ts b/Raj_Bhushan/jump_angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Raj_Bhushan/jump_angular/src/environments/environment.ts b/Raj_Bhushan/jump_angular/src/environments/environment.ts new file mode 100644 index 0000000..7b4f817 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/Raj_Bhushan/jump_angular/src/favicon.ico b/Raj_Bhushan/jump_angular/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + Jump The Queue + + + + + + + + + + diff --git a/Raj_Bhushan/jump_angular/src/main.ts b/Raj_Bhushan/jump_angular/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/Raj_Bhushan/jump_angular/src/polyfills.ts b/Raj_Bhushan/jump_angular/src/polyfills.ts new file mode 100644 index 0000000..aa665d6 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Raj_Bhushan/jump_angular/src/styles.css b/Raj_Bhushan/jump_angular/src/styles.css new file mode 100644 index 0000000..7e7239a --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/styles.css @@ -0,0 +1,4 @@ +/* You can add global styles to this file, and also import other style files */ + +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } diff --git a/Raj_Bhushan/jump_angular/src/test.ts b/Raj_Bhushan/jump_angular/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Raj_Bhushan/jump_angular/tsconfig.app.json b/Raj_Bhushan/jump_angular/tsconfig.app.json new file mode 100644 index 0000000..df4d05e --- /dev/null +++ b/Raj_Bhushan/jump_angular/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/Raj_Bhushan/jump_angular/tsconfig.json b/Raj_Bhushan/jump_angular/tsconfig.json new file mode 100644 index 0000000..30956ae --- /dev/null +++ b/Raj_Bhushan/jump_angular/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/Raj_Bhushan/jump_angular/tsconfig.spec.json b/Raj_Bhushan/jump_angular/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/Raj_Bhushan/jump_angular/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/Raj_Bhushan/jump_angular/tslint.json b/Raj_Bhushan/jump_angular/tslint.json new file mode 100644 index 0000000..c8d70f1 --- /dev/null +++ b/Raj_Bhushan/jump_angular/tslint.json @@ -0,0 +1,91 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file From f73fc1c9a24948b4f87ef3f56610d5d0fcd86219 Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Thu, 3 Dec 2020 20:25:36 +0530 Subject: [PATCH 2/8] Join_Leave_Queue --- Raj_Bhushan/jump_angular/README.md | 28 +--- .../src/app/app-routing.module.ts | 6 - .../jump_angular/src/app/app.component.ts | 3 +- .../jump_angular/src/app/app.module.ts | 2 +- .../src/app/auth/login/login.component.css | 2 - .../src/app/auth/login/login.component.ts | 46 +++--- .../app/auth/register/register.component.css | 5 + .../app/auth/register/register.component.html | 6 +- .../app/auth/register/register.component.ts | 35 +++- .../jump_angular/src/app/core/model/shared.ts | 63 ++++++++ .../src/app/core/security/auth.service.ts | 35 +++- .../event/event-list/event-list.component.css | 17 +- .../event-list/event-list.component.html | 13 +- .../event/event-list/event-list.component.ts | 33 ++-- .../src/app/event/queue/queue.component.css | 16 +- .../src/app/event/queue/queue.component.html | 20 ++- .../src/app/event/queue/queue.component.ts | 153 ++++++++++++------ .../app/event/queue/services/queue.service.ts | 43 +++-- .../src/app/header/header.component.html | 1 - .../src/app/header/header.component.ts | 16 +- .../jump_angular/src/assets/event.json | 16 ++ .../src/environments/environment.ts | 5 +- 22 files changed, 395 insertions(+), 169 deletions(-) create mode 100644 Raj_Bhushan/jump_angular/src/app/core/model/shared.ts diff --git a/Raj_Bhushan/jump_angular/README.md b/Raj_Bhushan/jump_angular/README.md index 48448d3..8b3cead 100644 --- a/Raj_Bhushan/jump_angular/README.md +++ b/Raj_Bhushan/jump_angular/README.md @@ -1,27 +1 @@ -# FlexTutorial - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.0. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). +JUMP THE QUEUE \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts b/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts index b83604a..2abff26 100644 --- a/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts +++ b/Raj_Bhushan/jump_angular/src/app/app-routing.module.ts @@ -16,17 +16,11 @@ const router: Routes = [ path: 'Register', component: RegisterComponent }, -// { -// path: 'event/:id', -// component: QueueComponent, -// canActivate: [AuthGuard] -// }, { path: 'event-list', component: EventListComponent, canActivate: [AuthGuard] }, - { path: '**' , redirectTo: 'login' , pathMatch: 'full' } diff --git a/Raj_Bhushan/jump_angular/src/app/app.component.ts b/Raj_Bhushan/jump_angular/src/app/app.component.ts index 9a0a488..dafc4e7 100644 --- a/Raj_Bhushan/jump_angular/src/app/app.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/app.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; -import { MediaObserver, MediaChange } from '@angular/flex-layout'; -import { Subscription } from 'rxjs'; + @Component({ selector: 'app-root', diff --git a/Raj_Bhushan/jump_angular/src/app/app.module.ts b/Raj_Bhushan/jump_angular/src/app/app.module.ts index 097756e..61a70b7 100644 --- a/Raj_Bhushan/jump_angular/src/app/app.module.ts +++ b/Raj_Bhushan/jump_angular/src/app/app.module.ts @@ -1,7 +1,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { NgModule } from '@angular/core'; - import {FormsModule} from '@angular/forms'; +import {FormsModule} from '@angular/forms'; import { CountdownModule } from 'ngx-countdown'; import {ReactiveFormsModule} from '@angular/forms'; import { FlexLayoutModule } from '@angular/flex-layout'; diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css index bb3ebec..071ac6f 100644 --- a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.css @@ -3,10 +3,8 @@ max-width: 100%; width: 100%; font-size: 20px; - /* font-weight: 400; */ } .full-width { width: 100%; - /* display:block; */ } diff --git a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts index c69d009..1236220 100644 --- a/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/auth/login/login.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { MatSnackBar} from '@angular/material/snack-bar'; import { AuthService } from 'src/app/core/security/auth.service'; +import { LoginVisitor } from 'src/app/core/model/shared'; @Component({ selector: 'app-login', templateUrl: './login.component.html', @@ -13,26 +14,31 @@ export class LoginComponent implements OnInit { private authService: AuthService) { } ngOnInit(): void { - + var value1 = localStorage.getItem('LoggedInUser'); + if ( value1 != null || value1 !== undefined || value1 !== '') { + this.route.navigate(['event-list']); + } } - - loginUser(values: any) - { - if (true) - { - this.snackbar.open('Login success', 'Success', { - duration: 3000, + loginUser(values) { + const visitor: LoginVisitor = new LoginVisitor(); + visitor.username = values.email; + this.authService.loginVisitor(visitor.username).subscribe( + (data) => { + if (data.username === values.email && data.password === values.password) { + this.authService.setVisitorId(data.id); + this.authService.sendToken(data.username); + this.route.navigate(['event-list']); + this.snackbar.open('Login success', 'ok', { + duration : 2000 + }); + } else { + this.snackbar.open('access error', 'OK', { + duration: 2000, + }); + } } - ); - - this.authService.sendToken(values.email); - this.route.navigate(['event-list']); - } else - { - this.snackbar.open('Failed to login', 'Error', { - duration: 3000, - panelClass: ['mat-toolbar', 'mat-warn']} - ); + ); + } } - } -} + + diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css index 2af62a0..321c334 100644 --- a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.css @@ -9,3 +9,8 @@ .full-width { width: 100%; } + ::ng-deep .success { + font-weight: bold; + /* color: blue; */ + background-color: rgb(10, 241, 10); + } \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html index 4f073bf..7464b10 100644 --- a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.html @@ -22,13 +22,15 @@ Name - + Name is required + First letter should be capital Phone Number - Phone is required Phone number must be of 10 digit diff --git a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts index f39802a..b9daa38 100644 --- a/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/auth/register/register.component.ts @@ -1,4 +1,8 @@ import { Component, OnInit } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Router } from '@angular/router'; +import { Visitor } from 'src/app/core/model/shared'; +import { AuthService } from 'src/app/core/security/auth.service'; @Component({ selector: 'app-register', @@ -7,12 +11,35 @@ import { Component, OnInit } from '@angular/core'; }) export class RegisterComponent implements OnInit { - constructor() { } + constructor(private authService: AuthService , private router: Router , + private snackbar: MatSnackBar) { } ngOnInit(): void { } -registerUser(values) -{ - console.log(values); +registerUser(values) { + const visitor: Visitor = new Visitor(); + visitor.username = values.username; + visitor.name = values.name; + visitor.phoneNumber = values.phoneNumber; + visitor.password = values.password; + visitor.acceptedCommercial = values.acceptedCommercial; + visitor.acceptedTerms = values.acceptedTerms; + visitor.userType = false; + this.authService.registerVisitor(visitor).subscribe( + (data) => { + this.snackbar.open( + 'Registered successfully with id ' + data.id, '', + { + duration: 3000, + panelClass: ['success'], + } + ); + this.router.navigate(['login']); + }, + (err) => this.snackbar.open(err.error.message, 'OK', { + duration: 5000, + }) + ); } } + diff --git a/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts b/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts new file mode 100644 index 0000000..092114f --- /dev/null +++ b/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts @@ -0,0 +1,63 @@ +export class FilterVisitor { + pageable: Pageable; + username: string; + password?: string; +} +export class FilterQueueDetail { + pageable: Pageable; + visitorId: Number; +} + +export class FilterEvent { + pageable: Pageable; +} +export class Pageable { + pageSize: number; + pageNumber: number; + sort: Sort[]; +} + +export class Sort { + property: string; + direction: string; +} +export class Role { + name: string; + permission: number; +} +export class Visitor { + id: number; + username: string; + name: string; + password: string; + phoneNumber: string; + acceptedCommercial: boolean; + acceptedTerms: boolean; + userType: boolean; +} + +export class Event { + id?: number; + eventName: string; + logo: string; + currentNumber: string; + attentionTime: string; + customers: number; + +} +export class QueueDetail { + id: any; + queueNumber: string; + creationTime: string; + startTime?: string; + endTime?: string; + minEstimatedTime: string; + visitorId: number; + eventId: number; +} +export class LoginVisitor{ + username: string; + password: string; +} + + diff --git a/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts index 8682a13..c42c340 100644 --- a/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts +++ b/Raj_Bhushan/jump_angular/src/app/core/security/auth.service.ts @@ -1,12 +1,20 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { map } from 'rxjs/operators'; import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { environment } from 'src/environments/environment'; +import { FilterVisitor, LoginVisitor, Pageable, Visitor } from '../model/shared'; + @Injectable({ providedIn: 'root' }) export class AuthService { - constructor(private route: Router) { } + private baseUrl = environment.baseUrlRestServices; + private visitorId =0; + constructor(private route: Router, private http: HttpClient) { } sendToken(token: string) { localStorage.setItem('LoggedInUser', token); } @@ -20,5 +28,30 @@ export class AuthService { localStorage.removeItem('LoggedInUser'); this.route.navigate(['login']); } + setVisitorId(visitorId: number): void { + this.visitorId = visitorId; + } + getVisitorId(): number { + return this.visitorId; + } + registerVisitor(visitor: Visitor): Observable{ + return this.http.post(`${this.baseUrl}` + '/visitormanagement/v1/visitor', visitor); + } + + + loginVisitor(username: string): Observable{ + const filters: FilterVisitor = new FilterVisitor(); + const pageable: Pageable = new Pageable(); + pageable.sort = []; + pageable.pageNumber = 0; + pageable.pageSize = 1000; + filters.username = username; + filters.pageable = pageable; + return this.http.post(`${this.baseUrl}` + '/visitormanagement/v1/visitor/search', filters) + .pipe( + // tslint:disable-next-line: no-string-literal + map(visitors => visitors['content'][0]), + ); + } } diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css index 1728fca..86cfcd2 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.css @@ -3,5 +3,18 @@ font-weight: bold; } .mat-list-item { - color: #3F51B5 !important; /* Note: You could also use a custom theme */ - } \ No newline at end of file + color: black !important; /* Note: You could also use a custom theme */ + /* margin-top: 2px; + margin-bottom: 2px; */ + border-color: black; + } +.heading{ + color: blue; + justify-content: center; + height:60px; + /* margin-top: 20; */ +} +.events{ + background-color:rgb(75, 236, 83); + border-bottom: 5px solid blue; +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html index c082f15..0b104fe 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.html @@ -1,12 +1,12 @@ - + EVENTS - {{event.eventName}} + + + {{event.eventName}} + @@ -15,7 +15,6 @@ menu - \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts index 4868fed..5642d65 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/event-list/event-list.component.ts @@ -1,6 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { QueueService } from '../queue/services/queue.service'; -import {Event} from '../../core/model/event'; +// import {Event} from '../../core/model/event'; +import { Router } from '@angular/router'; +import { Event } from 'src/app/core/model/shared'; @Component({ selector: 'app-event-list', templateUrl: './event-list.component.html', @@ -8,20 +10,31 @@ import {Event} from '../../core/model/event'; }) export class EventListComponent implements OnInit { - selectedEventId : any; - // id: any; + selectedEventId: any; allEvents: Event[] = []; - constructor(private queueService: QueueService) { + constructor(private queueService: QueueService , private route: Router) { } ngOnInit() { - this.queueService.getAllEvents().subscribe(data=>{ - this.allEvents = data['events']; + this.queueService.getAllEvents().subscribe(data => { + this.allEvents = data; }); - } - selectEvent(id: Event) - { + } + selectEvent(id: Event) { this.selectedEventId = id; return true; - } + } + + getCurrentUser() { + return localStorage.getItem('LoggedInUser'); + } + isJoined(eventId) { + const user = this.getCurrentUser(); + const returnvalue = localStorage.getItem( user + '#' + eventId); + if (returnvalue !== null) { + return true; } else { + return false; + } + } + } diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css index 35689a7..4c61fe6 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.css @@ -4,7 +4,10 @@ .my-card{ margin: 10px; margin-bottom: 5px; - border-radius: 2%; + /* border-radius: 2%; */ + border: 55px !important; + border-radius: 30px !important; + /* border: rgb(41, 238, 15) !important; */ } .header-image{ width: 100%; @@ -14,6 +17,12 @@ font-size: x-large; text-align: center; } + .title1{ + text-align: center; + font-weight: bold; + font-size: x-large; + color: rgb(9, 9, 151); + } .content{ text-align: center; @@ -25,6 +34,11 @@ font-weight: bolder; font-size: 75px; } + .time{ + color:red; + font-weight: bold; + font-size: larger + } .btn-wrapper{ margin: 10px; diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html index 9fb5072..f2c07f4 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html @@ -1,12 +1,15 @@
- - Your Number + + {{this.event.eventName}} + + + Your AccessCode -
{{event.myNumber}}
+
{{this.getMyNumberFromLocal()}}
-

Currently estimate time: +

Currently estimate time:

@@ -16,12 +19,12 @@

Currently estimate time: Currently Being Attended -
{{event.currentlyAttended}}
+
{{event.currentNumber}}
- -
@@ -31,6 +34,7 @@

Currently estimate time: - The queue is not active try again later. + + Welcome to JumpTheQueue

\ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts index bf47bc3..ba5de34 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts @@ -1,63 +1,116 @@ -import { Component, OnInit ,Input, OnChanges, SimpleChanges} from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { + Component, + OnInit, + Input, + OnChanges, + SimpleChanges, +} from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; import { QueueService } from './services/queue.service'; -import {Event} from '../../core/model/event'; +import { Event, QueueDetail } from '../../core/model/shared'; import { MatSnackBar } from '@angular/material/snack-bar'; +import { AuthService } from 'src/app/core/security/auth.service'; @Component({ selector: 'app-queue', templateUrl: './queue.component.html', - styleUrls: ['./queue.component.css'] + styleUrls: ['./queue.component.css'], }) -export class QueueComponent implements OnInit ,OnChanges{ - - constructor(private queueService: QueueService, private route: ActivatedRoute, private snackbar: MatSnackBar ) { } - ngOnChanges(changes: SimpleChanges): void { - this.getEventDetails(); } - - @Input() id: any; - // id: any; +export class QueueComponent implements OnInit, OnChanges { + public visitorId: any; event: Event = null; - ngOnInit(): void { - // this.route.params.subscribe( - // params => { - // this.id = params['id']; + queueDetail: QueueDetail = null; + queueId1 = 0; + @Input() id: any; + constructor( + private queueService: QueueService, + private router: Router, + private route: ActivatedRoute, + private snackbar: MatSnackBar, + private authService: AuthService + ) {} + ngOnChanges(changes: SimpleChanges): void { + this.getEventDetails(); + } + ngOnInit(): void { + } - // this.getEventDetails(); - // } - // ); - - console.log(this.event); - } - - getEventDetails(){ - this.queueService.getAllEvents().subscribe(data=> { - for (let event of data['events']) - { - if(event.id === this.id) - { - this.event = event; + // method will return the current user + getCurrentUser() { + return localStorage.getItem('LoggedInUser'); +} + getEventDetails() { + this.queueService.getAllEvents().subscribe((data) => { + for (const event of data) { + if (event.id === this.id) { + this.event = event; } } - }) - } - onJoinQueue(eventId){ - this.queueService.joinQueue(eventId).subscribe(data => { - this.event.joined = true ; - this.snackbar.open('Succefully joined the queue ' + this.event.myNumber, '',{ - duration: 3000, - panelClass: ['success'] - }); - }); - } - onLeaveQueue(eventId){ - this.queueService.leaveQueue(eventId).subscribe(data => { - this.event.joined = false ; + }); + } + onJoinQueue(eventId) { + this.queueService.joinQueue(eventId, this.authService.getVisitorId()).subscribe((data) => { + this.queueDetail = data; + const user = this.getCurrentUser(); + const temp = { queueNumber : this.queueDetail.queueNumber, + queueId: this.queueDetail.id , + minEstimatedTime: this.queueDetail.minEstimatedTime}; + localStorage.setItem(user + '#' + this.event.id, JSON.stringify(temp)) ; + this.snackbar.open( + 'Succefully joined the queue ', '', + { + duration: 2000, + panelClass: ['success'], + } + ); + }); + } + getEstimatedTime() { + // const current = parseInt(this.event.currentNumber.substring(1)); + // const queue1 = this.getMyNumberFromLocal(); + // const queue = parseInt(queue1.substring(1)); + // const difference = (queue - current) * 120; + // return difference; + // const time = parseInt(this.queueDetail.minEstimatedTime); + // return time; + const user = this.getCurrentUser(); + const temp = localStorage.getItem(user + '#' + this.event.id); + if (temp == null) { + return ''; + } + const temp1 = JSON.parse(localStorage.getItem(user + '#' + this.event.id)); + return temp1.minEstimatedTime; + } + + + onLeaveQueue(id) { + this.queueService.leaveQueue(id).subscribe((data) => { + const user = this.getCurrentUser(); + localStorage.removeItem(user + '#' + this.event.id); this.snackbar.open('Leave the event', '', { - duration: 3000, - panelClass: ['leave'] - }); - }); - } - + duration: 2000, + panelClass: ['leave'], + }); }); + } + + getMyNumberFromLocal() { + const user = this.getCurrentUser(); + const temp = localStorage.getItem(user + '#' + this.event.id); + if (temp == null) { + return ''; + } + const temp1 = JSON.parse(localStorage.getItem(user + '#' + this.event.id)); + return temp1.queueNumber; + } + + + getQueueIdFromLocal() { + const user = this.getCurrentUser(); + const a = localStorage.getItem(user + '#' + this.event.id); + if ( a == null) { + return ''; + } + const abc = JSON.parse(localStorage.getItem(user + '#' + this.event.id)); + return abc.queueId; + } } diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts index 0a77f4f..e568bcd 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts @@ -2,31 +2,42 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Event } from '../../../core/model/event'; import { Observable } from 'rxjs'; +import { FilterEvent, Pageable, QueueDetail } from '../../../core/model/shared'; +import { environment } from 'src/environments/environment'; +import { map } from 'rxjs/operators'; +import { AuthService } from 'src/app/core/security/auth.service'; @Injectable({ providedIn: 'root' }) export class QueueService { private allEvents: Event[]; -// constructor(private http: HttpClient) { this.fetchEvents(); } -// fetchEvents(){{ -// this.http.get('./assets/event.json').subscribe(data => this.allEvents = data['events']); -// }} -// getAllEvents(): Event[]{ -// return Observable.create(observer => -// observer.next(this.allEvents); -// observer.complete(); -// ); -// } +private baseUrl = environment.baseUrlRestServices; + constructor( private http: HttpClient, private authService: AuthService){} - constructor( private http: HttpClient){} + // this method will Fetch all the events detail getAllEvents(): Observable { - return this.http.get('./assets/event.json'); + const filters: FilterEvent = new FilterEvent(); + const pageable: Pageable = new Pageable(); + pageable.sort = []; + pageable.pageNumber = 0; + pageable.pageSize = 1000; + filters.pageable = pageable; + return this.http.post(`${this.baseUrl}` + '/eventmanagement/v1/event/search', filters) + .pipe( + + // tslint:disable-next-line: no-string-literal + map(events => events['content']), + ); } - leaveQueue(eventId: any): Observable { - return this.http.get('./assets/event.json'); //change link when connected to backend + + leaveQueue(queuedetailId: number): Observable { + return this.http.delete(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/leavequeue/' + queuedetailId + '/'); } - joinQueue(eventId: any): Observable { - return this.http.get('./assets/event.json'); //change link when connected to backend + joinQueue(eventId: number , visitorId: number ): Observable { + const queuedetail: QueueDetail = new QueueDetail(); + queuedetail.eventId = eventId; + queuedetail.visitorId = visitorId; + return this.http.post(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/joinqueue/', queuedetail); } } diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.html b/Raj_Bhushan/jump_angular/src/app/header/header.component.html index ca23541..22d3bc5 100644 --- a/Raj_Bhushan/jump_angular/src/app/header/header.component.html +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.html @@ -15,7 +15,6 @@ - \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/app/header/header.component.ts b/Raj_Bhushan/jump_angular/src/app/header/header.component.ts index ea6a3a7..32be7bc 100644 --- a/Raj_Bhushan/jump_angular/src/app/header/header.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/header/header.component.ts @@ -1,17 +1,19 @@ -import { Component, Input } from "@angular/core"; +import { Component, Input, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { AuthService } from '../core/security/auth.service'; @Component({ - selector: "app-header", - templateUrl: "./header.component.html", - styleUrls: ["./header.component.css"] + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.css'] }) -export class HeaderComponent { +export class HeaderComponent implements OnInit{ constructor(public authService: AuthService, private route: Router){} - logout() - { + ngOnInit(): void { + } + logout() { this.authService.logout(); this.route.navigate(['login']); } + } diff --git a/Raj_Bhushan/jump_angular/src/assets/event.json b/Raj_Bhushan/jump_angular/src/assets/event.json index cebf637..7428ff1 100644 --- a/Raj_Bhushan/jump_angular/src/assets/event.json +++ b/Raj_Bhushan/jump_angular/src/assets/event.json @@ -31,6 +31,22 @@ "joined": false, "estimateTime":4000, "myNumber": "Q0037" + }, + { + "id": "005", + "eventName": "Christmas Party", + "currentlyAttended": "Q0014", + "joined": false, + "estimateTime":4000, + "myNumber": "Q0067" + }, + { + "id": "006", + "eventName": "New year", + "currentlyAttended": "Q0018", + "joined": false, + "estimateTime":3000, + "myNumber": "Q0083" } ] } \ No newline at end of file diff --git a/Raj_Bhushan/jump_angular/src/environments/environment.ts b/Raj_Bhushan/jump_angular/src/environments/environment.ts index 7b4f817..c40d682 100644 --- a/Raj_Bhushan/jump_angular/src/environments/environment.ts +++ b/Raj_Bhushan/jump_angular/src/environments/environment.ts @@ -2,8 +2,9 @@ // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. -export const environment = { - production: false +export const environment: {production: boolean, baseUrlRestServices: string} = { + production: false, + baseUrlRestServices: 'http://localhost:8085/jumpthequeue/services/rest' }; /* From 84e2c2868b2c590aa6cac478f883541c9a635aeb Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Fri, 4 Dec 2020 13:11:24 +0530 Subject: [PATCH 3/8] backend_1_commit --- Raj_Bhushan/jump_java/jtqj1/.gitignore | 21 + Raj_Bhushan/jump_java/jtqj1/api/pom.xml | 45 ++ .../eventmanagement/common/api/Event.java | 66 +++ .../logic/api/Eventmanagement.java | 11 + .../logic/api/to/EventEto.java | 168 ++++++ .../logic/api/to/EventSearchCriteriaTo.java | 205 ++++++++ .../logic/api/usecase/UcFindEvent.java | 28 + .../logic/api/usecase/UcManageEvent.java | 47 ++ .../api/rest/EventmanagementRestService.java | 65 +++ .../general/common/api/ApplicationEntity.java | 11 + .../api/to/AbstractSearchCriteriaTo.java | 32 ++ .../common/api/QueueDetail.java | 80 +++ .../logic/api/Queuedetailmanagement.java | 11 + .../logic/api/to/QueueDetailCto.java | 50 ++ .../logic/api/to/QueueDetailEto.java | 190 +++++++ .../api/to/QueueDetailSearchCriteriaTo.java | 165 ++++++ .../logic/api/usecase/UcFindQueueDetail.java | 53 ++ .../api/usecase/UcManageQueueDetail.java | 36 ++ .../QueuedetailmanagementRestService.java | 110 ++++ .../visitormanagement/common/api/Visitor.java | 91 ++++ .../logic/api/Visitormanagement.java | 11 + .../logic/api/to/VisitorEto.java | 191 +++++++ .../logic/api/to/VisitorSearchCriteriaTo.java | 226 ++++++++ .../logic/api/usecase/UcFindVisitor.java | 28 + .../logic/api/usecase/UcManageVisitor.java | 26 + .../rest/VisitormanagementRestService.java | 65 +++ .../com/devonfw/application/jtqj/ToTest.java | 323 ++++++++++++ Raj_Bhushan/jump_java/jtqj1/core/pom.xml | 218 ++++++++ .../application/jtqj/SpringBootApp.java | 29 ++ .../dataaccess/api/EventEntity.java | 135 +++++ .../dataaccess/api/repo/EventRepository.java | 127 +++++ .../logic/base/usecase/AbstractEventUc.java | 27 + .../logic/impl/EventmanagementImpl.java | 72 +++ .../logic/impl/usecase/UcFindEventImpl.java | 50 ++ .../logic/impl/usecase/UcManageEventImpl.java | 92 ++++ .../rest/EventmanagementRestServiceImpl.java | 46 ++ .../general/common/api/ApplicationEntity.java | 11 + .../ApplicationAccessControlConfig.java | 32 ++ .../common/api/validation/EmailExtended.java | 30 ++ .../general/common/api/validation/Phone.java | 28 + .../base/AbstractBeanMapperSupport.java | 31 ++ .../ApplicationObjectMapperFactory.java | 51 ++ .../common/impl/config/BeansOrikaConfig.java | 14 + .../common/impl/config/CsrfTokenImpl.java | 60 +++ .../impl/security/BaseUserDetailsService.java | 123 +++++ .../impl/security/CsrfRequestMatcher.java | 54 ++ .../api/ApplicationPersistenceEntity.java | 86 +++ .../general/dataaccess/impl/JpaConfig.java | 27 + .../logic/base/AbstractComponentFacade.java | 16 + .../general/logic/base/AbstractLogic.java | 127 +++++ .../jtqj/general/logic/base/AbstractUc.java | 18 + .../DefaultRolesPrefixPostProcessor.java | 61 +++ .../impl/config/BaseWebSecurityConfig.java | 119 +++++ .../impl/config/ServletInitializer.java | 23 + .../service/impl/config/WebConfig.java | 80 +++ .../impl/config/WebSecurityBeansConfig.java | 52 ++ .../impl/config/WebSecurityConfig.java | 21 + .../rest/ApplicationAccessDeniedHandler.java | 46 ++ .../dataaccess/api/QueueDetailEntity.java | 213 ++++++++ .../api/repo/QueueDetailRepository.java | 130 +++++ .../base/usecase/AbstractQueueDetailUc.java | 27 + .../logic/impl/QueuedetailmanagementImpl.java | 84 +++ .../impl/usecase/UcFindQueueDetailImpl.java | 95 ++++ .../impl/usecase/UcManageQueueDetailImpl.java | 167 ++++++ .../QueuedetailmanagementRestServiceImpl.java | 78 +++ .../dataaccess/api/VisitorEntity.java | 166 ++++++ .../api/repo/VisitorRepository.java | 145 ++++++ .../logic/base/usecase/AbstractVisitorUc.java | 27 + .../logic/impl/VisitormanagementImpl.java | 50 ++ .../logic/impl/usecase/UcFindVisitorImpl.java | 48 ++ .../impl/usecase/UcManageVisitorImpl.java | 49 ++ .../VisitormanagementRestServiceImpl.java | 49 ++ .../META-INF/cxf/org.apache.cxf.Logger | 1 + .../src/main/resources/application.properties | 37 ++ .../resources/config/application.properties | 28 + .../migration/1.0/V0001__Create_Sequence.sql | 3 + .../migration/1.0/V0005__Create_Visitor.sql | 12 + .../db/migration/1.0/V0006__Event.sql | 9 + .../db/migration/1.0/V0007__QueueDetail.sql | 13 + .../db/migration/1.0/V0008__Master_Data.sql | 9 + .../core/src/main/resources/static/index.html | 18 + .../logic/impl/EventmanagementTest.java | 59 +++ .../common/base/Devon4jPackageCheckTest.java | 66 +++ .../common/base/PermissionCheckTest.java | 69 +++ .../base/test/ApplicationComponentTest.java | 22 + .../base/test/ApplicationSubsystemTest.java | 16 + .../common/base/test/DbTestHelper.java | 44 ++ .../general/common/base/test/TestUtil.java | 29 ++ .../common/impl/config/TestDbConfig.java | 35 ++ .../impl/config/TestWebSecurityConfig.java | 54 ++ .../service/base/test/RestServiceTest.java | 67 +++ .../logic/impl/QueuedetailmanagementTest.java | 70 +++ .../logic/impl/VisitormanagementTest.java | 63 +++ .../resources/config/application.properties | 13 + .../test/resources/db/test/V0001__InitDb.sql | 2 + Raj_Bhushan/jump_java/jtqj1/pom.xml | 488 ++++++++++++++++++ Raj_Bhushan/jump_java/jtqj1/server/pom.xml | 145 ++++++ .../server/src/main/resources/logback.xml | 32 ++ .../application/jtqj/SpringBootBatchApp.java | 29 ++ .../batch/impl/config/BeansBatchConfig.java | 193 +++++++ .../migration/h2/V0005__Add_batch_tables.sql | 81 +++ .../base/test/SpringBatchIntegrationTest.java | 53 ++ .../general/common/base/test/TestUtil.java | 29 ++ 103 files changed, 7378 insertions(+) create mode 100644 Raj_Bhushan/jump_java/jtqj1/.gitignore create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/pom.xml create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/Eventmanagement.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcFindEvent.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/api/rest/EventmanagementRestService.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/to/AbstractSearchCriteriaTo.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/Queuedetailmanagement.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailCto.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/common/api/Visitor.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/Visitormanagement.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorEto.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcFindVisitor.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcManageVisitor.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/api/rest/VisitormanagementRestService.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/api/src/test/java/com/devonfw/application/jtqj/ToTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/pom.xml create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/SpringBootApp.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/base/usecase/AbstractEventUc.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcFindEventImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/security/ApplicationAccessControlConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/EmailExtended.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/Phone.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/base/AbstractBeanMapperSupport.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/ApplicationObjectMapperFactory.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/BeansOrikaConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/CsrfTokenImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/BaseUserDetailsService.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/CsrfRequestMatcher.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/api/ApplicationPersistenceEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/impl/JpaConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractComponentFacade.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractLogic.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractUc.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/BaseWebSecurityConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/ServletInitializer.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityBeansConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/rest/ApplicationAccessDeniedHandler.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/VisitorEntity.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/repo/VisitorRepository.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/base/usecase/AbstractVisitorUc.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/application.properties create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/config/application.properties create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/static/index.html create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/Devon4jPackageCheckTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/PermissionCheckTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationComponentTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationSubsystemTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/DbTestHelper.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestDbConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestWebSecurityConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/service/base/test/RestServiceTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/config/application.properties create mode 100644 Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/db/test/V0001__InitDb.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/pom.xml create mode 100644 Raj_Bhushan/jump_java/jtqj1/server/pom.xml create mode 100644 Raj_Bhushan/jump_java/jtqj1/server/src/main/resources/logback.xml create mode 100644 Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/SpringBootBatchApp.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/general/batch/impl/config/BeansBatchConfig.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql create mode 100644 Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/batch/base/test/SpringBatchIntegrationTest.java create mode 100644 Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java diff --git a/Raj_Bhushan/jump_java/jtqj1/.gitignore b/Raj_Bhushan/jump_java/jtqj1/.gitignore new file mode 100644 index 0000000..1b64d26 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/.gitignore @@ -0,0 +1,21 @@ +.* +!.github +!.gitignore +!.mvn +!.travis.yml +*.bak +*.log +*.class +*.diff +*.patch +*.iml +*.jar +*.war +*.ear +hs_err_pid* + +target +eclipse-target +war +**/src/generated/ +**/tmp/ diff --git a/Raj_Bhushan/jump_java/jtqj1/api/pom.xml b/Raj_Bhushan/jump_java/jtqj1/api/pom.xml new file mode 100644 index 0000000..b0b31a0 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.devonfw.java.jtqj1 + jtqj1 + 0.0.1 + + jtqj1-api + jar + ${project.artifactId} + API of the server for the jtqj application (containing datatypes, transfer-objects, and service interfaces). + + + + org.springframework.data + spring-data-commons + + + com.devonfw.java.modules + devon4j-rest + + + com.devonfw.java.modules + devon4j-logging + + + com.devonfw.java.modules + devon4j-security + + + + javax.servlet + javax.servlet-api + provided + + + + com.devonfw.java.modules + devon4j-test + test + + + diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java new file mode 100644 index 0000000..9f3c793 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java @@ -0,0 +1,66 @@ +package com.devonfw.application.jtqj.eventmanagement.common.api; + +import java.time.Duration; + +import com.devonfw.application.jtqj.general.common.api.ApplicationEntity; + +public interface Event extends ApplicationEntity { + + /** + * @return eventNameId + */ + public String getEventName(); + + /** + * @param eventName setter for eventName attribute + */ + public void setEventName(String eventName); + + /** + * @return logoId + */ + public String getLogo(); + + /** + * @param logo setter for logo attribute + */ + public void setLogo(String logo); + + /** + * @return descriptionId + */ + public String getDescription(); + + /** + * @param description setter for description attribute + */ + public void setDescription(String description); + + /** + * @return currentNumberId + */ + public String getCurrentNumber(); + + /** + * @param currentNumber setter for currentNumber attribute + */ + public void setCurrentNumber(String currentNumber); + + /** + * @return customersId + */ + public int getCustomers(); + + /** + * @param customers setter for customers attribute + */ + public void setCustomers(int customers); + + /** + * @param attentionTime setter for attentionTime attribute + */ + public void setAttentionTime(Duration attentionTime); + + public Duration getAttentionTime(); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/Eventmanagement.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/Eventmanagement.java new file mode 100644 index 0000000..622ff95 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/Eventmanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.api; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcManageEvent; + +/** + * Interface for Eventmanagement component. + */ +public interface Eventmanagement extends UcFindEvent, UcManageEvent { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java new file mode 100644 index 0000000..3b2d87c --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java @@ -0,0 +1,168 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.api.to; + +import java.time.Duration; + +import com.devonfw.application.jtqj.eventmanagement.common.api.Event; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of Event + */ +public class EventEto extends AbstractEto implements Event { + + private static final long serialVersionUID = 1L; + + private String eventName; + + private String logo; + + private String description; + + private String currentNumber; + + private Duration attentionTime; + + private int customers; + + @Override + public String getEventName() { + + return this.eventName; + } + + @Override + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + @Override + public String getLogo() { + + return this.logo; + } + + @Override + public void setLogo(String logo) { + + this.logo = logo; + } + + @Override + public String getDescription() { + + return this.description; + } + + @Override + public void setDescription(String description) { + + this.description = description; + } + + @Override + public String getCurrentNumber() { + + return this.currentNumber; + } + + @Override + public void setCurrentNumber(String currentNumber) { + + this.currentNumber = currentNumber; + } + + @Override + public int getCustomers() { + + return this.customers; + } + + @Override + public void setCustomers(int customers) { + + this.customers = customers; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.eventName == null) ? 0 : this.eventName.hashCode()); + result = prime * result + ((this.logo == null) ? 0 : this.logo.hashCode()); + result = prime * result + ((this.description == null) ? 0 : this.description.hashCode()); + result = prime * result + ((this.currentNumber == null) ? 0 : this.currentNumber.hashCode()); + result = prime * result + ((Integer) this.customers).hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + EventEto other = (EventEto) obj; + if (this.eventName == null) { + if (other.eventName != null) { + return false; + } + } else if (!this.eventName.equals(other.eventName)) { + return false; + } + if (this.logo == null) { + if (other.logo != null) { + return false; + } + } else if (!this.logo.equals(other.logo)) { + return false; + } + if (this.description == null) { + if (other.description != null) { + return false; + } + } else if (!this.description.equals(other.description)) { + return false; + } + if (this.currentNumber == null) { + if (other.currentNumber != null) { + return false; + } + } else if (!this.currentNumber.equals(other.currentNumber)) { + return false; + } + if (this.attentionTime == null) { + if (other.attentionTime != null) { + return false; + } + } else if (!this.attentionTime.equals(other.attentionTime)) { + return false; + } + + if (this.customers != other.customers) { + return false; + } + return true; + } + + @Override + public void setAttentionTime(Duration attentionTime) { + + this.attentionTime = attentionTime; + } + + @Override + public Duration getAttentionTime() { + + return this.attentionTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java new file mode 100644 index 0000000..996fdbb --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java @@ -0,0 +1,205 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.api.to; + +import java.time.Duration; + +import com.devonfw.application.jtqj.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of {@link com.devonfw.application.jtqj.eventmanagement.common.api.Event}s. + */ +public class EventSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String eventName; + + private String logo; + + private String description; + + private String currentNumber; + + private Duration attentionTime; + + private Boolean isJoined; + + private Integer customers; + + private StringSearchConfigTo eventNameOption; + + private StringSearchConfigTo logoOption; + + private StringSearchConfigTo descriptionOption; + + private StringSearchConfigTo currentNumberOption; + + /** + * @return eventNameId + */ + public String getEventName() { + + return this.eventName; + } + + /** + * @param eventName setter for eventName attribute + */ + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + /** + * @return logoId + */ + public String getLogo() { + + return this.logo; + } + + /** + * @param logo setter for logo attribute + */ + public void setLogo(String logo) { + + this.logo = logo; + } + + /** + * @return descriptionId + */ + public String getDescription() { + + return this.description; + } + + /** + * @param description setter for description attribute + */ + public void setDescription(String description) { + + this.description = description; + } + + /** + * @return currentNumberId + */ + public String getCurrentNumber() { + + return this.currentNumber; + } + + /** + * @param currentNumber setter for currentNumber attribute + */ + public void setCurrentNumber(String currentNumber) { + + this.currentNumber = currentNumber; + } + + /** + * @return isJoinedId + */ + public Boolean getIsJoined() { + + return this.isJoined; + } + + /** + * @param isJoined setter for isJoined attribute + */ + public void setIsJoined(Boolean isJoined) { + + this.isJoined = isJoined; + } + + /** + * @return customersId + */ + public Integer getCustomers() { + + return this.customers; + } + + /** + * @param customers setter for customers attribute + */ + public void setCustomers(Integer customers) { + + this.customers = customers; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getEventName() eventName}. + */ + public StringSearchConfigTo getEventNameOption() { + + return this.eventNameOption; + } + + /** + * @param eventNameOption new value of {@link #getEventNameOption()}. + */ + public void setEventNameOption(StringSearchConfigTo eventNameOption) { + + this.eventNameOption = eventNameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getLogo() logo}. + */ + public StringSearchConfigTo getLogoOption() { + + return this.logoOption; + } + + /** + * @param logoOption new value of {@link #getLogoOption()}. + */ + public void setLogoOption(StringSearchConfigTo logoOption) { + + this.logoOption = logoOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getDescription() description}. + */ + public StringSearchConfigTo getDescriptionOption() { + + return this.descriptionOption; + } + + /** + * @param descriptionOption new value of {@link #getDescriptionOption()}. + */ + public void setDescriptionOption(StringSearchConfigTo descriptionOption) { + + this.descriptionOption = descriptionOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getCurrentNumber() currentNumber}. + */ + public StringSearchConfigTo getCurrentNumberOption() { + + return this.currentNumberOption; + } + + /** + * @param currentNumberOption new value of {@link #getCurrentNumberOption()}. + */ + public void setCurrentNumberOption(StringSearchConfigTo currentNumberOption) { + + this.currentNumberOption = currentNumberOption; + } + + /** + * @param attentionTime setter for attentionTime attribute + */ + public void setAttentionTime(Duration attentionTime) { + + this.attentionTime = attentionTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcFindEvent.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcFindEvent.java new file mode 100644 index 0000000..364e0ee --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcFindEvent.java @@ -0,0 +1,28 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; + +public interface UcFindEvent { + + /** + * Returns a Event by its id 'id'. + * + * @param id The id 'id' of the Event. + * @return The {@link EventEto} with id 'id' + */ + EventEto findEvent(long id); + + /** + * Returns a paginated list of Events matching the search criteria. + * + * @param criteria the {@link EventSearchCriteriaTo}. + * @return the {@link List} of matching {@link EventEto}s. + */ + Page findEvents(EventSearchCriteriaTo criteria); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java new file mode 100644 index 0000000..61bb82d --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java @@ -0,0 +1,47 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.api.usecase; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; + +/** + * Interface of UcManageEvent to centralize documentation and signatures of methods. + */ +public interface UcManageEvent { + + /** + * Deletes a event from the database by its id 'eventId'. + * + * @param eventId Id of the event to delete + * @return boolean true if the event can be deleted, false otherwise + */ + boolean deleteEvent(long eventId); + + /** + * Saves a event and store it in the database. + * + * @param event the {@link EventEto} to create. + * @return the new {@link EventEto} that has been saved with ID and version. + */ + EventEto saveEvent(EventEto event); + + /** + * Decrease number of customers of the event and update the event. + * + * @param eventId id of the event to decrease customer. + */ + void decreaseEventCustomer(long eventId); + + /** + * Increase number of customers of the event and update the event. + * + * @param eventId id of the event to increase customer. + */ + void increaseEventCustomer(long eventId); + + /** + * + * Increase currently being attended + * + * @param eventId + */ + void increaseCurrentlyAttended(long eventId); +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/api/rest/EventmanagementRestService.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/api/rest/EventmanagementRestService.java new file mode 100644 index 0000000..7b71f4f --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/api/rest/EventmanagementRestService.java @@ -0,0 +1,65 @@ +package com.devonfw.application.jtqj.eventmanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Eventmanagement}. + */ +@Path("/eventmanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface EventmanagementRestService { + + /** + * Delegates to {@link Eventmanagement#findEvent}. + * + * @param id the ID of the {@link EventEto} + * @return the {@link EventEto} + */ + @GET + @Path("/event/{id}/") + public EventEto getEvent(@PathParam("id") long id); + + /** + * Delegates to {@link Eventmanagement#saveEvent}. + * + * @param event the {@link EventEto} to be saved + * @return the recently created {@link EventEto} + */ + @POST + @Path("/event/") + public EventEto saveEvent(EventEto event); + + /** + * Delegates to {@link Eventmanagement#deleteEvent}. + * + * @param id ID of the {@link EventEto} to be deleted + */ + @DELETE + @Path("/event/{id}/") + public void deleteEvent(@PathParam("id") long id); + + /** + * Delegates to {@link Eventmanagement#findEventEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding events. + * @return the {@link Page list} of matching {@link EventEto}s. + */ + @Path("/event/search") + @POST + public Page findEvents(EventSearchCriteriaTo searchCriteriaTo); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java new file mode 100644 index 0000000..82e4275 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqj.general.common.api; + +import com.devonfw.module.basic.common.api.entity.GenericEntity; + +/** + * This is the abstract interface for a {@link GenericEntity} of this application. We are using {@link Long} for + * all {@link #getId() primary keys}. + */ +public abstract interface ApplicationEntity extends GenericEntity { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/to/AbstractSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/to/AbstractSearchCriteriaTo.java new file mode 100644 index 0000000..809ad46 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/general/common/api/to/AbstractSearchCriteriaTo.java @@ -0,0 +1,32 @@ +package com.devonfw.application.jtqj.general.common.api.to; + +import org.springframework.data.domain.Pageable; + +import com.devonfw.module.basic.common.api.to.AbstractTo; + +/** + * Abstract {@link AbstractTo TO} for search criteria. + */ +public abstract class AbstractSearchCriteriaTo extends AbstractTo { + + private static final long serialVersionUID = 1L; + + private Pageable pageable; + + /** + * @return the {@link Pageable} containing the optional pagination information or {@code null}. + */ + public Pageable getPageable() { + + return this.pageable; + } + + /** + * @param pageable new value of {@link #getPageable()}. + */ + public void setPageable(Pageable pageable) { + + this.pageable = pageable; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java new file mode 100644 index 0000000..9e85c51 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java @@ -0,0 +1,80 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.common.api; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqj.general.common.api.ApplicationEntity; + +public interface QueueDetail extends ApplicationEntity { + + /** + * @return queueNumberId + */ + public String getQueueNumber(); + + /** + * @param queueNumber setter for queueNumber attribute + */ + public void setQueueNumber(String queueNumber); + + /** + * @return creationTimeId + */ + public Timestamp getCreationTime(); + + /** + * @param creationTime setter for creationTime attribute + */ + public void setCreationTime(Timestamp creationTime); + + /** + * @return startTimeId + */ + public Timestamp getStartTime(); + + /** + * @param startTime setter for startTime attribute + */ + public void setStartTime(Timestamp startTime); + + /** + * @return endTimeId + */ + public Timestamp getEndTime(); + + /** + * @param endTime setter for endTime attribute + */ + public void setEndTime(Timestamp endTime); + + /** + * getter for visitorId attribute + * + * @return visitorId + */ + public Long getVisitorId(); + + /** + * @param visitor setter for visitor attribute + */ + public void setVisitorId(Long visitorId); + + /** + * getter for eventId attribute + * + * @return eventId + */ + public Long getEventId(); + + /** + * @param event setter for event attribute + */ + public void setEventId(Long eventId); + + /** + * @param minEstimatedTime setter for minEstimatedTime attribute + */ + public void setMinEstimatedTime(String minEstimatedTime); + + public String getMinEstimatedTime(); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/Queuedetailmanagement.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/Queuedetailmanagement.java new file mode 100644 index 0000000..14be1f6 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/Queuedetailmanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api; + +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; + +/** + * Interface for Queuedetailmanagement component. + */ +public interface Queuedetailmanagement extends UcFindQueueDetail, UcManageQueueDetail { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailCto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailCto.java new file mode 100644 index 0000000..93a99e1 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailCto.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.module.basic.common.api.to.AbstractCto; + +/** + * Composite transport object of QueueDetail + */ +public class QueueDetailCto extends AbstractCto { + + private static final long serialVersionUID = 1L; + + private QueueDetailEto queueDetail; + + private VisitorEto visitor; + + private EventEto event; + + public QueueDetailEto getQueueDetail() { + + return queueDetail; + } + + public void setQueueDetail(QueueDetailEto queueDetail) { + + this.queueDetail = queueDetail; + } + + public VisitorEto getVisitor() { + + return visitor; + } + + public void setVisitor(VisitorEto visitor) { + + this.visitor = visitor; + } + + public EventEto getEvent() { + + return event; + } + + public void setEvent(EventEto event) { + + this.event = event; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java new file mode 100644 index 0000000..7df264b --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java @@ -0,0 +1,190 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqj.queuedetailmanagement.common.api.QueueDetail; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of QueueDetail + */ +public class QueueDetailEto extends AbstractEto implements QueueDetail { + + private static final long serialVersionUID = 1L; + + private String queueNumber; + + private Timestamp creationTime; + + private Timestamp startTime; + + private Timestamp endTime; + + private Long visitorId; + + private Long eventId; + + private String minEstimatedTime; + + @Override + public String getQueueNumber() { + + return this.queueNumber; + } + + @Override + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + @Override + public Timestamp getCreationTime() { + + return this.creationTime; + } + + @Override + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + @Override + public Timestamp getStartTime() { + + return this.startTime; + } + + @Override + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + @Override + public Timestamp getEndTime() { + + return this.endTime; + } + + @Override + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + @Override + public Long getVisitorId() { + + return this.visitorId; + } + + @Override + public void setVisitorId(Long visitorId) { + + this.visitorId = visitorId; + } + + @Override + public Long getEventId() { + + return this.eventId; + } + + @Override + public void setEventId(Long eventId) { + + this.eventId = eventId; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.queueNumber == null) ? 0 : this.queueNumber.hashCode()); + result = prime * result + ((this.creationTime == null) ? 0 : this.creationTime.hashCode()); + result = prime * result + ((this.startTime == null) ? 0 : this.startTime.hashCode()); + result = prime * result + ((this.endTime == null) ? 0 : this.endTime.hashCode()); + + result = prime * result + ((this.visitorId == null) ? 0 : this.visitorId.hashCode()); + + result = prime * result + ((this.eventId == null) ? 0 : this.eventId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + QueueDetailEto other = (QueueDetailEto) obj; + if (this.queueNumber == null) { + if (other.queueNumber != null) { + return false; + } + } else if (!this.queueNumber.equals(other.queueNumber)) { + return false; + } + if (this.creationTime == null) { + if (other.creationTime != null) { + return false; + } + } else if (!this.creationTime.equals(other.creationTime)) { + return false; + } + if (this.startTime == null) { + if (other.startTime != null) { + return false; + } + } else if (!this.startTime.equals(other.startTime)) { + return false; + } + if (this.endTime == null) { + if (other.endTime != null) { + return false; + } + } else if (!this.endTime.equals(other.endTime)) { + return false; + } + + if (this.visitorId == null) { + if (other.visitorId != null) { + return false; + } + } else if (!this.visitorId.equals(other.visitorId)) { + return false; + } + + if (this.eventId == null) { + if (other.eventId != null) { + return false; + } + } else if (!this.eventId.equals(other.eventId)) { + return false; + } + return true; + } + + @Override + public String getMinEstimatedTime() { + + return this.minEstimatedTime; + } + + @Override + public void setMinEstimatedTime(String minEstimatedTime) { + + this.minEstimatedTime = minEstimatedTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java new file mode 100644 index 0000000..248e6eb --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java @@ -0,0 +1,165 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to; + +import java.sql.Timestamp; +import java.time.Duration; + +import com.devonfw.application.jtqj.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of + * {@link com.devonfw.application.jtqj.queuedetailmanagement.common.api.QueueDetail}s. + */ +public class QueueDetailSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String queueNumber; + + private Timestamp creationTime; + + private Timestamp startTime; + + private Timestamp endTime; + + private Long visitorId; + + private Long eventId; + + private StringSearchConfigTo queueNumberOption; + + private Duration minEstimatedTime; + + /** + * @return queueNumberId + */ + public String getQueueNumber() { + + return this.queueNumber; + } + + /** + * @param queueNumber setter for queueNumber attribute + */ + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + /** + * @return creationTimeId + */ + public Timestamp getCreationTime() { + + return this.creationTime; + } + + /** + * @param creationTime setter for creationTime attribute + */ + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + /** + * @return startTimeId + */ + public Timestamp getStartTime() { + + return this.startTime; + } + + /** + * @param startTime setter for startTime attribute + */ + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + /** + * @return endTimeId + */ + public Timestamp getEndTime() { + + return this.endTime; + } + + /** + * @param endTime setter for endTime attribute + */ + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + /** + * getter for visitorId attribute + * + * @return visitorId + */ + public Long getVisitorId() { + + return this.visitorId; + } + + /** + * @param visitor setter for visitor attribute + */ + public void setVisitorId(Long visitorId) { + + this.visitorId = visitorId; + } + + /** + * getter for eventId attribute + * + * @return eventId + */ + public Long getEventId() { + + return this.eventId; + } + + /** + * @param event setter for event attribute + */ + public void setEventId(Long eventId) { + + this.eventId = eventId; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getQueueNumber() queueNumber}. + */ + public StringSearchConfigTo getQueueNumberOption() { + + return this.queueNumberOption; + } + + /** + * @param queueNumberOption new value of {@link #getQueueNumberOption()}. + */ + public void setQueueNumberOption(StringSearchConfigTo queueNumberOption) { + + this.queueNumberOption = queueNumberOption; + } + + /** + * @return minEstimatedTimeId + */ + public Duration getMinEstimatedTime() { + + return this.minEstimatedTime; + } + + /** + * @param minEstimatedTime setter for minEstimatedTime attribute + */ + public void setMinEstimatedTime(Duration minEstimatedTime) { + + this.minEstimatedTime = minEstimatedTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java new file mode 100644 index 0000000..2c56de8 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java @@ -0,0 +1,53 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; + +public interface UcFindQueueDetail { + + /** + * Returns a QueueDetail by its id 'id'. + * + * @param id The id 'id' of the QueueDetail. + * @return The {@link QueueDetailEto} with id 'id' + */ + QueueDetailEto findQueueDetail(long id); + + /** + * Returns a paginated list of QueueDetails matching the search criteria. + * + * @param criteria the {@link QueueDetailSearchCriteriaTo}. + * @return the {@link List} of matching {@link QueueDetailEto}s. + */ + Page findQueueDetails(QueueDetailSearchCriteriaTo criteria); + + /** + * Returns a paginated list of QueueDetailEto matching the search criteria. + * + * @param criteria the {@link QueueDetailSearchCriteriaTo}. + * @return the {@link List} of matching {@link QueueDetailEto}s. + */ + Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria); + + /** + * Returns a composite QueueDetail by its id 'id'. + * + * @param id The id 'id' of the QueueDetail. + * @return The {@link QueueDetailCto} with id 'id' + */ + QueueDetailCto findQueueDetailCto(long id); + + /** + * Returns a paginated list of composite QueueDetails matching the search criteria. + * + * @param criteria the {@link QueueDetailSearchCriteriaTo}. + * @return the {@link List} of matching {@link QueueDetailCto}s. + */ + Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java new file mode 100644 index 0000000..b10031f --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java @@ -0,0 +1,36 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase; + +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; + +/** + * Interface of UcManageQueueDetail to centralize documentation and signatures of methods. + */ +public interface UcManageQueueDetail { + + /** + * Deletes an queueDetail from the database by its ID 'queueDetailId'. Decreases the count of customers of the event + * assigned to the queueDetail by one. + * + * @param queueId Id of the queue to delete + */ + void deleteQueueDetail(long queueDetailId); + + /** + * Saves a queueDetail and store it in the database. + * + * @param queueDetail the {@link QueueDetailEto} to create. + * @return the new {@link QueueDetailEto} that has been saved with ID and version. + */ + QueueDetailEto saveQueueDetail(QueueDetailEto queueDetail); + + /** + * Saves a queueDetail and store it in the database. + * + * @param queueDetail the {@link QueueDetailEto} to create. + * @return the new {@link QueueDetailEto} that has been saved with ID and version. + */ + QueueDetailEto joinQueue(QueueDetailEto queueDetail); + + void leaveQueue(long queueDetailId); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java new file mode 100644 index 0000000..5132593 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java @@ -0,0 +1,110 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Queuedetailmanagement}. + */ +@Path("/queuedetailmanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface QueuedetailmanagementRestService { + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetail}. + * + * @param id the ID of the {@link QueueDetailEto} + * @return the {@link QueueDetailEto} + */ + @GET + @Path("/queuedetail/{id}/") + public QueueDetailEto getQueueDetail(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#saveQueueDetail}. + * + * @param queuedetail the {@link QueueDetailEto} to be saved + * @return the recently created {@link QueueDetailEto} + */ + @POST + @Path("/queuedetail/") + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail); + + /** + * Delegates to {@link Queuedetailmanagement#deleteQueueDetail}. + * + * @param id ID of the {@link QueueDetailEto} to be deleted + */ + @DELETE + @Path("/queuedetail/{id}/") + public void deleteQueueDetail(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#saveQueueDetail}. + * + * @param queuedetail the {@link QueueDetailEto} to be saved + * @return the recently created {@link QueueDetailEto} + */ + @POST + @Path("/queuedetail/joinqueue/") + public QueueDetailEto joinQueue(QueueDetailEto queuedetail); + + @DELETE + @Path("/queuedetail/leavequeue/{id}/") + public void leaveQueue(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding queuedetails. + * @return the {@link Page list} of matching {@link QueueDetailEto}s. + */ + @Path("/queuedetail/search") + @POST + public Page findQueueDetails(QueueDetailSearchCriteriaTo searchCriteriaTo); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding queuedetails. + * @return the {@link Page list} of matching {@link QueueDetailEto}s. + */ + @Path("/queuedetail/search") + @POST + public Page findQueueDetailsEtos(QueueDetailSearchCriteriaTo searchCriteriaTo); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailCto}. + * + * @param id the ID of the {@link QueueDetailCto} + * @return the {@link QueueDetailCto} + */ + @GET + @Path("/queuedetail/cto/{id}/") + public QueueDetailCto getQueueDetailCto(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailCtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding queuedetails. + * @return the {@link Page list} of matching {@link QueueDetailCto}s. + */ + @Path("/queuedetail/cto/search") + @POST + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo searchCriteriaTo); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/common/api/Visitor.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/common/api/Visitor.java new file mode 100644 index 0000000..72874c4 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/common/api/Visitor.java @@ -0,0 +1,91 @@ +package com.devonfw.application.jtqj.visitormanagement.common.api; + +import com.devonfw.application.jtqj.general.common.api.ApplicationEntity; + +public interface Visitor extends ApplicationEntity { + + /** + * @return usernameId + */ + + public String getUsername(); + + /** + * @param username setter for username attribute + */ + + public void setUsername(String username); + + /** + * @return nameId + */ + + public String getName(); + + /** + * @param name setter for name attribute + */ + + public void setName(String name); + + /** + * @return phoneNumberId + */ + + public String getPhoneNumber(); + + /** + * @param phoneNumber setter for phoneNumber attribute + */ + + public void setPhoneNumber(String phoneNumber); + + /** + * @return passwordId + */ + + public String getPassword(); + + /** + * @param password setter for password attribute + */ + + public void setPassword(String password); + + /** + * @return acceptedCommercialId + */ + + public Boolean getAcceptedCommercial(); + + /** + * @param acceptedCommercial setter for acceptedCommercial attribute + */ + + public void setAcceptedCommercial(Boolean acceptedCommercial); + + /** + * @return acceptedTermsId + */ + + public Boolean getAcceptedTerms(); + + /** + * @param acceptedTerms setter for acceptedTerms attribute + */ + + public void setAcceptedTerms(Boolean acceptedTerms); + + /** + * @return userTypeId + */ + + public Boolean getUserType(); + + /** + * @param userType setter for userType attribute + */ + + public void setUserType(Boolean userType); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/Visitormanagement.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/Visitormanagement.java new file mode 100644 index 0000000..0cc224e --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/Visitormanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.api; + +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcManageVisitor; + +/** + * Interface for Visitormanagement component. + */ +public interface Visitormanagement extends UcFindVisitor, UcManageVisitor { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorEto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorEto.java new file mode 100644 index 0000000..57b3b26 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorEto.java @@ -0,0 +1,191 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.api.to; + +import com.devonfw.application.jtqj.visitormanagement.common.api.Visitor; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of Visitor + */ +public class VisitorEto extends AbstractEto implements Visitor { + + private static final long serialVersionUID = 1L; + + private String username; + + private String name; + + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + @Override + public String getUsername() { + + return username; + } + + @Override + public void setUsername(String username) { + + this.username = username; + } + + @Override + public String getName() { + + return name; + } + + @Override + public void setName(String name) { + + this.name = name; + } + + @Override + public String getPhoneNumber() { + + return phoneNumber; + } + + @Override + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + @Override + public String getPassword() { + + return password; + } + + @Override + public void setPassword(String password) { + + this.password = password; + } + + @Override + public Boolean getAcceptedCommercial() { + + return acceptedCommercial; + } + + @Override + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + @Override + public Boolean getAcceptedTerms() { + + return acceptedTerms; + } + + @Override + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + @Override + public Boolean getUserType() { + + return userType; + } + + @Override + public void setUserType(Boolean userType) { + + this.userType = userType; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.username == null) ? 0 : this.username.hashCode()); + result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); + result = prime * result + ((this.phoneNumber == null) ? 0 : this.phoneNumber.hashCode()); + result = prime * result + ((this.password == null) ? 0 : this.password.hashCode()); + result = prime * result + ((this.acceptedCommercial == null) ? 0 : this.acceptedCommercial.hashCode()); + result = prime * result + ((this.acceptedTerms == null) ? 0 : this.acceptedTerms.hashCode()); + result = prime * result + ((this.userType == null) ? 0 : this.userType.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + VisitorEto other = (VisitorEto) obj; + if (this.username == null) { + if (other.username != null) { + return false; + } + } else if (!this.username.equals(other.username)) { + return false; + } + if (this.name == null) { + if (other.name != null) { + return false; + } + } else if (!this.name.equals(other.name)) { + return false; + } + if (this.phoneNumber == null) { + if (other.phoneNumber != null) { + return false; + } + } else if (!this.phoneNumber.equals(other.phoneNumber)) { + return false; + } + if (this.password == null) { + if (other.password != null) { + return false; + } + } else if (!this.password.equals(other.password)) { + return false; + } + if (this.acceptedCommercial == null) { + if (other.acceptedCommercial != null) { + return false; + } + } else if (!this.acceptedCommercial.equals(other.acceptedCommercial)) { + return false; + } + if (this.acceptedTerms == null) { + if (other.acceptedTerms != null) { + return false; + } + } else if (!this.acceptedTerms.equals(other.acceptedTerms)) { + return false; + } + if (this.userType == null) { + if (other.userType != null) { + return false; + } + } else if (!this.userType.equals(other.userType)) { + return false; + } + return true; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java new file mode 100644 index 0000000..d55345e --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java @@ -0,0 +1,226 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.api.to; + +import com.devonfw.application.jtqj.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of + * {@link com.devonfw.application.jtqj.visitormanagement.common.api.Visitor}s. + */ +public class VisitorSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String username; + + private String name; + + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + private StringSearchConfigTo usernameOption; + + private StringSearchConfigTo nameOption; + + private StringSearchConfigTo phoneNumberOption; + + private StringSearchConfigTo passwordOption; + + /** + * @return usernameId + */ + + public String getUsername() { + + return username; + } + + /** + * @param username setter for username attribute + */ + + public void setUsername(String username) { + + this.username = username; + } + + /** + * @return nameId + */ + + public String getName() { + + return name; + } + + /** + * @param name setter for name attribute + */ + + public void setName(String name) { + + this.name = name; + } + + /** + * @return phoneNumberId + */ + + public String getPhoneNumber() { + + return phoneNumber; + } + + /** + * @param phoneNumber setter for phoneNumber attribute + */ + + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + /** + * @return passwordId + */ + + public String getPassword() { + + return password; + } + + /** + * @param password setter for password attribute + */ + + public void setPassword(String password) { + + this.password = password; + } + + /** + * @return acceptedCommercialId + */ + + public Boolean getAcceptedCommercial() { + + return acceptedCommercial; + } + + /** + * @param acceptedCommercial setter for acceptedCommercial attribute + */ + + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + /** + * @return acceptedTermsId + */ + + public Boolean getAcceptedTerms() { + + return acceptedTerms; + } + + /** + * @param acceptedTerms setter for acceptedTerms attribute + */ + + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + /** + * @return userTypeId + */ + + public Boolean getUserType() { + + return userType; + } + + /** + * @param userType setter for userType attribute + */ + + public void setUserType(Boolean userType) { + + this.userType = userType; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getUsername() username}. + */ + public StringSearchConfigTo getUsernameOption() { + + return this.usernameOption; + } + + /** + * @param usernameOption new value of {@link #getUsernameOption()}. + */ + public void setUsernameOption(StringSearchConfigTo usernameOption) { + + this.usernameOption = usernameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getName() name}. + */ + public StringSearchConfigTo getNameOption() { + + return this.nameOption; + } + + /** + * @param nameOption new value of {@link #getNameOption()}. + */ + public void setNameOption(StringSearchConfigTo nameOption) { + + this.nameOption = nameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getPhoneNumber() phoneNumber}. + */ + public StringSearchConfigTo getPhoneNumberOption() { + + return this.phoneNumberOption; + } + + /** + * @param phoneNumberOption new value of {@link #getPhoneNumberOption()}. + */ + public void setPhoneNumberOption(StringSearchConfigTo phoneNumberOption) { + + this.phoneNumberOption = phoneNumberOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getPassword() password}. + */ + public StringSearchConfigTo getPasswordOption() { + + return this.passwordOption; + } + + /** + * @param passwordOption new value of {@link #getPasswordOption()}. + */ + public void setPasswordOption(StringSearchConfigTo passwordOption) { + + this.passwordOption = passwordOption; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcFindVisitor.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcFindVisitor.java new file mode 100644 index 0000000..3f94f1e --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcFindVisitor.java @@ -0,0 +1,28 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; + +public interface UcFindVisitor { + + /** + * Returns a Visitor by its id 'id'. + * + * @param id The id 'id' of the Visitor. + * @return The {@link VisitorEto} with id 'id' + */ + VisitorEto findVisitor(long id); + + /** + * Returns a paginated list of Visitors matching the search criteria. + * + * @param criteria the {@link VisitorSearchCriteriaTo}. + * @return the {@link List} of matching {@link VisitorEto}s. + */ + Page findVisitors(VisitorSearchCriteriaTo criteria); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcManageVisitor.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcManageVisitor.java new file mode 100644 index 0000000..0e377f3 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/api/usecase/UcManageVisitor.java @@ -0,0 +1,26 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.api.usecase; + +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; + +/** + * Interface of UcManageVisitor to centralize documentation and signatures of methods. + */ +public interface UcManageVisitor { + + /** + * Deletes a visitor from the database by its id 'visitorId'. + * + * @param visitorId Id of the visitor to delete + * @return boolean true if the visitor can be deleted, false otherwise + */ + boolean deleteVisitor(long visitorId); + + /** + * Saves a visitor and store it in the database. + * + * @param visitor the {@link VisitorEto} to create. + * @return the new {@link VisitorEto} that has been saved with ID and version. + */ + VisitorEto saveVisitor(VisitorEto visitor); + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/api/rest/VisitormanagementRestService.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/api/rest/VisitormanagementRestService.java new file mode 100644 index 0000000..84a90bb --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/api/rest/VisitormanagementRestService.java @@ -0,0 +1,65 @@ +package com.devonfw.application.jtqj.visitormanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Visitormanagement}. + */ +@Path("/visitormanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface VisitormanagementRestService { + + /** + * Delegates to {@link Visitormanagement#findVisitor}. + * + * @param id the ID of the {@link VisitorEto} + * @return the {@link VisitorEto} + */ + @GET + @Path("/visitor/{id}/") + public VisitorEto getVisitor(@PathParam("id") long id); + + /** + * Delegates to {@link Visitormanagement#saveVisitor}. + * + * @param visitor the {@link VisitorEto} to be saved + * @return the recently created {@link VisitorEto} + */ + @POST + @Path("/visitor/") + public VisitorEto saveVisitor(VisitorEto visitor); + + /** + * Delegates to {@link Visitormanagement#deleteVisitor}. + * + * @param id ID of the {@link VisitorEto} to be deleted + */ + @DELETE + @Path("/visitor/{id}/") + public void deleteVisitor(@PathParam("id") long id); + + /** + * Delegates to {@link Visitormanagement#findVisitorEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding visitors. + * @return the {@link Page list} of matching {@link VisitorEto}s. + */ + @Path("/visitor/search") + @POST + public Page findVisitors(VisitorSearchCriteriaTo searchCriteriaTo); + +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/test/java/com/devonfw/application/jtqj/ToTest.java b/Raj_Bhushan/jump_java/jtqj1/api/src/test/java/com/devonfw/application/jtqj/ToTest.java new file mode 100644 index 0000000..91c60df --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/test/java/com/devonfw/application/jtqj/ToTest.java @@ -0,0 +1,323 @@ +package com.devonfw.application.jtqj; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.Year; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AssignableTypeFilter; +import org.springframework.util.ReflectionUtils; + +import com.devonfw.module.basic.common.api.reference.IdRef; +import com.devonfw.module.basic.common.api.reflect.Devon4jPackage; +import com.devonfw.module.basic.common.api.to.AbstractTo; +import com.devonfw.module.test.common.base.ModuleTest; + +import nl.jqno.equalsverifier.EqualsVerifier; +import nl.jqno.equalsverifier.EqualsVerifierApi; +import nl.jqno.equalsverifier.Warning; + +public class ToTest extends ModuleTest { + + private static final ToExclusions EXCLUSIONS = new ToExclusions(); + + static { + // EXCLUSIONS.add(MyBusinessEto.class).ignoreEquals().ignoreProperties("foo", "bar"); + } + + /** + * Finds all {@link AbstractTo Transportobjekte} of this app via reflection and tests all getters/setters as well as equals and hashCode. + */ + @Test + public void testTos() { + + List> toClasses = getToClasses(); + SoftAssertions assertion = new SoftAssertions(); + for (Class toClass : toClasses) { + ToExclusion exclusion = EXCLUSIONS.get(toClass.getName()); + testGetSet(toClass, assertion, exclusion); + testEqualsAndHashcode(toClass, assertion, exclusion); + } + assertion.assertAll(); + } + + /** + * Checks if a certain class has a custom equals method + * @param clazz class to be checked + * @return boolean value if the class to be checked has a custom equals() + * method or not + */ + private boolean hasCustomEquals(Class clazz) { + + try { + clazz.getDeclaredMethod("equals", new Class[] {}); + } catch (NoSuchMethodException noCustomEquals) { + return false; + } + + return true; + } + + /** + * Checks if a certain class has a custom hashCode method + * + * @param clazz class to be checked + * @return boolean value if the class to be checked has a custom hashCode() + * method or not + */ + private boolean hasCustomHashCode(Class clazz) { + + try { + clazz.getDeclaredMethod("hashCode", new Class[] { Object.class }); + } catch (NoSuchMethodException noCustomHashCode) { + return false; + } + + return true; + } + + private void testEqualsAndHashcode(Class clazz, SoftAssertions assertion, ToExclusion exclusion) { + + if(!hasCustomEquals(clazz) && !hasCustomHashCode(clazz)) { + return; + } + + if ((exclusion != null) && (exclusion.ignoreEquals)) { + return; + } + EqualsVerifierApi verifier = EqualsVerifier.forClass(clazz).withRedefinedSuperclass().usingGetClass().suppress(Warning.NONFINAL_FIELDS, Warning.INHERITED_DIRECTLY_FROM_OBJECT); + try { + verifier.verify(); + } catch (AssertionError e) { + assertion.fail(e.getMessage(), e); + } + } + + private void testGetSet(Class clazz, SoftAssertions assertion, ToExclusion exclusion) { + + if (!Modifier.isAbstract(clazz.getModifiers())) { + ReflectionUtils.doWithLocalFields(clazz, field -> { + try { + if (isCheckable(clazz, field, exclusion)) { + Object testInstance = clazz.newInstance(); + Method getMethod = null; + Method setMethod = null; + + if (Boolean.class.equals(field.getType()) || boolean.class.equals(field.getType())) { + getMethod = findMethod("is", clazz, field); + if (getMethod == null) { + getMethod = findMethod("get", clazz, field); + } + } else { + getMethod = findMethod("get", clazz, field); + } + setMethod = findMethod("set", clazz, field); + + if (getMethod == null) { + assertion.fail("Getter of field " + clazz.getSimpleName() + "." + field.getName() + " has not been found."); + } else if (setMethod == null) { + assertion.fail("Setter of field " + clazz.getSimpleName() + "." + field.getName() + " has not been found."); + } else { + getMethod.setAccessible(true); + setMethod.setAccessible(true); + + Object value = createTestObject(field); + setMethod.invoke(testInstance, value); + Object value2 = getMethod.invoke(testInstance); + assertion.assertThat(value2).as("Value from getter of field " + clazz.getSimpleName() + "." + field.getName()).isEqualTo(value); + } + } + } catch (Exception e) { + assertion.fail("Error with getter/setter of field " + clazz.getSimpleName() + "." + field.getName() + ": " + + e.getClass().getSimpleName() + ": " + e.getMessage(), e); + } + }); + } + } + + private boolean isCheckable(Class clazz, Field field, ToExclusion exclusion) { + + if (field.getName().startsWith("$") || Modifier.isFinal(field.getModifiers())) { + return false; + } + if (Optional.class.isAssignableFrom(field.getType())) { + return false; + } + if (Modifier.isTransient(field.getModifiers())) { + return false; + } + if ((exclusion != null) && (exclusion.properties.contains(field.getName()))) { + return false; + } + return true; + } + + private Object createTestObject(Field field) throws InstantiationException, IllegalAccessException { + + Class type = field.getType(); + return createInstance(type); + } + + private Object createInstance(Class type) throws InstantiationException, IllegalAccessException { + + Object o = null; + if (type.isEnum()) { + o = type.getEnumConstants()[0]; + } else if (List.class.isAssignableFrom(type)) { + o = new ArrayList<>(); + } else if (Set.class.isAssignableFrom(type)) { + o = new HashSet<>(); + } else if (Map.class.isAssignableFrom(type)) { + o = new HashMap<>(); + } else if (Integer.class.isAssignableFrom(type) || int.class.isAssignableFrom(type)) { + o = Integer.valueOf(1); + } else if (Long.class.isAssignableFrom(type) || long.class.isAssignableFrom(type)) { + o = Long.valueOf(2); + } else if (Boolean.class.isAssignableFrom(type) || boolean.class.isAssignableFrom(type)) { + o = Boolean.TRUE; + } else if (String.class.isAssignableFrom(type)) { + o = "hello world"; + } else if (Year.class.isAssignableFrom(type)) { + o = Year.of(1999); + } else if (Instant.class.isAssignableFrom(type)) { + o = Instant.now(); + } else if (Timestamp.class.isAssignableFrom(type)) { + o = Timestamp.from(Instant.now()); + } else if (type == byte[].class) { + o = "test".getBytes(); + } else if (Serializable.class.equals(type)) { + o = Integer.valueOf(1); + } else if (type == BigDecimal.class) { + o = BigDecimal.ZERO; + } else if (type == BigInteger.class) { + o = BigInteger.ZERO; + } else if (type == Integer.class) { + o = Integer.valueOf(0); + } else if ((type == Long.class) || (type == Number.class)) { + o = Long.valueOf(0); + } else if (type == Double.class) { + o = Double.valueOf(0); + } else if (type == IdRef.class) { + o = IdRef.of(0); + } + return o; + } + + private static Method findMethod(String prefix, Class clazz, Field field) { + + String methodname = prefix + field.getName(); + + return Arrays.asList(ReflectionUtils.getAllDeclaredMethods(clazz)).stream() + .filter(m -> m.getName().equalsIgnoreCase(methodname)).findFirst().orElse(null); + } + + private List> getToClasses() { + + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); + provider.addIncludeFilter(new AssignableTypeFilter(AbstractTo.class)); + + Devon4jPackage pkg = Devon4jPackage.of(ToTest.class); + Set toSet = provider.findCandidateComponents(pkg.getRoot()); + List> toList = new ArrayList<>(toSet.size()); + for (BeanDefinition beanDefinition : toSet) { + String className = beanDefinition.getBeanClassName(); + try { + Class toClass = Class.forName(className); + toList.add(toClass); + } catch (ClassNotFoundException e) { + fail("Class " + className + " could not been found."); + } + } + return toList; + } + + public static class ToExclusions { + + private final Map exclusions; + + public ToExclusions() { + + super(); + this.exclusions = new HashMap<>(); + } + + public ToExclusion add(Class toClass) { + + return add(toClass.getName()); + } + + public ToExclusion add(String toClassQualifiedName) { + + ToExclusion exclusion = new ToExclusion(); + ToExclusion duplicate = this.exclusions.put(toClassQualifiedName, exclusion); + if (duplicate != null) { + throw new IllegalStateException("Doppelte ToExclusion von " + toClassQualifiedName); + } + return exclusion; + } + + public ToExclusion get(String toClassQualifiedName) { + + return this.exclusions.get(toClassQualifiedName); + } + + } + + public static class ToExclusion { + + private Set properties; + + private boolean ignoreEquals; + + public ToExclusion() { + + super(); + this.properties = new HashSet<>(); + this.ignoreEquals = false; + } + + /** + * Ignores the given properties for testing of getters/setters. + * + * @return this + */ + public ToExclusion ignoreProperties(String... props) { + + if (this.properties == null) { + this.properties = new HashSet<>(); + } + for (String property : props) { + this.properties.add(property); + } + return this; + } + + /** + * Ignores this transfer-object for testing of equals and hashCode with {@link EqualsVerifier}. + * + * @return this + */ + public ToExclusion ignoreEquals() { + + this.ignoreEquals = true; + return this; + } + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/pom.xml b/Raj_Bhushan/jump_java/jtqj1/core/pom.xml new file mode 100644 index 0000000..05fb2c4 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/pom.xml @@ -0,0 +1,218 @@ + + + 4.0.0 + + com.devonfw.java.jtqj1 + jtqj1 + 0.0.1 + + jtqj1-core + jar + ${project.artifactId} + Core of the server for the jtqj application - a simple example based on devon4j. + + + + ${project.groupId} + jtqj1-api + ${project.version} + + + + + com.devonfw.java.modules + devon4j-beanmapping-orika + + + + + com.devonfw.java.modules + devon4j-security + + + + com.devonfw.java.modules + devon4j-web + + + + + com.devonfw.java.starters + devon4j-starter-cxf-client-rest + + + + com.devonfw.java.starters + devon4j-starter-cxf-client-ws + + + + + com.devonfw.java.starters + devon4j-starter-cxf-server-rest + + + + com.devonfw.java.starters + devon4j-starter-cxf-server-ws + + + + + com.devonfw.java.starters + devon4j-starter-spring-data-jpa + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + + javax.persistence + javax.persistence-api + + + + + org.hibernate + hibernate-entitymanager + + + + + com.querydsl + querydsl-jpa + + + com.querydsl + querydsl-apt + provided + + + + + org.hibernate.validator + hibernate-validator + + + + + javax.servlet + javax.servlet-api + provided + + + + + javax.el + javax.el-api + + + + + org.springframework + spring-webmvc + + + + + com.h2database + h2 + + + + + org.flywaydb + flyway-core + + + + + org.apache.cxf + cxf-rt-rs-service-description + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework + spring-aop + + + + + cglib + cglib + + + + + net.logstash.logback + logstash-logback-encoder + + + + + com.devonfw.java.modules + devon4j-test-jpa + test + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + + embedded + + true + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + config/application.properties + + + + + + + \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/SpringBootApp.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/SpringBootApp.java new file mode 100644 index 0000000..6f5e995 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/SpringBootApp.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqj; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; + +import com.devonfw.module.jpa.dataaccess.api.AdvancedRevisionEntity; +import com.devonfw.module.jpa.dataaccess.impl.data.GenericRepositoryFactoryBean; + +/** + * Main entry point of this {@link SpringBootApplication}. Simply run this class to start this app. + */ +@SpringBootApplication +@EnableJpaRepositories(repositoryFactoryBeanClass = GenericRepositoryFactoryBean.class) +@EnableGlobalMethodSecurity(jsr250Enabled = true) +public class SpringBootApp { + + /** + * Entry point for spring-boot based app + * + * @param args - arguments + */ + public static void main(String[] args) { + + SpringApplication.run(SpringBootApp.class, args); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java new file mode 100644 index 0000000..ea985c4 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java @@ -0,0 +1,135 @@ +package com.devonfw.application.jtqj.eventmanagement.dataaccess.api; + +import java.time.Duration; + +import javax.persistence.Entity; +import javax.persistence.Table; + +import com.devonfw.application.jtqj.eventmanagement.common.api.Event; +import com.devonfw.application.jtqj.general.dataaccess.api.ApplicationPersistenceEntity; + +/** + * @author rajbhush + */ +@Entity +@Table(name = "Event") +public class EventEntity extends ApplicationPersistenceEntity implements Event { + + private String eventName; + + private String logo; + + private String description; + + private String currentNumber; + + private Duration attentionTime; + + private int customers; + + private static final long serialVersionUID = 1L; + + /** + * @return eventName + */ + @Override + public String getEventName() { + + return this.eventName; + } + + /** + * @param eventName new value of {@link #geteventName}. + */ + @Override + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + /** + * @return logo + */ + @Override + public String getLogo() { + + return this.logo; + } + + /** + * @param logo new value of {@link #getlogo}. + */ + @Override + public void setLogo(String logo) { + + this.logo = logo; + } + + /** + * @return description + */ + @Override + public String getDescription() { + + return this.description; + } + + /** + * @param description new value of {@link #getdescription}. + */ + @Override + public void setDescription(String description) { + + this.description = description; + } + + /** + * @return currentNumber + */ + @Override + public String getCurrentNumber() { + + return this.currentNumber; + } + + /** + * @param currentNumber new value of {@link #getcurrentNumber}. + */ + @Override + public void setCurrentNumber(String currentNumber) { + + this.currentNumber = currentNumber; + } + + /** + * @return customers + */ + @Override + public int getCustomers() { + + return this.customers; + } + + /** + * @param customers new value of {@link #getcustomers}. + */ + @Override + public void setCustomers(int customers) { + + this.customers = customers; + } + + @Override + public void setAttentionTime(Duration attentionTime) { + + this.attentionTime = attentionTime; + + } + + @Override + public Duration getAttentionTime() { + + return this.attentionTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java new file mode 100644 index 0000000..cc6a89b --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java @@ -0,0 +1,127 @@ +package com.devonfw.application.jtqj.eventmanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqj.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link EventEntity} + */ +public interface EventRepository extends DefaultRepository { + + /** + * @param criteria the {@link EventSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link EventEntity} objects that matched the search. If no pageable is set, it will + * return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(EventSearchCriteriaTo criteria) { + + EventEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String eventName = criteria.getEventName(); + if (eventName != null && !eventName.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getEventName()), eventName, criteria.getEventNameOption()); + } + String logo = criteria.getLogo(); + if (logo != null && !logo.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getLogo()), logo, criteria.getLogoOption()); + } + String description = criteria.getDescription(); + if (description != null && !description.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getDescription()), description, criteria.getDescriptionOption()); + } + String currentNumber = criteria.getCurrentNumber(); + if (currentNumber != null && !currentNumber.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getCurrentNumber()), currentNumber, criteria.getCurrentNumberOption()); + } + + Integer customers = criteria.getCustomers(); + if (customers != null) { + query.where($(alias.getCustomers()).eq(customers)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, EventEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "eventName": + if (next.isAscending()) { + query.orderBy($(alias.getEventName()).asc()); + } else { + query.orderBy($(alias.getEventName()).desc()); + } + break; + case "logo": + if (next.isAscending()) { + query.orderBy($(alias.getLogo()).asc()); + } else { + query.orderBy($(alias.getLogo()).desc()); + } + break; + case "description": + if (next.isAscending()) { + query.orderBy($(alias.getDescription()).asc()); + } else { + query.orderBy($(alias.getDescription()).desc()); + } + break; + case "currentNumber": + if (next.isAscending()) { + query.orderBy($(alias.getCurrentNumber()).asc()); + } else { + query.orderBy($(alias.getCurrentNumber()).desc()); + } + break; + case "attentionTime": + if (next.isAscending()) { + query.orderBy($(alias.getAttentionTime()).asc()); + } else { + query.orderBy($(alias.getAttentionTime()).desc()); + } + break; + + case "customers": + if (next.isAscending()) { + query.orderBy($(alias.getCustomers()).asc()); + } else { + query.orderBy($(alias.getCustomers()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/base/usecase/AbstractEventUc.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/base/usecase/AbstractEventUc.java new file mode 100644 index 0000000..60d64f8 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/base/usecase/AbstractEventUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqj.eventmanagement.dataaccess.api.repo.EventRepository; +import com.devonfw.application.jtqj.general.logic.base.AbstractUc; + +/** + * Abstract use case for Events, which provides access to the commonly necessary data access objects. + */ +public class AbstractEventUc extends AbstractUc { + + /** @see #getEventRepository() */ + @Inject + private EventRepository eventRepository; + + /** + * Returns the field 'eventRepository'. + * + * @return the {@link EventRepository} instance. + */ + public EventRepository getEventRepository() { + + return this.eventRepository; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java new file mode 100644 index 0000000..ef339cf --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java @@ -0,0 +1,72 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcManageEvent; +import com.devonfw.application.jtqj.general.logic.base.AbstractComponentFacade; + +/** + * Implementation of component interface of eventmanagement + */ +@Named +public class EventmanagementImpl extends AbstractComponentFacade implements Eventmanagement { + + @Inject + private UcFindEvent ucFindEvent; + + @Inject + private UcManageEvent ucManageEvent; + + @Override + public EventEto findEvent(long id) { + + return this.ucFindEvent.findEvent(id); + } + + @Override + public Page findEvents(EventSearchCriteriaTo criteria) { + + return this.ucFindEvent.findEvents(criteria); + } + + @Override + public EventEto saveEvent(EventEto event) { + + return this.ucManageEvent.saveEvent(event); + } + + @Override + public boolean deleteEvent(long id) { + + return this.ucManageEvent.deleteEvent(id); + } + + @Override + public void decreaseEventCustomer(long eventId) { + + this.ucManageEvent.decreaseEventCustomer(eventId); + + } + + @Override + public void increaseEventCustomer(long eventId) { + + this.ucManageEvent.increaseEventCustomer(eventId); + + } + + @Override + public void increaseCurrentlyAttended(long eventId) { + + this.ucManageEvent.increaseCurrentlyAttended(eventId); + + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcFindEventImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcFindEventImpl.java new file mode 100644 index 0000000..90494cb --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcFindEventImpl.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.impl.usecase; + +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqj.eventmanagement.logic.base.usecase.AbstractEventUc; + +/** + * Use case implementation for searching, filtering and getting Events + */ +@Named +@Validated +@Transactional +public class UcFindEventImpl extends AbstractEventUc implements UcFindEvent { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindEventImpl.class); + + @Override + public EventEto findEvent(long id) { + + LOG.debug("Get Event with id {} from database.", id); + Optional foundEntity = getEventRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), EventEto.class); + else + return null; + } + + @Override + public Page findEvents(EventSearchCriteriaTo criteria) { + + Page events = getEventRepository().findByCriteria(criteria); + return mapPaginatedEntityList(events, EventEto.class); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java new file mode 100644 index 0000000..d7c32bc --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java @@ -0,0 +1,92 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.impl.usecase; + +import java.util.Objects; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.usecase.UcManageEvent; +import com.devonfw.application.jtqj.eventmanagement.logic.base.usecase.AbstractEventUc; + +/** + * Use case implementation for modifying and deleting Events + */ +@Named +@Validated +@Transactional +public class UcManageEventImpl extends AbstractEventUc implements UcManageEvent { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageEventImpl.class); + + @Override + public boolean deleteEvent(long eventId) { + + EventEntity event = getEventRepository().find(eventId); + getEventRepository().delete(event); + LOG.debug("The event with id '{}' has been deleted.", eventId); + return true; + } + + @Override + public EventEto saveEvent(EventEto event) { + + Objects.requireNonNull(event, "event"); + + EventEntity eventEntity = getBeanMapper().map(event, EventEntity.class); + + // initialize, validate eventEntity here if necessary + EventEntity resultEntity = getEventRepository().save(eventEntity); + LOG.debug("Event with id '{}' has been created.", resultEntity.getId()); + return getBeanMapper().map(resultEntity, EventEto.class); + } + + @Override + public void decreaseEventCustomer(long eventId) { + + EventEntity eventEntity = getEventRepository().find(eventId); + + eventEntity.setCustomers(eventEntity.getCustomers() - 1); + getEventRepository().save(eventEntity); + + } + + @Override + public void increaseEventCustomer(long eventId) { + + EventEntity eventEntity = getEventRepository().find(eventId); + eventEntity.setCustomers(eventEntity.getCustomers() + 1); + getEventRepository().save(eventEntity); + + } + + @Override + public void increaseCurrentlyAttended(long eventId) { + + // EventEntity eventEntity = getEventRepository().find(eventId); + // String current = eventEntity.getCurrentNumber(); + // String current1 = current.substring(1); + // int no = Integer.parseInt(current1); + // + // int newQueueDigit = no + 1; + // String newQueueCode = ""; + // StringBuilder stringBuilder = new StringBuilder(); + // stringBuilder.append(newQueueDigit); + // while (stringBuilder.length() < 3) { + // stringBuilder.insert(0, "0"); + // } + // stringBuilder.insert(0, "Q"); + // newQueueCode = stringBuilder.toString(); + // eventEntity.setCurrentNumber(newQueueCode); + // getEventRepository().save(eventEntity); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java new file mode 100644 index 0000000..7e62d52 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java @@ -0,0 +1,46 @@ +package com.devonfw.application.jtqj.eventmanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqj.eventmanagement.service.api.rest.EventmanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Eventmanagement}. + */ +@Named("EventmanagementRestService") +public class EventmanagementRestServiceImpl implements EventmanagementRestService { + + @Inject + private Eventmanagement eventmanagement; + + @Override + public EventEto getEvent(long id) { + + return this.eventmanagement.findEvent(id); + } + + @Override + public EventEto saveEvent(EventEto event) { + + return this.eventmanagement.saveEvent(event); + } + + @Override + public void deleteEvent(long id) { + + this.eventmanagement.deleteEvent(id); + } + + @Override + public Page findEvents(EventSearchCriteriaTo searchCriteriaTo) { + + return this.eventmanagement.findEvents(searchCriteriaTo); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java new file mode 100644 index 0000000..8f48612 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/ApplicationEntity.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqj.general.common.api; + +import com.devonfw.module.basic.common.api.entity.GenericEntity; + +/** + * This is the abstract interface for a {@link GenericEntity}. We are using {@link Long} for all {@link #getId() primary + * keys}. + */ +public abstract interface ApplicationEntity extends GenericEntity { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/security/ApplicationAccessControlConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/security/ApplicationAccessControlConfig.java new file mode 100644 index 0000000..d3b1c47 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/security/ApplicationAccessControlConfig.java @@ -0,0 +1,32 @@ +package com.devonfw.application.jtqj.general.common.api.security; + +import javax.inject.Named; + +import com.devonfw.module.security.common.api.accesscontrol.AccessControlGroup; +import com.devonfw.module.security.common.base.accesscontrol.AccessControlConfig; + +/** + * Example of {@link AccessControlConfig} that used for testing. + */ +@Named +public class ApplicationAccessControlConfig extends AccessControlConfig { + + public static final String APP_ID = "jtqj"; + + private static final String PREFIX = APP_ID + "."; + + public static final String GROUP_READ_MASTER_DATA = PREFIX + "ReadMasterData"; + + public static final String GROUP_ADMIN = PREFIX + "Admin"; + + /** + * The constructor. + */ + public ApplicationAccessControlConfig() { + + super(); + AccessControlGroup readMasterData = group(GROUP_READ_MASTER_DATA); + group(GROUP_ADMIN, readMasterData); + } + +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/EmailExtended.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/EmailExtended.java new file mode 100644 index 0000000..44a4a7a --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/EmailExtended.java @@ -0,0 +1,30 @@ +package com.devonfw.application.jtqj.general.common.api.validation; + +/** + * @author rajbhush + * + */ +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.constraints.Email; +import javax.validation.constraints.Pattern; + +@Email +@Pattern(regexp = ".+@.+\\..+", message = "Email must specify a domain") +@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = {}) +@Documented +public @interface EmailExtended { + String message() default "Please provide a valid email address"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/Phone.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/Phone.java new file mode 100644 index 0000000..42b710d --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/api/validation/Phone.java @@ -0,0 +1,28 @@ +package com.devonfw.application.jtqj.general.common.api.validation; + +/** + * @author rajbhush + * + */ +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.constraints.Pattern; + +@Pattern(regexp = "[789][0-9]{9}", message = "Phone must be valid") +@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = {}) +@Documented +public @interface Phone { + String message() default "Phone must be well formed"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/base/AbstractBeanMapperSupport.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/base/AbstractBeanMapperSupport.java new file mode 100644 index 0000000..3924a02 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/base/AbstractBeanMapperSupport.java @@ -0,0 +1,31 @@ +package com.devonfw.application.jtqj.general.common.base; + +import com.devonfw.module.beanmapping.common.api.BeanMapper; + +import javax.inject.Inject; + +/** + * This abstract class provides {@link #getBeanMapper() access} to the {@link BeanMapper}. + */ +public abstract class AbstractBeanMapperSupport { + + private BeanMapper beanMapper; + + /** + * @param beanMapper is the {@link BeanMapper} to {@link Inject} + */ + @Inject + public void setBeanMapper(BeanMapper beanMapper) { + + this.beanMapper = beanMapper; + } + + /** + * @return the {@link BeanMapper} instance. + */ + protected BeanMapper getBeanMapper() { + + return this.beanMapper; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/ApplicationObjectMapperFactory.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/ApplicationObjectMapperFactory.java new file mode 100644 index 0000000..61d8067 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/ApplicationObjectMapperFactory.java @@ -0,0 +1,51 @@ +package com.devonfw.application.jtqj.general.common.impl.config; + +import javax.inject.Named; + +import org.springframework.security.web.csrf.CsrfToken; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.devonfw.module.json.common.base.ObjectMapperFactory; + + +/** + * The MappingFactory class to resolve polymorphic conflicts within the jtqj application. + */ +@Named("ApplicationObjectMapperFactory") +public class ApplicationObjectMapperFactory extends ObjectMapperFactory { + + /** + * The constructor. + */ + public ApplicationObjectMapperFactory() { + + super(); + // see https://github.com/devonfw/devon4j/blob/develop/documentation/guide-json.asciidoc#json-and-inheritance + SimpleModule module = getExtensionModule(); + module.addAbstractTypeMapping(CsrfToken.class, CsrfTokenImpl.class); + } + + /** + * override createInstance method. + */ + @Override + public ObjectMapper createInstance() { + + ObjectMapper objectMapper = super.createInstance(); + // omit properties in JSON that are null + objectMapper.setSerializationInclusion(Include.NON_NULL); + // Write legacy date/calendar as readable text instead of numeric value + // See + // https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/SerializationFeature.html#WRITE_DATES_AS_TIMESTAMPS + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + // ignore unknown properties in JSON to prevent errors + // e.g. when the service has been updated/extended but the calling REST client is not yet updated + // see https://github.com/devonfw/devon4j/blob/develop/documentation/guide-service-layer.asciidoc#versioning + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/BeansOrikaConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/BeansOrikaConfig.java new file mode 100644 index 0000000..223757f --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/BeansOrikaConfig.java @@ -0,0 +1,14 @@ +package com.devonfw.application.jtqj.general.common.impl.config; + +import org.springframework.context.annotation.Configuration; + +import com.devonfw.module.beanmapping.common.base.BaseOrikaConfig; + +/** + * Java bean configuration for Orika. The method {@link #configureCustomMapping(MapperFactory)} from + * {@link BaseOrikaConfig} can be overridden as per requirements. + */ +@Configuration +public class BeansOrikaConfig extends BaseOrikaConfig { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/CsrfTokenImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/CsrfTokenImpl.java new file mode 100644 index 0000000..920a3b0 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/config/CsrfTokenImpl.java @@ -0,0 +1,60 @@ +package com.devonfw.application.jtqj.general.common.impl.config; + +import org.springframework.security.web.csrf.CsrfToken; + +/** + * Implementation of {@link CsrfToken} as Java bean for JSON deserialization. + */ +public class CsrfTokenImpl implements CsrfToken { + + private static final long serialVersionUID = 1L; + + private String headerName; + + private String parameterName; + + private String token; + + @Override + public String getHeaderName() { + + return this.headerName; + } + + @Override + public String getParameterName() { + + return this.parameterName; + } + + @Override + public String getToken() { + + return this.token; + } + + /** + * @param headerName new value of {@link #getHeaderName()}. + */ + public void setHeaderName(String headerName) { + + this.headerName = headerName; + } + + /** + * @param parameterName new value of {@link #getParameterName()}. + */ + public void setParameterName(String parameterName) { + + this.parameterName = parameterName; + } + + /** + * @param token new value of {@link #getToken()}. + */ + public void setToken(String token) { + + this.token = token; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/BaseUserDetailsService.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/BaseUserDetailsService.java new file mode 100644 index 0000000..537148b --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/BaseUserDetailsService.java @@ -0,0 +1,123 @@ +package com.devonfw.application.jtqj.general.common.impl.security; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import com.devonfw.module.security.common.api.accesscontrol.AccessControl; +import com.devonfw.module.security.common.api.accesscontrol.AccessControlProvider; +import com.devonfw.module.security.common.base.accesscontrol.AccessControlGrantedAuthority; + +/** + * Custom implementation of {@link UserDetailsService}.
+ * + * @see com.devonfw.application.jtqj.general.service.impl.config.BaseWebSecurityConfig + */ +@Named +public class BaseUserDetailsService implements UserDetailsService { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(BaseUserDetailsService.class); + + private AuthenticationManagerBuilder amBuilder; + + private AccessControlProvider accessControlProvider; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + + Set authorities = getAuthorities(username); + UserDetails user; + try { + user = getAmBuilder().getDefaultUserDetailsService().loadUserByUsername(username); + User userData = new User(user.getUsername(), user.getPassword(), authorities); + return userData; + } catch (Exception e) { + e.printStackTrace(); + UsernameNotFoundException exception = new UsernameNotFoundException("Authentication failed.", e); + LOG.warn("Failed to get user {}.", username, exception); + throw exception; + } + } + + /** + * @param username the login of the user + * @return the associated {@link GrantedAuthority}s + * @throws AuthenticationException if no principal is retrievable for the given {@code username} + */ + protected Set getAuthorities(String username) throws AuthenticationException { + + Objects.requireNonNull(username, "username"); + // determine granted authorities for spring-security... + Set authorities = new HashSet<>(); + Collection accessControlIds = getRoles(username); + Set accessControlSet = new HashSet<>(); + for (String id : accessControlIds) { + boolean success = this.accessControlProvider.collectAccessControls(id, accessControlSet); + if (!success) { + LOG.warn("Undefined access control {}.", id); + } + } + for (AccessControl accessControl : accessControlSet) { + authorities.add(new AccessControlGrantedAuthority(accessControl)); + } + return authorities; + } + + private Collection getRoles(String username) { + + Collection roles = new ArrayList<>(); + // TODO for a reasonable application you need to retrieve the roles of the user from a central IAM system + roles.add(username); + return roles; + } + + /** + * @return amBuilder + */ + public AuthenticationManagerBuilder getAmBuilder() { + + return this.amBuilder; + } + + /** + * @param amBuilder new value of {@link #getAmBuilder}. + */ + @Inject + public void setAmBuilder(AuthenticationManagerBuilder amBuilder) { + + this.amBuilder = amBuilder; + } + + /** + * @return accessControlProvider + */ + public AccessControlProvider getAccessControlProvider() { + + return this.accessControlProvider; + } + + /** + * @param accessControlProvider new value of {@link #getAccessControlProvider}. + */ + @Inject + public void setAccessControlProvider(AccessControlProvider accessControlProvider) { + + this.accessControlProvider = accessControlProvider; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/CsrfRequestMatcher.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/CsrfRequestMatcher.java new file mode 100644 index 0000000..44c4a15 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/common/impl/security/CsrfRequestMatcher.java @@ -0,0 +1,54 @@ +package com.devonfw.application.jtqj.general.common.impl.security; + +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.security.web.util.matcher.RequestMatcher; + +/** + * This is the implementation of {@link RequestMatcher}, which decides which {@link HttpServletRequest Requests} require + * a correct CSRF token. + * + * @see Cross-site request forgery + */ +public class CsrfRequestMatcher implements RequestMatcher { + + private static final Pattern HTTP_METHOD_PATTERN = Pattern.compile("^GET$"); + + private static final String[] PATH_PREFIXES_WITHOUT_CSRF_PROTECTION = + { "/login", "/logout", "/services/rest/login", "/websocket" }; + + @Override + public boolean matches(HttpServletRequest request) { + + // GET requests are read-only and therefore do not need CSRF protection + if (HTTP_METHOD_PATTERN.matcher(request.getMethod()).matches()) { + + return false; + } + + // There are specific URLs which can not be protected from CSRF. For example, in case of the the login page, + // the CSRF token can only be accessed after a successful authentication ("login"). + String requestPath = getRequestPath(request); + for (String path : PATH_PREFIXES_WITHOUT_CSRF_PROTECTION) { + if (requestPath.startsWith(path)) { + return false; + } + } + + return true; + } + + private String getRequestPath(HttpServletRequest request) { + + String url = request.getServletPath(); + String pathInfo = request.getPathInfo(); + + if (pathInfo != null) { + url += pathInfo; + } + + return url; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/api/ApplicationPersistenceEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/api/ApplicationPersistenceEntity.java new file mode 100644 index 0000000..4a61e66 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/api/ApplicationPersistenceEntity.java @@ -0,0 +1,86 @@ +package com.devonfw.application.jtqj.general.dataaccess.api; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; +import javax.persistence.Version; + +import com.devonfw.application.jtqj.general.common.api.ApplicationEntity; +import com.devonfw.module.basic.common.api.entity.PersistenceEntity; + +/** + * Abstract base class for all {@link PersistenceEntity persistence entities} with an {@link #getId() id} and a + * {@link #getModificationCounter() modificationCounter} (version) field. All persistence entities of this application + * should inherit from this class. It is using JPA annotations at the getters what has several advantages but also + * implies that you have to annotate transient getter methods with the {@link Transient} annotation. + */ +@MappedSuperclass +public abstract class ApplicationPersistenceEntity implements ApplicationEntity, PersistenceEntity { + + private static final long serialVersionUID = 1L; + + private Long id; + + private int modificationCounter; + + /** + * The constructor. + */ + public ApplicationPersistenceEntity() { + + super(); + } + + @Override + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + + return this.id; + } + + @Override + public void setId(Long id) { + + this.id = id; + } + + @Override + @Version + public int getModificationCounter() { + + return this.modificationCounter; + } + + @Override + public void setModificationCounter(int version) { + + this.modificationCounter = version; + } + + @Override + public String toString() { + + StringBuilder buffer = new StringBuilder(); + toString(buffer); + return buffer.toString(); + } + + /** + * Method to extend {@link #toString()} logic. + * + * @param buffer is the {@link StringBuilder} where to {@link StringBuilder#append(Object) append} the string + * representation. + */ + protected void toString(StringBuilder buffer) { + + buffer.append(getClass().getSimpleName()); + if (this.id != null) { + buffer.append("[id="); + buffer.append(this.id); + buffer.append("]"); + } + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/impl/JpaConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/impl/JpaConfig.java new file mode 100644 index 0000000..9037474 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/dataaccess/impl/JpaConfig.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqj.general.dataaccess.impl; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; +import com.devonfw.module.jpa.dataaccess.api.JpaInitializer; + +/** + * Spring {@link Configuration} for JPA. + */ +@Configuration +@Profile(SpringProfileConstants.NOT_JUNIT) +public class JpaConfig { + + /** + * @return the {@link JpaInitializer} to register the {@link javax.persistence.EntityManager} and make + * {@link com.devonfw.module.jpa.dataaccess.api.JpaHelper} functional. + */ + @Bean + public JpaInitializer jpaInitializer() { + + return new JpaInitializer(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractComponentFacade.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractComponentFacade.java new file mode 100644 index 0000000..4b2d933 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractComponentFacade.java @@ -0,0 +1,16 @@ +package com.devonfw.application.jtqj.general.logic.base; + +/** + * Abstract base class for any component implementation class in this application. + */ +public abstract class AbstractComponentFacade extends AbstractLogic { + + /** + * The constructor. + */ + public AbstractComponentFacade() { + + super(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractLogic.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractLogic.java new file mode 100644 index 0000000..b10479b --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractLogic.java @@ -0,0 +1,127 @@ +package com.devonfw.application.jtqj.general.logic.base; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; + +import com.devonfw.application.jtqj.general.common.base.AbstractBeanMapperSupport; +import com.devonfw.module.basic.common.api.entity.GenericEntity; +import com.devonfw.module.basic.common.api.entity.PersistenceEntity; +import com.devonfw.module.basic.common.api.to.AbstractEto; +import com.devonfw.module.basic.common.api.to.MasterCto; + +/** + * Abstract base class for implementations of business logic in this application. Actual implementations need + * to be annotated with {@link javax.inject.Named}. + * + * @see AbstractUc + * @see AbstractComponentFacade + */ +public abstract class AbstractLogic extends AbstractBeanMapperSupport { + + /** + * The constructor. + */ + public AbstractLogic() { + + super(); + } + + /** + * Creates a {@link Map} with all {@link MasterCto}s from the given {@link Collection} using their + * {@link MasterCto#getEto() main ETO} {@link AbstractEto#getId() ID} as key. All {@link AbstractEto ETO}s being + * {@code null} or without an {@link AbstractEto#getId() ID} will be ignored. + * + * @param is the generic type of the {@link MasterCto}s. + * @param entities is the {@link Collection} of {@link MasterCto}s. + * @return a {@link Map} mapping from {@link AbstractEto#getId() ID} to {@link MasterCto}. + */ + protected static > Map getCtoMap(Collection ctos) { + + Map id2CtoMap = new HashMap<>(); + for (C cto : ctos) { + AbstractEto eto = cto.getEto(); + if (eto != null) { + Long id = eto.getId(); + if (id != null) { + id2CtoMap.put(id, cto); + } + } + } + return id2CtoMap; + } + + /** + * Creates a {@link Map} with all {@link GenericEntity entities} from the given {@link Collection} using their + * {@link GenericEntity#getId() ID} as key. All {@link GenericEntity entities} without an {@link GenericEntity#getId() + * ID} ({@code null}) will be ignored. + * + * @param is the generic type of the {@link GenericEntity#getId() ID}. + * @param is the generic type of the {@link GenericEntity entity}. + * @param entities is the {@link Collection} of {@link GenericEntity entities}. + * @return a {@link Map} mapping from {@link GenericEntity#getId() ID} to {@link GenericEntity entity}. + */ + protected static > Map getEntityMap(Collection entities) { + + Map id2EntityMap = new HashMap<>(); + for (E entity : entities) { + ID id = entity.getId(); + if (id != null) { + id2EntityMap.put(id, entity); + } + } + return id2EntityMap; + } + + /** + * Determines the {@link GenericEntity entities} to delete if currentList is the current list from the + * persistence and listToSave is the new list that shall be saved. In other words this method selects the + * {@link GenericEntity entities} from currentList that are not contained in listToSave. + * + * @param is the generic type of the {@link GenericEntity#getId() ID}. + * @param is the generic type of the {@link GenericEntity entity}. + * @param currentEntities is the {@link Collection} of the {@link GenericEntity entities} currently persisted. We + * assume that all objects in this list have an {@link GenericEntity#getId() ID} value (that is not + * {@code null}). + * @param entitiesToSave is the {@link Collection} that contains the {@link GenericEntity entities} that shall be + * saved. It may contain {@link GenericEntity entities} that have no {@link GenericEntity#getId() ID} that + * shall be newly created. + * @return the {@link List} with the {@link GenericEntity entities} to delete. + */ + protected static > List getEntities2Delete(Collection currentEntities, + Collection entitiesToSave) { + + List result = new ArrayList<>(currentEntities.size()); + Map entityMap = getEntityMap(entitiesToSave); + for (E entity : currentEntities) { + if (!entityMap.containsKey(entity.getId())) { + // entity from currentList is not contained in listToSave... + result.add(entity); + } + } + return result; + } + + /** + * Maps a {@link Page paginated list} of persistent entities to a {@link Page paginated list} of transfer objects. + * + * @param is the generic type of the {@link AbstractTransferObject transfer object}. + * @param is the generic type of the {@link PersistenceEntity entity}. + * @param page is the paginated list to map from. + * @param clazz is the target class to map the paginated entities to. + * @return a {@link Page paginated list of entity transfer objects}. + */ + protected > Page mapPaginatedEntityList(Page page, + Class clazz) { + + List etoList = getBeanMapper().mapList(page.getContent(), clazz); + return new PageImpl<>(etoList, page.getPageable(), page.getTotalElements()); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractUc.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractUc.java new file mode 100644 index 0000000..9b16c73 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/base/AbstractUc.java @@ -0,0 +1,18 @@ +package com.devonfw.application.jtqj.general.logic.base; + +/** + * Abstract base class for any use case in this application. Actual implementations need to be annotated with + * {@link javax.inject.Named}. + * + */ +public abstract class AbstractUc extends AbstractLogic { + + /** + * The constructor. + */ + public AbstractUc() { + + super(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java new file mode 100644 index 0000000..f6096f0 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java @@ -0,0 +1,61 @@ +package com.devonfw.application.jtqj.general.logic.impl.config; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.PriorityOrdered; +import org.springframework.security.access.annotation.Jsr250MethodSecurityMetadataSource; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler; +import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter; + +/** + * This is an implementation of {@link BeanPostProcessor} that allows to change the role prefix of spring-security. By + * default spring-security is magically adding a strange prefix called "ROLE_" to your granted authorities. In order to + * prevent this we use this class with an empty prefix. + */ +public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered { + + private final String rolePrefix; + + /** + * Der Konstruktor. + * + * @param rolePrefix das gewünschte Rollen-Präfix (z.B. der leere String). + */ + public DefaultRolesPrefixPostProcessor(String rolePrefix) { + super(); + this.rolePrefix = rolePrefix; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + + // remove this if you are not using JSR-250 + if (bean instanceof Jsr250MethodSecurityMetadataSource) { + ((Jsr250MethodSecurityMetadataSource) bean).setDefaultRolePrefix(this.rolePrefix); + } + + if (bean instanceof DefaultMethodSecurityExpressionHandler) { + ((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); + } + if (bean instanceof DefaultWebSecurityExpressionHandler) { + ((DefaultWebSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); + } + if (bean instanceof SecurityContextHolderAwareRequestFilter) { + ((SecurityContextHolderAwareRequestFilter) bean).setRolePrefix(this.rolePrefix); + } + return bean; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + + return bean; + } + + @Override + public int getOrder() { + + return PriorityOrdered.HIGHEST_PRECEDENCE; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/BaseWebSecurityConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/BaseWebSecurityConfig.java new file mode 100644 index 0000000..191e932 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/BaseWebSecurityConfig.java @@ -0,0 +1,119 @@ +package com.devonfw.application.jtqj.general.service.impl.config; + +import javax.inject.Inject; +import javax.servlet.Filter; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; +import org.springframework.security.web.csrf.CsrfFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import com.devonfw.module.security.common.impl.rest.AuthenticationSuccessHandlerSendingOkHttpStatusCode; +import com.devonfw.module.security.common.impl.rest.JsonUsernamePasswordAuthenticationFilter; +import com.devonfw.module.security.common.impl.rest.LogoutSuccessHandlerReturningOkHttpStatusCode; + +/** + * This type serves as a base class for extensions of the {@code WebSecurityConfigurerAdapter} and provides a default + * configuration.
+ * Security configuration is based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed + * most simple for two channels of authentication: simple login form and rest-url. + */ +public abstract class BaseWebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Value("${security.cors.enabled}") + boolean corsEnabled = false; + + @Inject + private UserDetailsService userDetailsService; + + @Inject + private PasswordEncoder passwordEncoder; + + private CorsFilter getCorsFilter() { + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("OPTIONS"); + config.addAllowedMethod("HEAD"); + config.addAllowedMethod("GET"); + config.addAllowedMethod("PUT"); + config.addAllowedMethod("POST"); + config.addAllowedMethod("DELETE"); + config.addAllowedMethod("PATCH"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + /** + * Configure spring security to enable a simple webform-login + a simple rest login. + */ + @Override + public void configure(HttpSecurity http) throws Exception { + + http.authorizeRequests().anyRequest().permitAll().and().csrf().disable(); + + if (this.corsEnabled) { + http.addFilterBefore(getCorsFilter(), CsrfFilter.class); + } + } + + /** + * Create a simple filter that allows logout on a REST Url /services/rest/logout and returns a simple HTTP status 200 + * ok. + * + * @return the filter. + */ + protected Filter getSimpleRestLogoutFilter() { + + LogoutFilter logoutFilter = new LogoutFilter(new LogoutSuccessHandlerReturningOkHttpStatusCode(), + new SecurityContextLogoutHandler()); + + // configure logout for rest logouts + logoutFilter.setLogoutRequestMatcher(new AntPathRequestMatcher("/services/rest/logout")); + + return logoutFilter; + } + + /** + * Create a simple authentication filter for REST logins that reads user-credentials from a json-parameter and returns + * status 200 instead of redirect after login. + * + * @return the {@link JsonUsernamePasswordAuthenticationFilter}. + * @throws Exception if something goes wrong. + */ + protected JsonUsernamePasswordAuthenticationFilter getSimpleRestAuthenticationFilter() throws Exception { + + JsonUsernamePasswordAuthenticationFilter jsonFilter = new JsonUsernamePasswordAuthenticationFilter( + new AntPathRequestMatcher("/services/rest/login")); + jsonFilter.setPasswordParameter("j_password"); + jsonFilter.setUsernameParameter("j_username"); + jsonFilter.setAuthenticationManager(authenticationManager()); + // set failurehandler that uses no redirect in case of login failure; just HTTP-status: 401 + jsonFilter.setAuthenticationManager(authenticationManagerBean()); + jsonFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler()); + // set successhandler that uses no redirect in case of login success; just HTTP-status: 200 + jsonFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandlerSendingOkHttpStatusCode()); + return jsonFilter; + } + + @SuppressWarnings("javadoc") + @Inject + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + + auth.inMemoryAuthentication().withUser("admin").password(this.passwordEncoder.encode("admin")).roles("Admin"); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/ServletInitializer.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/ServletInitializer.java new file mode 100644 index 0000000..f9fa0de --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/ServletInitializer.java @@ -0,0 +1,23 @@ +package com.devonfw.application.jtqj.general.service.impl.config; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Configuration; + +import com.devonfw.application.jtqj.SpringBootApp; + +/** + * This auto configuration will be used by spring boot to enable traditional deployment to a servlet container. You may + * remove this class if you run your application with embedded tomcat only. Tomcat startup will be twice as fast. + */ +@Configuration +@EnableAutoConfiguration +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + + return application.sources(SpringBootApp.class); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebConfig.java new file mode 100644 index 0000000..711f0ba --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebConfig.java @@ -0,0 +1,80 @@ +package com.devonfw.application.jtqj.general.service.impl.config; + +import javax.servlet.Filter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.CharacterEncodingFilter; + +import com.devonfw.module.logging.common.api.DiagnosticContextFacade; +import com.devonfw.module.logging.common.impl.DiagnosticContextFacadeImpl; +import com.devonfw.module.logging.common.impl.DiagnosticContextFilter; +import com.devonfw.module.logging.common.impl.PerformanceLogFilter; +import com.devonfw.module.service.common.api.constants.ServiceConstants; + +/** + * Registers a number of filters for web requests. + */ +@Configuration +public class WebConfig { + + private @Autowired AutowireCapableBeanFactory beanFactory; + + /** + * @return the {@link FilterRegistrationBean} to register the {@link PerformanceLogFilter} that will log all requests + * with their duration and status code. + */ + @Bean + public FilterRegistrationBean performanceLogFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + Filter performanceLogFilter = new PerformanceLogFilter(); + this.beanFactory.autowireBean(performanceLogFilter); + registration.setFilter(performanceLogFilter); + registration.addUrlPatterns("/*"); + return registration; + } + + /** + * @return the {@link DiagnosticContextFacade} implementation. + */ + @Bean(name = "DiagnosticContextFacade") + public DiagnosticContextFacade diagnosticContextFacade() { + + return new DiagnosticContextFacadeImpl(); + } + + /** + * @return the {@link FilterRegistrationBean} to register the {@link DiagnosticContextFilter} that adds the + * correlation id as MDC so it will be included in all associated logs. + */ + @Bean + public FilterRegistrationBean diagnosticContextFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + Filter diagnosticContextFilter = new DiagnosticContextFilter(); + this.beanFactory.autowireBean(diagnosticContextFilter); + registration.setFilter(diagnosticContextFilter); + registration.addUrlPatterns(ServiceConstants.URL_PATH_SERVICES + "/*"); + return registration; + } + + /** + * @return the {@link FilterRegistrationBean} to register the {@link CharacterEncodingFilter} to set the encoding. + */ + @Bean + public FilterRegistrationBean setCharacterEncodingFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); + characterEncodingFilter.setEncoding("UTF-8"); + characterEncodingFilter.setForceEncoding(false); + this.beanFactory.autowireBean(characterEncodingFilter); + registration.setFilter(characterEncodingFilter); + registration.addUrlPatterns("/*"); + return registration; + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityBeansConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityBeansConfig.java new file mode 100644 index 0000000..99b4068 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityBeansConfig.java @@ -0,0 +1,52 @@ +package com.devonfw.application.jtqj.general.service.impl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.csrf.CsrfTokenRepository; +import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; + +import com.devonfw.application.jtqj.general.logic.impl.config.DefaultRolesPrefixPostProcessor; + +/** + * This configuration class provides factory methods for several Spring security related beans. + */ +@Configuration +public class WebSecurityBeansConfig { + + /** + * This method provides a new instance of {@code CsrfTokenRepository} + * + * @return the newly created {@code CsrfTokenRepository} + */ + @Bean + public CsrfTokenRepository csrfTokenRepository() { + + return new HttpSessionCsrfTokenRepository(); + } + + /** + * This method provides a new instance of {@code DefaultRolesPrefixPostProcessor} + * + * @return the newly create {@code DefaultRolesPrefixPostProcessor} + */ + @Bean + public static DefaultRolesPrefixPostProcessor defaultRolesPrefixPostProcessor() { + + // By default Spring-Security is setting the prefix "ROLE_" for all permissions/authorities. + // We disable this undesired behavior here... + return new DefaultRolesPrefixPostProcessor(""); + } + + /** + * This method provide a new instance of {@code DelegatingPasswordEncoder} + * + * @return the newly create {@code DelegatingPasswordEncoder} + */ + @Bean + public PasswordEncoder passwordEncoder() { + + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityConfig.java new file mode 100644 index 0000000..efd1389 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/config/WebSecurityConfig.java @@ -0,0 +1,21 @@ +package com.devonfw.application.jtqj.general.service.impl.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; + +/** + * Security configuration based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed most + * simple for two channels of authentication: simple login form and rest-url. (Copied from + * {@link com.devonfw.application.jtqj.general.service.impl.config.BaseWebSecurityConfig} + * + */ +@Configuration +@EnableWebSecurity +@Profile(SpringProfileConstants.NOT_JUNIT) +public class WebSecurityConfig extends BaseWebSecurityConfig { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/rest/ApplicationAccessDeniedHandler.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/rest/ApplicationAccessDeniedHandler.java new file mode 100644 index 0000000..4ffd23b --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/general/service/impl/rest/ApplicationAccessDeniedHandler.java @@ -0,0 +1,46 @@ +package com.devonfw.application.jtqj.general.service.impl.rest; + +import com.devonfw.module.rest.service.impl.RestServiceExceptionFacade; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Response; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +/** + * Implementation of {@link AccessDeniedHandler}. + */ +@Named("ApplicationAccessDeniedHandler") +public class ApplicationAccessDeniedHandler implements AccessDeniedHandler { + + private RestServiceExceptionFacade exceptionFacade; + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException, ServletException { + + Response restResponse = this.exceptionFacade.toResponse(accessDeniedException); + Object entity = restResponse.getEntity(); + response.setStatus(restResponse.getStatus()); + if (entity != null) { + response.getWriter().write(entity.toString()); + } + } + + /** + * @param exceptionFacade the {@link RestServiceExceptionFacade} to inject. + */ + @Inject + public void setExceptionFacade(RestServiceExceptionFacade exceptionFacade) { + + this.exceptionFacade = exceptionFacade; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java new file mode 100644 index 0000000..fbb37d8 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java @@ -0,0 +1,213 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api; + +import java.sql.Timestamp; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Size; + +import com.devonfw.application.jtqj.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqj.general.dataaccess.api.ApplicationPersistenceEntity; +import com.devonfw.application.jtqj.queuedetailmanagement.common.api.QueueDetail; +import com.devonfw.application.jtqj.visitormanagement.dataaccess.api.VisitorEntity; + +/** + * @author rajbhush + */ +@Entity +@Table(name = "QueueDetail") +public class QueueDetailEntity extends ApplicationPersistenceEntity implements QueueDetail { + + @Size(min = 2, max = 5) + private String queueNumber; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp creationTime; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp startTime; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp endTime; + + private String minEstimatedTime; + + private VisitorEntity visitor; + + private EventEntity event; + + private static final long serialVersionUID = 1L; + + /** + * @return queueNumber + */ + @Override + public String getQueueNumber() { + + return this.queueNumber; + } + + /** + * @param queueNumber new value of {@link #getqueueNumber}. + */ + @Override + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + /** + * @return creationTime + */ + @Override + public Timestamp getCreationTime() { + + return this.creationTime; + } + + /** + * @param creationTime new value of {@link #getcreationTime}. + */ + @Override + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + /** + * @return startTime + */ + @Override + public Timestamp getStartTime() { + + return this.startTime; + } + + /** + * @param startTime new value of {@link #getstartTime}. + */ + @Override + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + /** + * @return endTime + */ + @Override + public Timestamp getEndTime() { + + return this.endTime; + } + + /** + * @param endTime new value of {@link #getendTime}. + */ + @Override + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + /** + * @return visitor + */ + @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER) + @JoinColumn(name = "idVisitor") + public VisitorEntity getVisitor() { + + return this.visitor; + } + + /** + * @param visitor new value of {@link #getvisitor}. + */ + public void setVisitor(VisitorEntity visitor) { + + this.visitor = visitor; + } + + /** + * @return event + */ + @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER) + @JoinColumn(name = "idEvent") + public EventEntity getEvent() { + + return this.event; + } + + /** + * @param event new value of {@link #getevent}. + */ + public void setEvent(EventEntity event) { + + this.event = event; + } + + @Override + @Transient + public Long getVisitorId() { + + if (this.visitor == null) { + return null; + } + return this.visitor.getId(); + } + + @Override + public void setVisitorId(Long visitorId) { + + if (visitorId == null) { + this.visitor = null; + } else { + VisitorEntity visitorEntity = new VisitorEntity(); + visitorEntity.setId(visitorId); + this.visitor = visitorEntity; + } + } + + @Override + @Transient + public Long getEventId() { + + if (this.event == null) { + return null; + } + return this.event.getId(); + } + + @Override + public void setEventId(Long eventId) { + + if (eventId == null) { + this.event = null; + } else { + EventEntity eventEntity = new EventEntity(); + eventEntity.setId(eventId); + this.event = eventEntity; + } + } + + @Override + public void setMinEstimatedTime(String i) { + + this.minEstimatedTime = i; + + } + + @Override + public String getMinEstimatedTime() { + + return this.minEstimatedTime; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java new file mode 100644 index 0000000..02f1161 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java @@ -0,0 +1,130 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.sql.Timestamp; +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link QueueDetailEntity} + */ +public interface QueueDetailRepository extends DefaultRepository { + + /** + * @param criteria the {@link QueueDetailSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link QueueDetailEntity} objects that matched the search. If no pageable is set, + * it will return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(QueueDetailSearchCriteriaTo criteria) { + + QueueDetailEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String queueNumber = criteria.getQueueNumber(); + if (queueNumber != null && !queueNumber.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getQueueNumber()), queueNumber, criteria.getQueueNumberOption()); + } + Timestamp creationTime = criteria.getCreationTime(); + if (creationTime != null) { + query.where($(alias.getCreationTime()).eq(creationTime)); + } + Timestamp startTime = criteria.getStartTime(); + if (startTime != null) { + query.where($(alias.getStartTime()).eq(startTime)); + } + Timestamp endTime = criteria.getEndTime(); + if (endTime != null) { + query.where($(alias.getEndTime()).eq(endTime)); + } + Long visitor = criteria.getVisitorId(); + if (visitor != null) { + query.where($(alias.getVisitor().getId()).eq(visitor)); + } + Long event = criteria.getEventId(); + if (event != null) { + query.where($(alias.getEvent().getId()).eq(event)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, QueueDetailEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "queueNumber": + if (next.isAscending()) { + query.orderBy($(alias.getQueueNumber()).asc()); + } else { + query.orderBy($(alias.getQueueNumber()).desc()); + } + break; + case "creationTime": + if (next.isAscending()) { + query.orderBy($(alias.getCreationTime()).asc()); + } else { + query.orderBy($(alias.getCreationTime()).desc()); + } + break; + case "startTime": + if (next.isAscending()) { + query.orderBy($(alias.getStartTime()).asc()); + } else { + query.orderBy($(alias.getStartTime()).desc()); + } + break; + case "endTime": + if (next.isAscending()) { + query.orderBy($(alias.getEndTime()).asc()); + } else { + query.orderBy($(alias.getEndTime()).desc()); + } + break; + case "visitor": + if (next.isAscending()) { + query.orderBy($(alias.getVisitor().getId().toString()).asc()); + } else { + query.orderBy($(alias.getVisitor().getId().toString()).desc()); + } + break; + case "event": + if (next.isAscending()) { + query.orderBy($(alias.getEvent().getId().toString()).asc()); + } else { + query.orderBy($(alias.getEvent().getId().toString()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java new file mode 100644 index 0000000..f776a95 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqj.general.logic.base.AbstractUc; +import com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.repo.QueueDetailRepository; + +/** + * Abstract use case for QueueDetails, which provides access to the commonly necessary data access objects. + */ +public class AbstractQueueDetailUc extends AbstractUc { + + /** @see #getQueueDetailRepository() */ + @Inject + private QueueDetailRepository queueDetailRepository; + + /** + * Returns the field 'queueDetailRepository'. + * + * @return the {@link QueueDetailRepository} instance. + */ + public QueueDetailRepository getQueueDetailRepository() { + + return this.queueDetailRepository; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java new file mode 100644 index 0000000..1cf4137 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java @@ -0,0 +1,84 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.general.logic.base.AbstractComponentFacade; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; + +/** + * Implementation of component interface of queuedetailmanagement + */ +@Named +public class QueuedetailmanagementImpl extends AbstractComponentFacade implements Queuedetailmanagement { + + @Inject + private UcFindQueueDetail ucFindQueueDetail; + + @Inject + private UcManageQueueDetail ucManageQueueDetail; + + @Override + public QueueDetailEto findQueueDetail(long id) { + + return this.ucFindQueueDetail.findQueueDetail(id); + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetails(criteria); + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail) { + + return this.ucManageQueueDetail.saveQueueDetail(queuedetail); + } + + @Override + public QueueDetailCto findQueueDetailCto(long id) { + + return this.ucFindQueueDetail.findQueueDetailCto(id); + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetailCtos(criteria); + } + + @Override + public Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetailEtos(criteria); + } + + @Override + public void deleteQueueDetail(long queueDetailId) { + + this.ucManageQueueDetail.deleteQueueDetail(queueDetailId); + + } + + @Override + public QueueDetailEto joinQueue(QueueDetailEto queueDetail) { + + return this.ucManageQueueDetail.joinQueue(queueDetail); + } + + @Override + public void leaveQueue(long queueDetailId) { + + this.ucManageQueueDetail.leaveQueue(queueDetailId); + + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java new file mode 100644 index 0000000..c7f26de --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java @@ -0,0 +1,95 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.impl.usecase; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.base.usecase.AbstractQueueDetailUc; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; + +/** + * Use case implementation for searching, filtering and getting QueueDetails + */ +@Named +@Validated +@Transactional +public class UcFindQueueDetailImpl extends AbstractQueueDetailUc implements UcFindQueueDetail { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindQueueDetailImpl.class); + + @Override + public QueueDetailEto findQueueDetail(long id) { + + LOG.debug("Get QueueDetail with id {} from database.", id); + Optional foundEntity = getQueueDetailRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), QueueDetailEto.class); + else + return null; + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo criteria) { + + Page queuedetails = getQueueDetailRepository().findByCriteria(criteria); + return mapPaginatedEntityList(queuedetails, QueueDetailEto.class); + } + + @Override + public QueueDetailCto findQueueDetailCto(long id) { + + LOG.debug("Get QueueDetailCto with id {} from database.", id); + QueueDetailEntity entity = getQueueDetailRepository().find(id); + QueueDetailCto cto = new QueueDetailCto(); + cto.setQueueDetail(getBeanMapper().map(entity, QueueDetailEto.class)); + cto.setVisitor(getBeanMapper().map(entity.getVisitor(), VisitorEto.class)); + cto.setEvent(getBeanMapper().map(entity.getEvent(), EventEto.class)); + + return cto; + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria) { + + Page queuedetails = getQueueDetailRepository().findByCriteria(criteria); + List ctos = new ArrayList<>(); + for (QueueDetailEntity entity : queuedetails.getContent()) { + QueueDetailCto cto = new QueueDetailCto(); + cto.setQueueDetail(getBeanMapper().map(entity, QueueDetailEto.class)); + cto.setVisitor(getBeanMapper().map(entity.getVisitor(), VisitorEto.class)); + cto.setEvent(getBeanMapper().map(entity.getEvent(), EventEto.class)); + ctos.add(cto); + } + Pageable pagResultTo = PageRequest.of(criteria.getPageable().getPageNumber(), criteria.getPageable().getPageSize()); + + return new PageImpl<>(ctos, pagResultTo, queuedetails.getTotalElements()); + } + + @Override + public Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria) { + + Page queueDetails = getQueueDetailRepository().findByCriteria(criteria); + return mapPaginatedEntityList(queueDetails, QueueDetailEto.class); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java new file mode 100644 index 0000000..9e7d453 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java @@ -0,0 +1,167 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.impl.usecase; + +import java.sql.Timestamp; +import java.time.Instant; +import java.util.List; +import java.util.Objects; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.base.usecase.AbstractQueueDetailUc; + +/** + * Use case implementation for modifying and deleting QueueDetails + */ +@Named +@Validated +@Transactional +public class UcManageQueueDetailImpl extends AbstractQueueDetailUc implements UcManageQueueDetail { + + @Inject + private Eventmanagement eventmanagement; + + @Inject + private Queuedetailmanagement queuedetailmanagement; + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageQueueDetailImpl.class); + + @Override + public void deleteQueueDetail(long queueDetailId) { + + // long eventId = getQueueDetailRepository().find(queueDetailId).getEventId(); + // this.eventmanagement.decreaseEventCustomer(eventId); + // LOG.debug("The event with id '{}' has decreased its customers.", eventId); + // + // // then we delete the queueDetail + // getQueueDetailRepository().deleteById(queueDetailId); + // LOG.debug("The queuedetail with id '{}' has been deleted.", queueDetailId); + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetail) { + + return Objects.requireNonNull(queueDetail, "queueDetail"); + } + + /** + * Generates a new queue code using the queue digit of the last codeaccess created. + * + * @param lastQueueDigit the int of the last codeaccess created. + * @return the String with the new queue code (example: 'Q007'). + */ + public String generateQueueNumber(int lastQueueDigit) { + + int newQueueDigit = lastQueueDigit + 1; + String newQueueCode = ""; + if (newQueueDigit == 1000) { + newQueueCode = "Q000"; + } else { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(newQueueDigit); + while (stringBuilder.length() < 3) { + stringBuilder.insert(0, "0"); + } + stringBuilder.insert(0, "Q"); + newQueueCode = stringBuilder.toString(); + } + return newQueueCode; + } + + public Eventmanagement getEventmanagement() { + + return this.eventmanagement; + } + + public Queuedetailmanagement getQueuedetailmanagement() { + + return this.queuedetailmanagement; + } + + @Override + public QueueDetailEto joinQueue(QueueDetailEto queueDetail) { + + QueueDetailEntity queueDetailEntity = getBeanMapper().map(queueDetail, QueueDetailEntity.class); + + long eventEntityId = queueDetailEntity.getEventId(); + long visitorEntityId = queueDetailEntity.getVisitorId(); + System.out.println(eventEntityId); + System.out.println(visitorEntityId); + QueueDetailSearchCriteriaTo queueDetailSearchcriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailSearchcriteriaTo.setEventId(eventEntityId); + // queueDetailSearchcriteriaTo.setVisitorId(visitorEntityId); + Pageable pageable = PageRequest.of(0, 1000); + queueDetailSearchcriteriaTo.setPageable(pageable); + + List queueDetailEtosInEvent = getQueuedetailmanagement() + .findQueueDetailEtos(queueDetailSearchcriteriaTo).getContent(); + // if there are no ETOs, we set the ticket to the first code + // else we get the digit of the last ticket in the list and generate a new code for the ticket + if (queueDetailEtosInEvent.isEmpty()) { + queueDetailEntity.setQueueNumber("Q001"); + } else { + QueueDetailEto lastQueueDetail = queueDetailEtosInEvent.get(queueDetailEtosInEvent.size() - 1); + int lastQueueDigit = Integer.parseInt(lastQueueDetail.getQueueNumber().substring(1)); + queueDetailEntity.setQueueNumber(generateQueueNumber(lastQueueDigit)); + } + queueDetailEntity.setCreationTime(Timestamp.from(Instant.now())); + queueDetailEntity.setStartTime(null); + queueDetailEntity.setEndTime(null); + queueDetailEntity.setMinEstimatedTime(getEstimatedTime(eventEntityId, queueDetailEntity.getQueueNumber())); + + // save access code + QueueDetailEntity queueDetailEntitySaved = getQueueDetailRepository().save(queueDetailEntity); + + LOG.debug("The queuedetail with id '{}' has been saved.", queueDetailEntitySaved.getId()); + /** + * Using the method getEventmanagement() gives access to the methods that were created earlier in the usecasemanage + * (inside the event component). This is done so each component takes care of its own modifications. + */ + getEventmanagement().increaseEventCustomer(queueDetailEntitySaved.getEventId()); + LOG.debug("The event with id '{}' has increased its customers.", queueDetailEntitySaved.getEventId()); + return getBeanMapper().map(queueDetailEntitySaved, QueueDetailEto.class); + + } + + private String getEstimatedTime(long eventId, String queueNo) { + + String currentlyAttended = getEventmanagement().findEvent(eventId).getCurrentNumber(); + // System.out.println(currentlyAttended); + int currently = Integer.parseInt(currentlyAttended.substring(1)); + int queue = Integer.parseInt(queueNo.substring(1)); + // System.out.println(queue); + int result = (queue - currently) * 120; + // System.out.println(result); + return Integer.toString(result); + } + + @Override + public void leaveQueue(long queueDetailId) { + + long eventId = getQueueDetailRepository().find(queueDetailId).getEventId(); + this.eventmanagement.decreaseEventCustomer(eventId); + this.eventmanagement.increaseCurrentlyAttended(eventId); + LOG.debug("The event with id '{}' has decreased its customers.", eventId); + + // then we delete the queueDetail + getQueueDetailRepository().deleteById(queueDetailId); + LOG.debug("The queuedetail with id '{}' has been deleted.", queueDetailId); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java new file mode 100644 index 0000000..c338ab7 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java @@ -0,0 +1,78 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqj.queuedetailmanagement.service.api.rest.QueuedetailmanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Queuedetailmanagement}. + */ +@Named("QueuedetailmanagementRestService") +public class QueuedetailmanagementRestServiceImpl implements QueuedetailmanagementRestService { + + @Inject + private Queuedetailmanagement queuedetailmanagement; + + @Override + public QueueDetailEto getQueueDetail(long id) { + + return this.queuedetailmanagement.findQueueDetail(id); + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail) { + + return this.queuedetailmanagement.saveQueueDetail(queuedetail); + } + + @Override + public void deleteQueueDetail(long id) { + + this.queuedetailmanagement.deleteQueueDetail(id); + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo searchCriteriaTo) { + + return this.queuedetailmanagement.findQueueDetails(searchCriteriaTo); + } + + @Override + public QueueDetailCto getQueueDetailCto(long id) { + + return this.queuedetailmanagement.findQueueDetailCto(id); + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo searchCriteriaTo) { + + return this.queuedetailmanagement.findQueueDetailCtos(searchCriteriaTo); + } + + @Override + public Page findQueueDetailsEtos(QueueDetailSearchCriteriaTo searchCriteriaTo) { + + return this.queuedetailmanagement.findQueueDetailEtos(searchCriteriaTo); + } + + @Override + public QueueDetailEto joinQueue(QueueDetailEto queuedetail) { + + return this.queuedetailmanagement.joinQueue(queuedetail); + } + + @Override + public void leaveQueue(long id) { + + this.queuedetailmanagement.leaveQueue(id); + + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/VisitorEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/VisitorEntity.java new file mode 100644 index 0000000..4d9a5b9 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/VisitorEntity.java @@ -0,0 +1,166 @@ +package com.devonfw.application.jtqj.visitormanagement.dataaccess.api; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.devonfw.application.jtqj.general.common.api.validation.EmailExtended; +import com.devonfw.application.jtqj.general.common.api.validation.Phone; +import com.devonfw.application.jtqj.general.dataaccess.api.ApplicationPersistenceEntity; +import com.devonfw.application.jtqj.visitormanagement.common.api.Visitor; + +/** + * @author rajbhush + */ +@Entity +@Table(name = "Visitor") +public class VisitorEntity extends ApplicationPersistenceEntity implements Visitor { + + @NotNull + @EmailExtended + private String username; + + @NotNull + private String name; + + @NotNull + @Phone + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + private static final long serialVersionUID = 1L; + + /** + * @return the username + */ + @Override + public String getUsername() { + + return this.username; + } + + /** + * @param username the username to set + */ + @Override + public void setUsername(String username) { + + this.username = username; + } + + /** + * @return the name + */ + @Override + public String getName() { + + return this.name; + } + + /** + * @param name the name to set + */ + @Override + public void setName(String name) { + + this.name = name; + } + + /** + * @return the phoneNumber + */ + @Override + public String getPhoneNumber() { + + return this.phoneNumber; + } + + /** + * @param phoneNumber the phoneNumber to set + */ + @Override + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + /** + * @return the password + */ + @Override + public String getPassword() { + + return this.password; + } + + /** + * @param password the password to set + */ + @Override + public void setPassword(String password) { + + this.password = password; + } + + /** + * @return the acceptedCommercial + */ + @Override + public Boolean getAcceptedCommercial() { + + return this.acceptedCommercial; + } + + /** + * @param acceptedCommercial the acceptedCommercial to set + */ + @Override + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + /** + * @return the acceptedTerms + */ + @Override + public Boolean getAcceptedTerms() { + + return this.acceptedTerms; + } + + /** + * @param acceptedTerms the acceptedTerms to set + */ + @Override + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + /** + * @return the userType + */ + @Override + public Boolean getUserType() { + + return this.userType; + } + + /** + * @param userType the userType to set + */ + @Override + public void setUserType(Boolean userType) { + + this.userType = userType; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/repo/VisitorRepository.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/repo/VisitorRepository.java new file mode 100644 index 0000000..d58b338 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/dataaccess/api/repo/VisitorRepository.java @@ -0,0 +1,145 @@ +package com.devonfw.application.jtqj.visitormanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqj.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link VisitorEntity} + */ +public interface VisitorRepository extends DefaultRepository { + + /** + * @param criteria the {@link VisitorSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link VisitorEntity} objects that matched the search. If no pageable is set, it + * will return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(VisitorSearchCriteriaTo criteria) { + + VisitorEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String username = criteria.getUsername(); + if (username != null && !username.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getUsername()), username, criteria.getUsernameOption()); + } + String name = criteria.getName(); + if (name != null && !name.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getName()), name, criteria.getNameOption()); + } + String phoneNumber = criteria.getPhoneNumber(); + if (phoneNumber != null && !phoneNumber.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getPhoneNumber()), phoneNumber, criteria.getPhoneNumberOption()); + } + String password = criteria.getPassword(); + if (password != null && !password.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getPassword()), password, criteria.getPasswordOption()); + } + Boolean acceptedCommercial = criteria.getAcceptedCommercial(); + if (acceptedCommercial != null) { + query.where($(alias.getAcceptedCommercial()).eq(acceptedCommercial)); + } + Boolean acceptedTerms = criteria.getAcceptedTerms(); + if (acceptedTerms != null) { + query.where($(alias.getAcceptedTerms()).eq(acceptedTerms)); + } + Boolean userType = criteria.getUserType(); + if (userType != null) { + query.where($(alias.getUserType()).eq(userType)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, VisitorEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "username": + if (next.isAscending()) { + query.orderBy($(alias.getUsername()).asc()); + } else { + query.orderBy($(alias.getUsername()).desc()); + } + break; + case "name": + if (next.isAscending()) { + query.orderBy($(alias.getName()).asc()); + } else { + query.orderBy($(alias.getName()).desc()); + } + break; + case "phoneNumber": + if (next.isAscending()) { + query.orderBy($(alias.getPhoneNumber()).asc()); + } else { + query.orderBy($(alias.getPhoneNumber()).desc()); + } + break; + case "password": + if (next.isAscending()) { + query.orderBy($(alias.getPassword()).asc()); + } else { + query.orderBy($(alias.getPassword()).desc()); + } + break; + case "acceptedCommercial": + if (next.isAscending()) { + query.orderBy($(alias.getAcceptedCommercial()).asc()); + } else { + query.orderBy($(alias.getAcceptedCommercial()).desc()); + } + break; + case "acceptedTerms": + if (next.isAscending()) { + query.orderBy($(alias.getAcceptedTerms()).asc()); + } else { + query.orderBy($(alias.getAcceptedTerms()).desc()); + } + break; + case "userType": + if (next.isAscending()) { + query.orderBy($(alias.getUserType()).asc()); + } else { + query.orderBy($(alias.getUserType()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + + /** + * @param visitorEto + * @return + */ + +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/base/usecase/AbstractVisitorUc.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/base/usecase/AbstractVisitorUc.java new file mode 100644 index 0000000..f2b7bf0 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/base/usecase/AbstractVisitorUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqj.general.logic.base.AbstractUc; +import com.devonfw.application.jtqj.visitormanagement.dataaccess.api.repo.VisitorRepository; + +/** + * Abstract use case for Visitors, which provides access to the commonly necessary data access objects. + */ +public class AbstractVisitorUc extends AbstractUc { + + /** @see #getVisitorRepository() */ + @Inject + private VisitorRepository visitorRepository; + + /** + * Returns the field 'visitorRepository'. + * + * @return the {@link VisitorRepository} instance. + */ + public VisitorRepository getVisitorRepository() { + + return this.visitorRepository; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementImpl.java new file mode 100644 index 0000000..4e7ccf7 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementImpl.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.general.logic.base.AbstractComponentFacade; +import com.devonfw.application.jtqj.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcManageVisitor; + +/** + * Implementation of component interface of visitormanagement + */ +@Named +public class VisitormanagementImpl extends AbstractComponentFacade implements Visitormanagement { + + @Inject + private UcFindVisitor ucFindVisitor; + + @Inject + private UcManageVisitor ucManageVisitor; + + @Override + public VisitorEto findVisitor(long id) { + + return this.ucFindVisitor.findVisitor(id); + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo criteria) { + + return this.ucFindVisitor.findVisitors(criteria); + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + return this.ucManageVisitor.saveVisitor(visitor); + } + + @Override + public boolean deleteVisitor(long id) { + + return this.ucManageVisitor.deleteVisitor(id); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java new file mode 100644 index 0000000..abb4846 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java @@ -0,0 +1,48 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.impl.usecase; + +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqj.visitormanagement.logic.base.usecase.AbstractVisitorUc; + +/** + * Use case implementation for searching, filtering and getting Visitors + */ +@Named +@Validated +@Transactional +public class UcFindVisitorImpl extends AbstractVisitorUc implements UcFindVisitor { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindVisitorImpl.class); + + @Override + public VisitorEto findVisitor(long id) { + + LOG.debug("Get Visitor with id {} from database.", id); + Optional foundEntity = getVisitorRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), VisitorEto.class); + else + return null; + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo criteria) { + + Page visitors = getVisitorRepository().findByCriteria(criteria); + return mapPaginatedEntityList(visitors, VisitorEto.class); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java new file mode 100644 index 0000000..676b4ba --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java @@ -0,0 +1,49 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.impl.usecase; + +import java.util.Objects; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqj.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.usecase.UcManageVisitor; +import com.devonfw.application.jtqj.visitormanagement.logic.base.usecase.AbstractVisitorUc; + +/** + * Use case implementation for modifying and deleting Visitors + */ +@Named +@Validated +@Transactional +public class UcManageVisitorImpl extends AbstractVisitorUc implements UcManageVisitor { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageVisitorImpl.class); + + @Override + public boolean deleteVisitor(long visitorId) { + + VisitorEntity visitor = getVisitorRepository().find(visitorId); + getVisitorRepository().delete(visitor); + LOG.debug("The visitor with id '{}' has been deleted.", visitorId); + return true; + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + Objects.requireNonNull(visitor, "visitor"); + + VisitorEntity visitorEntity = getBeanMapper().map(visitor, VisitorEntity.class); + + // initialize, validate visitorEntity here if necessary + VisitorEntity resultEntity = getVisitorRepository().save(visitorEntity); + LOG.debug("Visitor with id '{}' has been created.", resultEntity.getId()); + return getBeanMapper().map(resultEntity, VisitorEto.class); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java new file mode 100644 index 0000000..0f1159a --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java @@ -0,0 +1,49 @@ +package com.devonfw.application.jtqj.visitormanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqj.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqj.visitormanagement.service.api.rest.VisitormanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Visitormanagement}. + */ +@Named("VisitormanagementRestService") +public class VisitormanagementRestServiceImpl implements VisitormanagementRestService { + + @Inject + private Visitormanagement visitormanagement; + + @Override + public VisitorEto getVisitor(long id) { + + return this.visitormanagement.findVisitor(id); + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + return this.visitormanagement.saveVisitor(visitor); + } + + @Override + public void deleteVisitor(long id) { + + this.visitormanagement.deleteVisitor(id); + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo searchCriteriaTo) { + + System.out.println("Hello"); + Page v = this.visitormanagement.findVisitors(searchCriteriaTo); + System.out.println("Hi"); + System.out.println(v.toList()); + return v; + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger new file mode 100644 index 0000000..27dd788 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger @@ -0,0 +1 @@ +org.apache.cxf.common.logging.Slf4jLogger \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/application.properties b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/application.properties new file mode 100644 index 0000000..4d82507 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/application.properties @@ -0,0 +1,37 @@ +# This is the configuration file shipped with the application that contains reasonable defaults. +# Environment specific configurations are configured in config/application.properties. +# If you are running in a servlet container you may add this to lib/config/application.properties in case you do not +# want to touch the WAR file. + +# server.port=8080 + +spring.application.name=jtqj +server.servlet.context-path=/ + +security.expose.error.details=false +security.cors.enabled=true +spring.jpa.hibernate.ddl-auto=validate + +# Datasource for accessing the database +# https://github.com/spring-projects/spring-boot/blob/d3c34ee3d1bfd3db4a98678c524e145ef9bca51c/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java +spring.jpa.database=h2 +# spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +# spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.h2.console.enabled=true +spring.h2.console.path=/console/ +# Hibernate NamingStrategy has been deprecated and then removed in favor of two step naming strategy ImplicitNamingStrategy and PhysicalNamingStrategy +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +# https://github.com/devonfw/devon4j/issues/65 +# https://vladmihalcea.com/the-open-session-in-view-anti-pattern/ +spring.jpa.open-in-view=true + +# to prevent that Spring Boot launches batch jobs on startup +# might otherwise lead to errors if job parameters are needed (or lead to unwanted modifications and longer startup times) +# see http://stackoverflow.com/questions/22318907/how-to-stop-spring-batch-scheduled-jobs-from-running-at-first-time-when-executin +spring.batch.job.enabled=false + +# Flyway for Database Setup and Migrations +spring.flyway.locations=classpath:db/migration diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/config/application.properties b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/config/application.properties new file mode 100644 index 0000000..671120d --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/config/application.properties @@ -0,0 +1,28 @@ +# This is the spring boot configuration file for development. It will not be included into the application. +# In order to set specific configurations in a regular installed environment create an according file +# config/application.properties in the server. If you are deploying the application to a servlet container as untouched +# WAR file you can locate this config folder in ${symbol_dollar}{CATALINA_BASE}/lib. If you want to deploy multiple applications to +# the same container (not recommended by default) you need to ensure the WARs are extracted in webapps folder and locate +# the config folder inside the WEB-INF/classes folder of the webapplication. + +server.port=8085 +server.servlet.context-path=/jumpthequeue + +# Datasource for accessing the database +# See https://github.com/devonfw/devon4j/blob/develop/documentation/guide-configuration.asciidoc#security-configuration +#jasypt.encryptor.password=none +#spring.datasource.password=ENC(7CnHiadYc0Wh2FnWADNjJg==) +spring.datasource.password= +spring.datasource.url=jdbc:h2:./.jtqj; +#spring.h2.console.enabled=true +#spring.h2.console.path=/console/ +# print SQL to console for debugging (e.g. detect N+1 issues) +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + +# Enable JSON pretty printing +spring.jackson.serialization.INDENT_OUTPUT=true + +# Flyway for Database Setup and Migrations +spring.flyway.enabled=true +spring.flyway.clean-on-validation-error=true diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql new file mode 100644 index 0000000..1757860 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql @@ -0,0 +1,3 @@ +-- Leave a large ID space reserved for master-data and test-data +CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 100000; + diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql new file mode 100644 index 0000000..89c5bf5 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql @@ -0,0 +1,12 @@ + +create table Visitor( +id BIGINT NOT NULL AUTO_INCREMENT, + modificationCounter INTEGER NOT NULL, + username VARCHAR(255), + name VARCHAR(255), + password VARCHAR(255), + phoneNumber VARCHAR(255), + acceptedCommercial BOOL DEFAULT '0', + acceptedTerms BOOL NOT NULL DEFAULT '0', + userType BOOL DEFAULT '0', +CONSTRAINT PK_Visitor PRIMARY KEY(id) ); \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql new file mode 100644 index 0000000..6d6e72a --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql @@ -0,0 +1,9 @@ +create table Event( id BIGINT NOT NULL AUTO_INCREMENT, +modificationCounter INTEGER NOT NULL, +eventName VARCHAR(255), +logo VARCHAR(255), +description VARCHAR(255), +currentNumber VARCHAR(255), + attentionTime BIGINT, + customers INTEGER NOT NULL DEFAULT '0', + CONSTRAINT PK_Event PRIMARY KEY(id) ); \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql new file mode 100644 index 0000000..4eee0d5 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql @@ -0,0 +1,13 @@ +CREATE TABLE QueueDetail( + id BIGINT NOT NULL AUTO_INCREMENT, + modificationCounter INTEGER NOT NULL, + queueNumber VARCHAR(5), + creationTime TIMESTAMP, + startTime TIMESTAMP, + endTime TIMESTAMP, + minEstimatedTime VARCHAR(255), + idVisitor BIGINT NOT NULL, + idEvent BIGINT NOT NULL, + CONSTRAINT PK_QueueDetail PRIMARY KEY(id), + CONSTRAINT FK_QueueDetail_idVisitor FOREIGN KEY(idVisitor) REFERENCES Visitor(id), + CONSTRAINT FK_QueueDetail_idEvent FOREIGN KEY(idEvent) REFERENCES Event(id) ); \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql new file mode 100644 index 0000000..da4b2d3 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql @@ -0,0 +1,9 @@ +INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, acceptedTerms, userType) VALUES (0, 1, 'raj@mail.com', 'raj', 'raj123', '9876543211', '0', '1', '1'); +INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, acceptedTerms, userType) VALUES (1, 1, 'krishna@mail.com', 'krishna', 'krishna123', '9876543211', '1', '1', '0'); + +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (11, 1, 'Butter Cup', 'C:/logos/Day1Logo.png', 'Q001',120, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (22, 1, 'Christmas party', 'C:/logos/Day1Logo.png', 'Q001',120,0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (33, 1, 'New Year', 'C:/logos/Day1Logo.png', 'Q001',120, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (44, 1, 'Fintech Festival', 'C:/logos/Day1Logo.png', 'Q001',120, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (55, 1, 'Dark Roast', 'C:/logos/Day1Logo.png', 'Q001',120,0); + diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/static/index.html b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/static/index.html new file mode 100644 index 0000000..88b7063 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/static/index.html @@ -0,0 +1,18 @@ + + + +Welcome + + +

Welcome

+ This is a test! +
+ Services Overview (CXF) +
+
+ +
+ +
+ + \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java new file mode 100644 index 0000000..440a905 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java @@ -0,0 +1,59 @@ +package com.devonfw.application.jtqj.eventmanagement.logic.impl; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import com.devonfw.application.jtqj.SpringBootApp; +import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * @author rajbhush + * + */ +@SpringBootTest(classes = SpringBootApp.class) +public class EventmanagementTest extends ComponentTest { + private EventEto eventEto = new EventEto(); + + @Inject + private Eventmanagement eventManagement; + + @Override + protected void doSetUp() { + + this.eventEto.setEventName("Butter Cup"); + this.eventEto.setLogo(null); + this.eventEto.setCurrentNumber("Q001"); + this.eventEto.setAttentionTime(null); + this.eventEto.setCustomers(2); + } + + @Test + public void saveEventTest() { + + EventEto eventResult = this.eventManagement.saveEvent(this.eventEto); + + assertThat(eventResult.getId()).isNotNull(); + assertThat(eventResult.getEventName()).isEqualTo("Butter Cup"); + + this.eventManagement.deleteEvent(eventResult.getId()); + } + + @Test + public void findEventTest() { + + EventSearchCriteriaTo criteria = new EventSearchCriteriaTo(); + Pageable pageable = PageRequest.of(0, 100); + criteria.setPageable(pageable); + Page result = this.eventManagement.findEvents(criteria); + assertThat(result).isNotNull(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/Devon4jPackageCheckTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/Devon4jPackageCheckTest.java new file mode 100644 index 0000000..0fbc94c --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/Devon4jPackageCheckTest.java @@ -0,0 +1,66 @@ +package com.devonfw.application.jtqj.general.common.base; + +import java.util.HashSet; +import java.util.Set; + +import net.sf.mmm.util.reflect.api.ReflectionUtil; +import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; + +import com.devonfw.module.basic.common.api.reflect.Devon4jPackage; +import com.devonfw.module.test.common.base.ModuleTest; + +/** + * This test verifies that the entire code of your code-base is located in {@link Devon4jPackage#isValid() valid Devon4j + * packages}. + */ +public class Devon4jPackageCheckTest extends ModuleTest { + + /** + * Scans all the packages of this application root pacakge namespace. Will verify that these are + * {@link Devon4jPackage#isValid() valid Devon4j packages}. + */ + @Test + public void testPackages() { + + Devon4jPackage pkg = Devon4jPackage.of(Devon4jPackageCheckTest.class); + assertThat(pkg.isValid()).isTrue(); + + ReflectionUtil ru = ReflectionUtilImpl.getInstance(); + Set classNames = ru.findClassNames(getRootPackage2Scan(pkg), true); + String appPackage = pkg.getRoot() + "." + pkg.getApplication(); + Set packages = new HashSet<>(128); + packages.add(appPackage); // allow SpringBootApp, etc. in application package + SoftAssertions assertion = new SoftAssertions(); + for (String className : classNames) { + int lastDot = className.lastIndexOf('.'); + if (lastDot > 0) { + String packageName = className.substring(0, lastDot); + boolean added = packages.add(packageName); + if (added) { + pkg = Devon4jPackage.of(packageName); + if (!pkg.isValid()) { + assertion.assertThat(pkg.isValid()) + .as("package " + packageName + " is invalid (component: " + pkg.getComponent() + ", layer: " + + pkg.getLayer() + ", scope: " + pkg.getScope() + "). Hint contains e.g. " + + className.substring(lastDot + 1)) + .isTrue(); + } + } + } + } + assertion.assertAll(); + } + + /** + * @param pkg the {@link Devon4jPackage} of this test. + * @return the root package to scan for {@link Class}es to get the actual packages to check. + */ + protected String getRootPackage2Scan(Devon4jPackage pkg) { + + return pkg.getRoot() + "." + pkg.getApplication(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/PermissionCheckTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/PermissionCheckTest.java new file mode 100644 index 0000000..25f63df --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/PermissionCheckTest.java @@ -0,0 +1,69 @@ +package com.devonfw.application.jtqj.general.common.base; + +import java.lang.reflect.Method; +import java.util.Set; + +import javax.annotation.security.DenyAll; +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; + +import net.sf.mmm.util.filter.api.Filter; +import net.sf.mmm.util.reflect.api.ReflectionUtil; +import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import com.devonfw.module.test.common.base.ModuleTest; + +/** + * Tests the permission check in logic layer. + */ +public class PermissionCheckTest extends ModuleTest { + + /** + * Check if all relevant methods in use case implementations have permission checks i.e. {@link RolesAllowed}, + * {@link DenyAll} or {@link PermitAll} annotation is applied. This is only checked for methods that are declared in + * the corresponding interface and thus have the {@link Override} annotations applied. + */ + @Test + @Disabled + public void permissionCheckAnnotationPresent() { + + String packageName = "com.devonfw.application.jtqj"; + Filter filter = new Filter() { + + @Override + public boolean accept(String value) { + + return value.contains(".logic.impl.usecase.Uc") && value.endsWith("Impl"); + } + + }; + ReflectionUtil ru = ReflectionUtilImpl.getInstance(); + Set classNames = ru.findClassNames(packageName, true, filter); + Set> classes = ru.loadClasses(classNames); + SoftAssertions assertions = new SoftAssertions(); + for (Class clazz : classes) { + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + Method parentMethod = ru.getParentMethod(method); + if (parentMethod != null) { + Class declaringClass = parentMethod.getDeclaringClass(); + if (declaringClass.isInterface() && declaringClass.getSimpleName().startsWith("Uc")) { + boolean hasAnnotation = false; + if (method.getAnnotation(RolesAllowed.class) != null || method.getAnnotation(DenyAll.class) != null + || method.getAnnotation(PermitAll.class) != null) { + hasAnnotation = true; + } + assertions.assertThat(hasAnnotation) + .as("Method " + method.getName() + " in Class " + clazz.getSimpleName() + " is missing access control") + .isTrue(); + } + } + } + } + assertions.assertAll(); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationComponentTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationComponentTest.java new file mode 100644 index 0000000..7a1ac01 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationComponentTest.java @@ -0,0 +1,22 @@ +package com.devonfw.application.jtqj.general.common.base.test; + +import com.devonfw.module.test.common.base.ComponentTest; + +import com.devonfw.application.jtqj.SpringBootApp; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Abstract base class for {@link ComponentTest}s of this application. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.MOCK) +public abstract class ApplicationComponentTest extends ComponentTest { + + @Override + protected void doTearDown() { + super.doTearDown(); + TestUtil.logout(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationSubsystemTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationSubsystemTest.java new file mode 100644 index 0000000..743cf23 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/ApplicationSubsystemTest.java @@ -0,0 +1,16 @@ +package com.devonfw.application.jtqj.general.common.base.test; + +import com.devonfw.module.test.common.base.SubsystemTest; + +import com.devonfw.application.jtqj.SpringBootApp; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Abstract base class for {@link SubsystemTest}s of this application. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) +public abstract class ApplicationSubsystemTest extends SubsystemTest { + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/DbTestHelper.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/DbTestHelper.java new file mode 100644 index 0000000..f22e994 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/DbTestHelper.java @@ -0,0 +1,44 @@ +package com.devonfw.application.jtqj.general.common.base.test; + +import javax.inject.Named; + +import org.flywaydb.core.Flyway; + +/** + * This class provides methods for handling the database during testing where resets (and other operations) may be + * necessary. + */ +@Named +public class DbTestHelper { + + private Flyway flyway; + + /** + * The constructor. + * + * @param flyway an instance of type {@link Flyway}. + */ + public DbTestHelper(Flyway flyway) { + super(); + this.flyway = flyway; + } + + /** + * Drops the whole database. + */ + public void dropDatabase() { + + this.flyway.clean(); + } + + /** + * Calls {@link #dropDatabase()} internally, and migrates to the highest available migration (default) or to the + * {@code migrationVersion} specified by {@link #setMigrationVersion(String)}. + */ + public void resetDatabase() { + + dropDatabase(); + this.flyway.migrate(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java new file mode 100644 index 0000000..3c91ea6 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqj.general.common.base.test; + +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * This is a utility for testing. It allows to simulate authentication for component testing. + */ +public class TestUtil { + + /** + * @param login the id of the user to run the test as. + * @param permissions the permissions for the test. + */ + public static void login(String login, String... permissions) { + + Authentication authentication = new TestingAuthenticationToken(login, login, permissions); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * Logs off any previously logged on user. + */ + public static void logout() { + + SecurityContextHolder.getContext().setAuthentication(null); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestDbConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestDbConfig.java new file mode 100644 index 0000000..2c4e502 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestDbConfig.java @@ -0,0 +1,35 @@ +package com.devonfw.application.jtqj.general.common.impl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.devonfw.module.test.common.base.clean.TestCleaner; +import com.devonfw.module.test.common.base.clean.TestCleanerImpl; +import com.devonfw.module.test.common.base.clean.TestCleanerPlugin; +import com.devonfw.module.test.common.base.clean.TestCleanerPluginFlyway; + +/** + * {@link Configuration} for Database in JUnit tests. + */ +@Configuration +public class TestDbConfig { + + /** + * @return the {@link TestCleaner}. + */ + @Bean + public TestCleaner testCleaner() { + + return new TestCleanerImpl(); + } + + /** + * @return the {@link TestCleanerPluginFlyway}. + */ + @Bean + public TestCleanerPlugin testCleanerPluginFlyway() { + + return new TestCleanerPluginFlyway(); + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestWebSecurityConfig.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestWebSecurityConfig.java new file mode 100644 index 0000000..fd7c5e6 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/common/impl/config/TestWebSecurityConfig.java @@ -0,0 +1,54 @@ +package com.devonfw.application.jtqj.general.common.impl.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +import com.devonfw.application.jtqj.general.service.impl.config.BaseWebSecurityConfig; +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; + +/** + * This type provides web security configuration for testing purposes. + */ +@Configuration +@EnableWebSecurity +@Profile(SpringProfileConstants.JUNIT) +public class TestWebSecurityConfig extends BaseWebSecurityConfig { + private static Logger LOG = LoggerFactory.getLogger(TestWebSecurityConfig.class); + + /** + * Configure spring security to enable a simple webform-login + a simple rest login. + */ + @Override + public void configure(HttpSecurity http) throws Exception { + + super.configure(http); + http.addFilterBefore(basicAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); + + // Disable CSRF protection in tests for simpler testing of REST services + http.csrf().disable(); + LOG.debug("*** CSRF disabled - this config should only be used in development environment ***"); + } + + /** + * @return {@link BasicAuthenticationFilter}. + * @throws Exception on initialization error. + */ + @Bean + protected BasicAuthenticationFilter basicAuthenticationFilter() throws Exception { + + AuthenticationEntryPoint authenticationEntryPoint = new BasicAuthenticationEntryPoint(); + BasicAuthenticationFilter basicAuthenticationFilter = + new BasicAuthenticationFilter(authenticationManagerBean(), authenticationEntryPoint); + return basicAuthenticationFilter; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/service/base/test/RestServiceTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/service/base/test/RestServiceTest.java new file mode 100644 index 0000000..9d64531 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/general/service/base/test/RestServiceTest.java @@ -0,0 +1,67 @@ +package com.devonfw.application.jtqj.general.service.base.test; + +import javax.inject.Inject; + +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +import com.devonfw.application.jtqj.SpringBootApp; +import com.devonfw.application.jtqj.general.common.base.test.DbTestHelper; +import com.devonfw.application.jtqj.general.common.base.test.TestUtil; + +import com.devonfw.module.test.common.base.SubsystemTest; +import com.devonfw.module.test.common.base.SubsystemDbTest; +import com.devonfw.module.service.common.api.client.ServiceClientFactory; + +/** + * Abstract base class for {@link SubsystemTest}s which runs the tests within a local server.
+ *
+ * The local server's port is randomly assigned. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) +public abstract class RestServiceTest extends SubsystemDbTest { + + /** + * The port of the web server during the test. + */ + @LocalServerPort + protected int port; + + @Inject + private ServiceClientFactory serviceClientFactory; + + @Inject + private DbTestHelper dbTestHelper; + + @Override + protected void doSetUp() { + + super.doSetUp(); + } + + @Override + protected void doTearDown() { + + super.doTearDown(); + TestUtil.logout(); + } + + /** + * @return the {@link DbTestHelper} + */ + protected DbTestHelper getDbTestHelper() { + + return this.dbTestHelper; + } + + + /** + * @return the {@link ServiceClientFactory} + */ + protected ServiceClientFactory getServiceClientFactory() { + + return this.serviceClientFactory; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementTest.java new file mode 100644 index 0000000..50ac362 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementTest.java @@ -0,0 +1,70 @@ +package com.devonfw.application.jtqj.queuedetailmanagement.logic.impl; + +import java.sql.Timestamp; +import java.time.Instant; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import com.devonfw.application.jtqj.SpringBootApp; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * @author rajbhush + * + */ +@SpringBootTest(classes = SpringBootApp.class) +public class QueuedetailmanagementTest extends ComponentTest { + + private QueueDetailEto queueDetailEto = new QueueDetailEto(); + + @Inject + private Queuedetailmanagement queuedetailManagement; + + @Override + protected void doSetUp() { + + this.queueDetailEto.setQueueNumber("Q001"); + this.queueDetailEto.setCreationTime(Timestamp.from(Instant.now())); + this.queueDetailEto.setStartTime(null); + this.queueDetailEto.setEndTime(null); + this.queueDetailEto.setVisitorId(1L); + this.queueDetailEto.setEventId(22L); + } + + @Test + public void joinQueueTest() { + + QueueDetailEto queueResult = this.queuedetailManagement.joinQueue(this.queueDetailEto); + assertThat(queueResult.getId()).isNotNull(); + assertThat(queueResult.getQueueNumber()).isEqualTo("Q001"); + assertThat(queueResult.getVisitorId()).isEqualTo(1); + this.queuedetailManagement.leaveQueue(queueResult.getId()); + } + + // @Test + // public void leaveQueueTest() { + // + // QueueDetailEto queueResult = this.queuedetailManagement.joinQueue(this.queueDetailEto); + // this.queuedetailManagement.leaveQueue(queueResult.getId()); + // assertThat(queueResult.getId()).isNull(); + // } + + @Test + public void findQueueDetails() { + + QueueDetailSearchCriteriaTo criteria = new QueueDetailSearchCriteriaTo(); + Pageable pageable = PageRequest.of(0, 100); + criteria.setPageable(pageable); + Page result = this.queuedetailManagement.findQueueDetails(criteria); + assertThat(result).isNotNull(); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementTest.java new file mode 100644 index 0000000..a4fa3c2 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/visitormanagement/logic/impl/VisitormanagementTest.java @@ -0,0 +1,63 @@ +package com.devonfw.application.jtqj.visitormanagement.logic.impl; + +/** + * @author rajbhush + * + */ +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import com.devonfw.application.jtqj.SpringBootApp; +import com.devonfw.application.jtqj.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqj.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.module.test.common.base.ComponentTest; + +@SpringBootTest(classes = SpringBootApp.class) +public class VisitormanagementTest extends ComponentTest { + + private VisitorEto visitorEto = new VisitorEto(); + + @Inject + private Visitormanagement visitormanagement; + + @Override + protected void doSetUp() { + + this.visitorEto.setName("Raj"); + this.visitorEto.setUsername("raj@mail.com"); + this.visitorEto.setPhoneNumber("9876543211"); + this.visitorEto.setPassword("raj123"); + this.visitorEto.setUserType(false); + this.visitorEto.setAcceptedTerms(true); + this.visitorEto.setAcceptedCommercial(true); + } + + @Test + public void saveVisitorTest() { + + VisitorEto visitorEtoResult = this.visitormanagement.saveVisitor(this.visitorEto); + + assertThat(visitorEtoResult.getId()).isNotNull(); + assertThat(visitorEtoResult.getName()).isEqualTo("Raj"); + + this.visitormanagement.deleteVisitor(visitorEtoResult.getId()); + + } + + @Test + public void findVisitorsTest() { + + VisitorSearchCriteriaTo criteria = new VisitorSearchCriteriaTo(); + Pageable pageable = PageRequest.of(0, 100); + criteria.setPageable(pageable); + Page result = this.visitormanagement.findVisitors(criteria); + + assertThat(result).isNotNull(); + } +} \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/config/application.properties b/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/config/application.properties new file mode 100644 index 0000000..921492c --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/config/application.properties @@ -0,0 +1,13 @@ +# This is the spring boot configuration file for JUnit tests. It will only affect JUnits and is not included into the application. +spring.profiles.active=junit + +# Database and JPA +spring.jpa.database=h2 +spring.datasource.url=jdbc:h2:mem:app; +spring.datasource.password= +spring.datasource.username=sa +spring.jpa.hibernate.ddl-auto=none + +# Flyway for Database Setup and Migrations +spring.flyway.enabled=true +spring.flyway.locations=classpath:db/migration diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/db/test/V0001__InitDb.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/db/test/V0001__InitDb.sql new file mode 100644 index 0000000..2210438 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/resources/db/test/V0001__InitDb.sql @@ -0,0 +1,2 @@ +-- Leave a large ID space reserved for master-data and test-data +CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; diff --git a/Raj_Bhushan/jump_java/jtqj1/pom.xml b/Raj_Bhushan/jump_java/jtqj1/pom.xml new file mode 100644 index 0000000..d7cc5b0 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/pom.xml @@ -0,0 +1,488 @@ + + + 4.0.0 + jtqj1 + com.devonfw.java.jtqj1 + 0.0.1 + pom + ${project.artifactId} + Application based on the devon4j. + + + 2.2.7.RELEASE + 2020.08.001 + 1.8 + 5.6.1 + UTF-8 + UTF-8 + 2.10.3 + 28.1-jre + system + + + + api + core + server + + + + + + + com.fasterxml.jackson + jackson-bom + ${jackson.version} + pom + import + + + + org.junit + junit-bom + ${junit.version} + pom + import + + + + com.google.guava + guava + ${guava.version} + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + com.devonfw.java.boms + devon4j-bom + ${devon4j.version} + pom + import + + + + + + + org.slf4j + slf4j-api + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${project.build.sourceEncoding} + ${java.version} + ${java.version} + + + + + maven-surefire-plugin + + ${devonfw.test.excluded.groups} + + + + + + org.jacoco + jacoco-maven-plugin + + + default-prepare-agent + + prepare-agent + + + + default-report + + report + + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.apache.maven.plugins + maven-install-plugin + 2.5.2 + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-changes-plugin + 2.12.1 + + + org.apache.maven.plugins + maven-changelog-plugin + 2.3 + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-jxr-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.1.1 + + + + true + protected + ${project.reporting.outputEncoding} + ${project.build.sourceEncoding} + true + ${user.dir}/src/main/javadoc/stylesheet.css + none + ${java.version} + JavaDocs for ${project.name} ${project.version} + JavaDocs for ${project.name} ${project.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + ${basedir} + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.22.2 + + + org.apache.maven.plugins + maven-pmd-plugin + 3.9.0 + + ${java.version} + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.3 + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + org.apache.maven.plugins + maven-help-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + org.apache.maven.plugins + maven-archetype-plugin + 3.1.2 + + + org.apache.maven.archetype + archetype-packaging + 3.1.2 + + + org.codehaus.mojo + taglist-maven-plugin + 2.4 + + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + org.codehaus.mojo + flatten-maven-plugin + 1.2.2 + + + org.codehaus.mojo + license-maven-plugin + 1.20 + + ${project.build.directory}/generated-resources + true + true + true + true + + Apache Software License, Version 2.0|The Apache Software License, Version 2.0|Apache 2.0|Apache License, Version 2.0 + + + + + org.codehaus.mojo + servicedocgen-maven-plugin + 1.0.0-beta-3 + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.7.0.1746 + + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + org.owasp + dependency-check-maven + 5.2.2 + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.12.2 + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + + + + + moduletest + + component,subsystem,system + + + + componenttest + + subsystem,system + + + + subsystemtest + + system + + + + systemtest + + none + + + + security + + + + org.owasp + dependency-check-maven + + 8 + + + + + check + + + + + + + + + licenses + + + + org.codehaus.mojo + license-maven-plugin + + + aggregate-add-third-party + generate-resources + + aggregate-add-third-party + + + + + aggregate-download-licenses + generate-resources + + aggregate-download-licenses + + + + + + + + + + eclipse + + + eclipse.application + + + + eclipse-target + + + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + false + + + + org.apache.maven.plugins + maven-jxr-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.codehaus.mojo + taglist-maven-plugin + + + TODO + @todo + FIXME + @deprecated + REVIEW + + + + + org.owasp + dependency-check-maven + + false + + + + + aggregate + check + + + + + + org.codehaus.mojo + servicedocgen-maven-plugin + + + + ${servicedoc.info.title} + ${servicedoc.info.description} + + ${servicedoc.host} + ${servicedoc.port} + ${servicedoc.basePath} + + http + + + + + + org.codehaus.mojo + license-maven-plugin + + + + third-party-report + aggregate-third-party-report + + + + + + + + diff --git a/Raj_Bhushan/jump_java/jtqj1/server/pom.xml b/Raj_Bhushan/jump_java/jtqj1/server/pom.xml new file mode 100644 index 0000000..ca79d71 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/server/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + com.devonfw.java.jtqj1 + jtqj1 + 0.0.1 + + jtqj1-server + war + ${project.artifactId} + Server for the jtqj application - a simple example based on devon4j. + + + + ${project.groupId} + jtqj1-core + ${project.version} + + + + com.devonfw.java.modules + devon4j-test-jpa + test + + + + + + jsclient + + + false + + + + + org.codehaus.mojo + exec-maven-plugin + + + npm-install + generate-sources + + exec + + + npm + + install + + ${js.client.dir} + + + + gulp-clean + generate-sources + + exec + + + gulp + + clean + + ${js.client.dir} + + + + gulp-build + generate-sources + + exec + + + gulp + + build:dist + + ${js.client.dir} + + + + gulp-test + test + + exec + + + gulp + + test + + ${js.client.dir} + + + + + + org.apache.maven.plugins + maven-war-plugin + + WEB-INF/classes/config/application.properties + ${project.artifactId} + false + + + + + + + + + + + ${project.basedir}/src/main/resources + + + ${js.client.dir}/dist + static + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.devonfw.application.jtqj.SpringBootApp + bootified + ${project.artifactId} + + + + + repackage + + + + + + + + + diff --git a/Raj_Bhushan/jump_java/jtqj1/server/src/main/resources/logback.xml b/Raj_Bhushan/jump_java/jtqj1/server/src/main/resources/logback.xml new file mode 100644 index 0000000..2fce685 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/server/src/main/resources/logback.xml @@ -0,0 +1,32 @@ + + + + + + false + correlationId + + timestamp + [ignore] + [ignore] + +      {"appname":"jtqj"} + UTC + + + + + + + + + + + + + + + + + + diff --git a/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/SpringBootBatchApp.java b/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/SpringBootBatchApp.java new file mode 100644 index 0000000..b0c76c6 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/SpringBootBatchApp.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqj; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; + +import com.devonfw.module.jpa.dataaccess.api.AdvancedRevisionEntity; + +/** + * {@link SpringBootApplication} for running this batch. + */ +@SpringBootApplication +@EntityScan(basePackages = { "com.devonfw.application.jtqj" }, basePackageClasses = { AdvancedRevisionEntity.class }) +public class SpringBootBatchApp { + + /** + * Entry point for spring-boot based app + * + * @param args - arguments + */ + public static void main(String[] args) { + + SpringApplication.run(SpringBootBatchApp.class, args); + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/general/batch/impl/config/BeansBatchConfig.java b/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/general/batch/impl/config/BeansBatchConfig.java new file mode 100644 index 0000000..273e8f8 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/src/main/java/com/devonfw/application/jtqj/general/batch/impl/config/BeansBatchConfig.java @@ -0,0 +1,193 @@ +package com.devonfw.application.jtqj.general.batch.impl.config; + +import javax.inject.Inject; +import javax.sql.DataSource; + +import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor; +import org.springframework.batch.core.configuration.support.MapJobRegistry; +import org.springframework.batch.core.explore.support.JobExplorerFactoryBean; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.launch.support.SimpleJobOperator; +import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.transaction.PlatformTransactionManager; + +/** + * This class contains the configuration like jobLauncher,Jobrepository etc. + */ +import com.devonfw.module.batch.common.impl.JobLauncherWithAdditionalRestartCapabilities; + +/** + * This class contains configuration of batch beans. + */ +@Configuration +public class BeansBatchConfig { + + private JobRepositoryFactoryBean jobRepository; + + private MapJobRegistry jobRegistry; + + private JobLauncherWithAdditionalRestartCapabilities jobLauncher; + + private JobExplorerFactoryBean jobExplorer; + + private DataSource dataSource; + + private PlatformTransactionManager transactionManager; + + @Value("ISOLATION_DEFAULT") + private String isolationLevelForCreate; + + /** + * This method is creating joboperator bean + * + * @return SimpleJobOperator + */ + @Bean + @DependsOn({ "jobRepository", "jobExplorer", "jobRegistry", "jobLauncher" }) + public SimpleJobOperator jobOperator() { + + SimpleJobOperator jobOperator = new SimpleJobOperator(); + try { + jobOperator.setJobExplorer(this.jobExplorer.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + jobOperator.setJobLauncher(this.jobLauncher); + jobOperator.setJobRegistry(this.jobRegistry); + + try { + jobOperator.setJobRepository(this.jobRepository.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + return jobOperator; + } + + /** + * This method is creating jobrepository + * + * @return JobRepositoryFactoryBean + */ + @Bean(name = "jobRepository") + public JobRepositoryFactoryBean jobRepository() { + + this.jobRepository = new JobRepositoryFactoryBean(); + this.jobRepository.setDataSource(this.dataSource); + this.jobRepository.setTransactionManager(this.transactionManager); + this.jobRepository.setIsolationLevelForCreate(this.isolationLevelForCreate); + return this.jobRepository; + } + + /** + * This method is creating jobLauncher bean + * + * @return SimpleJobLauncher + */ + @Bean + @DependsOn("jobRepository") + public JobLauncherWithAdditionalRestartCapabilities jobLauncher() { + + this.jobLauncher = new JobLauncherWithAdditionalRestartCapabilities(); + + try { + this.jobLauncher.setJobRepository(this.jobRepository.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + return this.jobLauncher; + } + + /** + * This method is creating jobExplorer bean + * + * @return JobExplorerFactoryBean + */ + @Bean + @DependsOn("dataSource") + public JobExplorerFactoryBean jobExplorer() { + + this.jobExplorer = new JobExplorerFactoryBean(); + this.jobExplorer.setDataSource(this.dataSource); + return this.jobExplorer; + } + + /** + * This method is creating jobRegistry bean + * + * @return MapJobRegistry + */ + @Bean + public MapJobRegistry jobRegistry() { + + this.jobRegistry = new MapJobRegistry(); + return this.jobRegistry; + } + + /** + * This method is creating JobRegistryBeanPostProcessor + * + * @return JobRegistryBeanPostProcessor + */ + @Bean + @DependsOn("jobRegistry") + public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() { + + JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor(); + postProcessor.setJobRegistry(this.jobRegistry); + return postProcessor; + } + + /** + * This method is creating incrementer + * + * @return RunIdIncrementer + */ + @Bean + public RunIdIncrementer incrementer() { + + return new RunIdIncrementer(); + } + + /** + * @return datasource + */ + public DataSource getDataSource() { + + return this.dataSource; + } + + /** + * @param datasource the datasource to set + */ + @Inject + public void setDataSource(DataSource datasource) { + + this.dataSource = datasource; + } + + /** + * @return transactionManager + */ + public PlatformTransactionManager getTransactionManager() { + + return this.transactionManager; + } + + /** + * @param transactionManager the transactionManager to set + */ + @Inject + public void setTransactionManager(PlatformTransactionManager transactionManager) { + + this.transactionManager = transactionManager; + } + +} diff --git a/Raj_Bhushan/jump_java/jtqj1/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql b/Raj_Bhushan/jump_java/jtqj1/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql new file mode 100644 index 0000000..980d37d --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql @@ -0,0 +1,81 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + TYPE_CD VARCHAR(6) NOT NULL , + KEY_NAME VARCHAR(100) NOT NULL , + STRING_VAL VARCHAR(250) , + DATE_VAL TIMESTAMP DEFAULT NULL , + LONG_VAL BIGINT , + DOUBLE_VAL DOUBLE PRECISION , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/batch/base/test/SpringBatchIntegrationTest.java b/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/batch/base/test/SpringBatchIntegrationTest.java new file mode 100644 index 0000000..36ed053 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/batch/base/test/SpringBatchIntegrationTest.java @@ -0,0 +1,53 @@ +package com.devonfw.application.jtqj.general.batch.base.test; + +import javax.inject.Inject; + +import org.flywaydb.core.Flyway; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.test.JobLauncherTestUtils; + +import com.devonfw.application.jtqj.general.common.base.test.TestUtil; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * Base class for all spring batch integration tests. It helps to do End-to-End job tests. + */ +public abstract class SpringBatchIntegrationTest extends ComponentTest { + + @Inject + private JobLauncher jobLauncher; + + @Inject + private Flyway flyway; + + @Override + protected void doSetUp() { + + super.doSetUp(); + this.flyway.clean(); + this.flyway.migrate(); + } + + @Override + protected void doTearDown() { + + super.doTearDown(); + TestUtil.logout(); + } + + /** + * @param job job to configure + * @return jobLauncherTestUtils + */ + public JobLauncherTestUtils getJobLauncherTestUtils(Job job) { + + JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); + jobLauncherTestUtils.setJob(job); + jobLauncherTestUtils.setJobLauncher(this.jobLauncher); + + return jobLauncherTestUtils; + } +} diff --git a/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java b/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java new file mode 100644 index 0000000..3c91ea6 --- /dev/null +++ b/Raj_Bhushan/jump_java/jtqj1/src/test/java/com/devonfw/application/jtqj/general/common/base/test/TestUtil.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqj.general.common.base.test; + +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * This is a utility for testing. It allows to simulate authentication for component testing. + */ +public class TestUtil { + + /** + * @param login the id of the user to run the test as. + * @param permissions the permissions for the test. + */ + public static void login(String login, String... permissions) { + + Authentication authentication = new TestingAuthenticationToken(login, login, permissions); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * Logs off any previously logged on user. + */ + public static void logout() { + + SecurityContextHolder.getContext().setAuthentication(null); + } +} From 3237dc516057724a6a00d1f20b577886678e8ba8 Mon Sep 17 00:00:00 2001 From: rajbhush99 <74342267+rajbhush99@users.noreply.github.com> Date: Fri, 4 Dec 2020 20:01:30 +0530 Subject: [PATCH 4/8] update Readme --- Raj_Bhushan/jump_angular/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Raj_Bhushan/jump_angular/README.md b/Raj_Bhushan/jump_angular/README.md index 8b3cead..2160550 100644 --- a/Raj_Bhushan/jump_angular/README.md +++ b/Raj_Bhushan/jump_angular/README.md @@ -1 +1,9 @@ -JUMP THE QUEUE \ No newline at end of file +JUMP THE QUEUE +When visiting public (free) or private (paid) events there are often large queues creating significant waiting times. Ideally the organizer of the event would like to streamline the entry of people into the venue. If people were to arrive right on time they could get into line more efficiently. A website or application could support this process by assigning visitors a queue number. This document describes the design of such a website/application, appropriately named JumpTheQueue. +DESIGN +Technical Architecture: +We have designed our application in 3 layered architecture. these are divided as follows:- +For frontend, we have used angular. +For backend ,we have used devon4j. + +We have designed three components for providing specific functionality. From 8ebdbd497f53c71b73eb163577288dcb427f696e Mon Sep 17 00:00:00 2001 From: rajbhush99 <74342267+rajbhush99@users.noreply.github.com> Date: Fri, 11 Dec 2020 21:00:25 +0530 Subject: [PATCH 5/8] Delete Readme --- Raj_Bhushan/jump_angular/README.md | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 Raj_Bhushan/jump_angular/README.md diff --git a/Raj_Bhushan/jump_angular/README.md b/Raj_Bhushan/jump_angular/README.md deleted file mode 100644 index 2160550..0000000 --- a/Raj_Bhushan/jump_angular/README.md +++ /dev/null @@ -1,9 +0,0 @@ -JUMP THE QUEUE -When visiting public (free) or private (paid) events there are often large queues creating significant waiting times. Ideally the organizer of the event would like to streamline the entry of people into the venue. If people were to arrive right on time they could get into line more efficiently. A website or application could support this process by assigning visitors a queue number. This document describes the design of such a website/application, appropriately named JumpTheQueue. -DESIGN -Technical Architecture: -We have designed our application in 3 layered architecture. these are divided as follows:- -For frontend, we have used angular. -For backend ,we have used devon4j. - -We have designed three components for providing specific functionality. From 440275fb4d7c0b6f65be3a1032d91f67e0036bef Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Fri, 11 Dec 2020 21:26:20 +0530 Subject: [PATCH 6/8] front and backend update 1 --- .../jump_angular/src/app/core/model/shared.ts | 2 +- .../src/app/event/queue/queue.component.html | 1 + .../src/app/event/queue/queue.component.ts | 34 +++-- .../eventmanagement/common/api/Event.java | 31 ++++- .../logic/api/to/EventEto.java | 49 +++++-- .../logic/api/to/EventSearchCriteriaTo.java | 55 ++++++++ .../logic/api/usecase/UcManageEvent.java | 7 - .../common/api/QueueDetail.java | 7 +- .../logic/api/to/QueueDetailEto.java | 6 +- .../api/to/QueueDetailSearchCriteriaTo.java | 7 +- .../api/usecase/UcManageQueueDetail.java | 22 ++++ .../QueuedetailmanagementRestService.java | 5 + .../dataaccess/api/EventEntity.java | 47 ++++++- .../dataaccess/api/repo/EventRepository.java | 7 - .../logic/impl/EventmanagementImpl.java | 7 - .../logic/impl/usecase/UcManageEventImpl.java | 22 ---- .../dataaccess/api/QueueDetailEntity.java | 7 +- .../logic/impl/QueuedetailmanagementImpl.java | 7 + .../impl/usecase/UcManageQueueDetailImpl.java | 123 +++++++++--------- .../db/migration/1.0/V0006__Event.sql | 4 +- .../db/migration/1.0/V0007__QueueDetail.sql | 2 +- .../db/migration/1.0/V0008__Master_Data.sql | 10 +- .../logic/impl/EventmanagementTest.java | 2 +- 23 files changed, 305 insertions(+), 159 deletions(-) diff --git a/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts b/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts index 092114f..2406fb6 100644 --- a/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts +++ b/Raj_Bhushan/jump_angular/src/app/core/model/shared.ts @@ -51,7 +51,7 @@ export class QueueDetail { creationTime: string; startTime?: string; endTime?: string; - minEstimatedTime: string; + minEstimatedTime:any; visitorId: number; eventId: number; } diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html index f2c07f4..c0ee641 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.html @@ -12,6 +12,7 @@

Currently estimate time:

+
diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts index ba5de34..53fd559 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts @@ -20,7 +20,6 @@ export class QueueComponent implements OnInit, OnChanges { public visitorId: any; event: Event = null; queueDetail: QueueDetail = null; - queueId1 = 0; @Input() id: any; constructor( private queueService: QueueService, @@ -32,6 +31,7 @@ export class QueueComponent implements OnInit, OnChanges { ngOnChanges(changes: SimpleChanges): void { this.getEventDetails(); } + queuetime:number; ngOnInit(): void { } @@ -49,8 +49,10 @@ export class QueueComponent implements OnInit, OnChanges { }); } onJoinQueue(eventId) { + console.log(eventId); this.queueService.joinQueue(eventId, this.authService.getVisitorId()).subscribe((data) => { this.queueDetail = data; + console.log(data); const user = this.getCurrentUser(); const temp = { queueNumber : this.queueDetail.queueNumber, queueId: this.queueDetail.id , @@ -65,32 +67,40 @@ export class QueueComponent implements OnInit, OnChanges { ); }); } + getEstimatedTime() { - // const current = parseInt(this.event.currentNumber.substring(1)); - // const queue1 = this.getMyNumberFromLocal(); - // const queue = parseInt(queue1.substring(1)); - // const difference = (queue - current) * 120; - // return difference; - // const time = parseInt(this.queueDetail.minEstimatedTime); - // return time; const user = this.getCurrentUser(); const temp = localStorage.getItem(user + '#' + this.event.id); if (temp == null) { return ''; } const temp1 = JSON.parse(localStorage.getItem(user + '#' + this.event.id)); - return temp1.minEstimatedTime; + const currentTime = new Date().getTime(); + const estimatedTime = new Date(temp1.minEstimatedTime).getTime(); + const diff = estimatedTime - currentTime; + const hr = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const min = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); + const sec = Math.floor((diff % (1000 * 60)) / (1000)) +min*60 + hr*60*60 + if(diff<0) + { + return 0; + } else{ + return sec; + } } - onLeaveQueue(id) { - this.queueService.leaveQueue(id).subscribe((data) => { + onLeaveQueue(queueId) { + console.log(queueId); + this.queueService.leaveQueue(queueId).subscribe((data) => { + console.log(queueId + ' has been deleted successfully') const user = this.getCurrentUser(); localStorage.removeItem(user + '#' + this.event.id); this.snackbar.open('Leave the event', '', { duration: 2000, panelClass: ['leave'], - }); }); + }); + }); } getMyNumberFromLocal() { diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java index 9f3c793..e887cc4 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/common/api/Event.java @@ -1,6 +1,6 @@ package com.devonfw.application.jtqj.eventmanagement.common.api; -import java.time.Duration; +import java.sql.Timestamp; import com.devonfw.application.jtqj.general.common.api.ApplicationEntity; @@ -57,10 +57,33 @@ public interface Event extends ApplicationEntity { public void setCustomers(int customers); /** - * @param attentionTime setter for attentionTime attribute + * @return startDateId */ - public void setAttentionTime(Duration attentionTime); + public Timestamp getStartDate(); - public Duration getAttentionTime(); + /** + * @param startDate setter for startDate attribute + */ + public void setStartDate(Timestamp startDate); + + /** + * @return endDateId + */ + public Timestamp getEndDate(); + + /** + * @param endDate setter for endDate attribute + */ + public void setEndDate(Timestamp endDate); + + /** + * @return minAttentionTimeId + */ + public Timestamp getMinAttentionTime(); + + /** + * @param minAttentionTime setter for minAttentionTime attribute + */ + public void setMinAttentionTime(Timestamp minAttentionTime); } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java index 3b2d87c..537430d 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventEto.java @@ -1,6 +1,6 @@ package com.devonfw.application.jtqj.eventmanagement.logic.api.to; -import java.time.Duration; +import java.sql.Timestamp; import com.devonfw.application.jtqj.eventmanagement.common.api.Event; import com.devonfw.module.basic.common.api.to.AbstractEto; @@ -20,10 +20,14 @@ public class EventEto extends AbstractEto implements Event { private String currentNumber; - private Duration attentionTime; - private int customers; + private Timestamp startDate; + + private Timestamp endDate; + + private Timestamp minAttentionTime; + @Override public String getEventName() { @@ -139,13 +143,6 @@ public boolean equals(Object obj) { } else if (!this.currentNumber.equals(other.currentNumber)) { return false; } - if (this.attentionTime == null) { - if (other.attentionTime != null) { - return false; - } - } else if (!this.attentionTime.equals(other.attentionTime)) { - return false; - } if (this.customers != other.customers) { return false; @@ -154,15 +151,39 @@ public boolean equals(Object obj) { } @Override - public void setAttentionTime(Duration attentionTime) { + public Timestamp getStartDate() { + + return this.startDate; + } + + @Override + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + } + + @Override + public Timestamp getEndDate() { + + return this.endDate; + } + + @Override + public void setEndDate(Timestamp endDate) { + + this.endDate = endDate; + } + + @Override + public Timestamp getMinAttentionTime() { - this.attentionTime = attentionTime; + return this.minAttentionTime; } @Override - public Duration getAttentionTime() { + public void setMinAttentionTime(Timestamp minAttentionTime) { - return this.attentionTime; + this.minAttentionTime = minAttentionTime; } } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java index 996fdbb..1e3e728 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/to/EventSearchCriteriaTo.java @@ -1,5 +1,6 @@ package com.devonfw.application.jtqj.eventmanagement.logic.api.to; +import java.sql.Timestamp; import java.time.Duration; import com.devonfw.application.jtqj.general.common.api.to.AbstractSearchCriteriaTo; @@ -34,6 +35,12 @@ public class EventSearchCriteriaTo extends AbstractSearchCriteriaTo { private StringSearchConfigTo currentNumberOption; + private Timestamp startDate; + + private Timestamp endDate; + + private Timestamp minAttentionTime; + /** * @return eventNameId */ @@ -202,4 +209,52 @@ public void setAttentionTime(Duration attentionTime) { this.attentionTime = attentionTime; } + /** + * @return startDateId + */ + public Timestamp getStartDate() { + + return this.startDate; + } + + /** + * @param startDate setter for startDate attribute + */ + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + } + + /** + * @return endDateId + */ + public Timestamp getEndDate() { + + return this.endDate; + } + + /** + * @param endDate setter for endDate attribute + */ + public void setEndDate(Timestamp endDate) { + + this.endDate = endDate; + } + + /** + * @return minAttentionTimeId + */ + public Timestamp getMinAttentionTime() { + + return this.minAttentionTime; + } + + /** + * @param minAttentionTime setter for minAttentionTime attribute + */ + public void setMinAttentionTime(Timestamp minAttentionTime) { + + this.minAttentionTime = minAttentionTime; + } + } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java index 61bb82d..c7815a2 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/api/usecase/UcManageEvent.java @@ -37,11 +37,4 @@ public interface UcManageEvent { */ void increaseEventCustomer(long eventId); - /** - * - * Increase currently being attended - * - * @param eventId - */ - void increaseCurrentlyAttended(long eventId); } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java index 9e85c51..a49fd94 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/common/api/QueueDetail.java @@ -73,8 +73,11 @@ public interface QueueDetail extends ApplicationEntity { /** * @param minEstimatedTime setter for minEstimatedTime attribute */ - public void setMinEstimatedTime(String minEstimatedTime); + public void setMinEstimatedTime(Timestamp minEstimatedTime); - public String getMinEstimatedTime(); + /** + * @return minEstimatedTime + */ + public Timestamp getMinEstimatedTime(); } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java index 7df264b..e775cb8 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailEto.java @@ -24,7 +24,7 @@ public class QueueDetailEto extends AbstractEto implements QueueDetail { private Long eventId; - private String minEstimatedTime; + private Timestamp minEstimatedTime; @Override public String getQueueNumber() { @@ -176,13 +176,13 @@ public boolean equals(Object obj) { } @Override - public String getMinEstimatedTime() { + public Timestamp getMinEstimatedTime() { return this.minEstimatedTime; } @Override - public void setMinEstimatedTime(String minEstimatedTime) { + public void setMinEstimatedTime(Timestamp minEstimatedTime) { this.minEstimatedTime = minEstimatedTime; } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java index 248e6eb..056139e 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java @@ -1,7 +1,6 @@ package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to; import java.sql.Timestamp; -import java.time.Duration; import com.devonfw.application.jtqj.general.common.api.to.AbstractSearchCriteriaTo; import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; @@ -28,7 +27,7 @@ public class QueueDetailSearchCriteriaTo extends AbstractSearchCriteriaTo { private StringSearchConfigTo queueNumberOption; - private Duration minEstimatedTime; + private String minEstimatedTime; /** * @return queueNumberId @@ -149,7 +148,7 @@ public void setQueueNumberOption(StringSearchConfigTo queueNumberOption) { /** * @return minEstimatedTimeId */ - public Duration getMinEstimatedTime() { + public String getMinEstimatedTime() { return this.minEstimatedTime; } @@ -157,7 +156,7 @@ public Duration getMinEstimatedTime() { /** * @param minEstimatedTime setter for minEstimatedTime attribute */ - public void setMinEstimatedTime(Duration minEstimatedTime) { + public void setMinEstimatedTime(String minEstimatedTime) { this.minEstimatedTime = minEstimatedTime; } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java index b10031f..77fafad 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java @@ -1,10 +1,19 @@ package com.devonfw.application.jtqj.queuedetailmanagement.logic.api.usecase; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; /** * Interface of UcManageQueueDetail to centralize documentation and signatures of methods. */ +/** + * @author rajbhush + * + */ +/** + * @author rajbhush + * + */ public interface UcManageQueueDetail { /** @@ -31,6 +40,19 @@ public interface UcManageQueueDetail { */ QueueDetailEto joinQueue(QueueDetailEto queueDetail); + /** + * LeaveQueue method Deletes an queueDetail from the database by its ID 'queueDetailId'. Decreases the count of + * customers of the event assigned to the queueDetail by one. + * + * @param queueDetailId + */ + void leaveQueue(long queueDetailId); + /** + * @param eventId + * @return EventDetail of particular EventId + */ + EventEto getEventDetailById(long eventId); + } diff --git a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java index 5132593..fdf619f 100644 --- a/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java +++ b/Raj_Bhushan/jump_java/jtqj1/api/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java @@ -63,6 +63,11 @@ public interface QueuedetailmanagementRestService { @Path("/queuedetail/joinqueue/") public QueueDetailEto joinQueue(QueueDetailEto queuedetail); + /** + * Delegates to {@link Queuedetailmanagement#deleteQueueDetail}. + * + * @param id ID of the {@link QueueDetailEto} to be deleted + */ @DELETE @Path("/queuedetail/leavequeue/{id}/") public void leaveQueue(@PathParam("id") long id); diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java index ea985c4..9d18b1d 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/EventEntity.java @@ -1,9 +1,11 @@ package com.devonfw.application.jtqj.eventmanagement.dataaccess.api; -import java.time.Duration; +import java.sql.Timestamp; import javax.persistence.Entity; import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; import com.devonfw.application.jtqj.eventmanagement.common.api.Event; import com.devonfw.application.jtqj.general.dataaccess.api.ApplicationPersistenceEntity; @@ -23,7 +25,14 @@ public class EventEntity extends ApplicationPersistenceEntity implements Event { private String currentNumber; - private Duration attentionTime; + @Temporal(TemporalType.TIMESTAMP) + private Timestamp startDate; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp endDate; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp minAttentionTime; private int customers; @@ -120,16 +129,42 @@ public void setCustomers(int customers) { } @Override - public void setAttentionTime(Duration attentionTime) { + public Timestamp getStartDate() { + + return this.startDate; + } + + @Override + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + + } + + @Override + public Timestamp getEndDate() { + + return this.endDate; + } + + @Override + public void setEndDate(Timestamp endDate) { - this.attentionTime = attentionTime; + this.endDate = endDate; } @Override - public Duration getAttentionTime() { + public Timestamp getMinAttentionTime() { + + return this.minAttentionTime; + } + + @Override + public void setMinAttentionTime(Timestamp minAttentionTime) { + + this.minAttentionTime = minAttentionTime; - return this.attentionTime; } } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java index cc6a89b..adf62ce 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/dataaccess/api/repo/EventRepository.java @@ -102,13 +102,6 @@ public default void addOrderBy(JPAQuery query, EventEntity alias, S query.orderBy($(alias.getCurrentNumber()).desc()); } break; - case "attentionTime": - if (next.isAscending()) { - query.orderBy($(alias.getAttentionTime()).asc()); - } else { - query.orderBy($(alias.getAttentionTime()).desc()); - } - break; case "customers": if (next.isAscending()) { diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java index ef339cf..1d7407d 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementImpl.java @@ -62,11 +62,4 @@ public void increaseEventCustomer(long eventId) { } - @Override - public void increaseCurrentlyAttended(long eventId) { - - this.ucManageEvent.increaseCurrentlyAttended(eventId); - - } - } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java index d7c32bc..5d25933 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/usecase/UcManageEventImpl.java @@ -53,7 +53,6 @@ public EventEto saveEvent(EventEto event) { public void decreaseEventCustomer(long eventId) { EventEntity eventEntity = getEventRepository().find(eventId); - eventEntity.setCustomers(eventEntity.getCustomers() - 1); getEventRepository().save(eventEntity); @@ -68,25 +67,4 @@ public void increaseEventCustomer(long eventId) { } - @Override - public void increaseCurrentlyAttended(long eventId) { - - // EventEntity eventEntity = getEventRepository().find(eventId); - // String current = eventEntity.getCurrentNumber(); - // String current1 = current.substring(1); - // int no = Integer.parseInt(current1); - // - // int newQueueDigit = no + 1; - // String newQueueCode = ""; - // StringBuilder stringBuilder = new StringBuilder(); - // stringBuilder.append(newQueueDigit); - // while (stringBuilder.length() < 3) { - // stringBuilder.insert(0, "0"); - // } - // stringBuilder.insert(0, "Q"); - // newQueueCode = stringBuilder.toString(); - // eventEntity.setCurrentNumber(newQueueCode); - // getEventRepository().save(eventEntity); - } - } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java index fbb37d8..f9a2d84 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java @@ -37,7 +37,8 @@ public class QueueDetailEntity extends ApplicationPersistenceEntity implements Q @Temporal(TemporalType.TIMESTAMP) private Timestamp endTime; - private String minEstimatedTime; + @Temporal(TemporalType.TIMESTAMP) + private Timestamp minEstimatedTime; private VisitorEntity visitor; @@ -198,14 +199,14 @@ public void setEventId(Long eventId) { } @Override - public void setMinEstimatedTime(String i) { + public void setMinEstimatedTime(Timestamp i) { this.minEstimatedTime = i; } @Override - public String getMinEstimatedTime() { + public Timestamp getMinEstimatedTime() { return this.minEstimatedTime; } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java index 1cf4137..d03afb2 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java @@ -5,6 +5,7 @@ import org.springframework.data.domain.Page; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; import com.devonfw.application.jtqj.general.logic.base.AbstractComponentFacade; import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailCto; @@ -81,4 +82,10 @@ public void leaveQueue(long queueDetailId) { } + @Override + public EventEto getEventDetailById(long eventId) { + + return this.ucManageQueueDetail.getEventDetailById(eventId); + } + } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java index 9e7d453..23f8e27 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/java/com/devonfw/application/jtqj/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java @@ -16,6 +16,7 @@ import org.springframework.validation.annotation.Validated; import com.devonfw.application.jtqj.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqj.eventmanagement.logic.api.to.EventEto; import com.devonfw.application.jtqj.queuedetailmanagement.dataaccess.api.QueueDetailEntity; import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.Queuedetailmanagement; import com.devonfw.application.jtqj.queuedetailmanagement.logic.api.to.QueueDetailEto; @@ -45,13 +46,9 @@ public class UcManageQueueDetailImpl extends AbstractQueueDetailUc implements Uc @Override public void deleteQueueDetail(long queueDetailId) { - // long eventId = getQueueDetailRepository().find(queueDetailId).getEventId(); - // this.eventmanagement.decreaseEventCustomer(eventId); - // LOG.debug("The event with id '{}' has decreased its customers.", eventId); - // - // // then we delete the queueDetail - // getQueueDetailRepository().deleteById(queueDetailId); - // LOG.debug("The queuedetail with id '{}' has been deleted.", queueDetailId); + QueueDetailEntity queue = getQueueDetailRepository().find(queueDetailId); + getQueueDetailRepository().delete(queue); + LOG.debug("The queue with id '{}' has been deleted.", queueDetailId); } @Override @@ -60,30 +57,6 @@ public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetail) { return Objects.requireNonNull(queueDetail, "queueDetail"); } - /** - * Generates a new queue code using the queue digit of the last codeaccess created. - * - * @param lastQueueDigit the int of the last codeaccess created. - * @return the String with the new queue code (example: 'Q007'). - */ - public String generateQueueNumber(int lastQueueDigit) { - - int newQueueDigit = lastQueueDigit + 1; - String newQueueCode = ""; - if (newQueueDigit == 1000) { - newQueueCode = "Q000"; - } else { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(newQueueDigit); - while (stringBuilder.length() < 3) { - stringBuilder.insert(0, "0"); - } - stringBuilder.insert(0, "Q"); - newQueueCode = stringBuilder.toString(); - } - return newQueueCode; - } - public Eventmanagement getEventmanagement() { return this.eventmanagement; @@ -100,17 +73,10 @@ public QueueDetailEto joinQueue(QueueDetailEto queueDetail) { QueueDetailEntity queueDetailEntity = getBeanMapper().map(queueDetail, QueueDetailEntity.class); long eventEntityId = queueDetailEntity.getEventId(); - long visitorEntityId = queueDetailEntity.getVisitorId(); - System.out.println(eventEntityId); - System.out.println(visitorEntityId); - QueueDetailSearchCriteriaTo queueDetailSearchcriteriaTo = new QueueDetailSearchCriteriaTo(); - queueDetailSearchcriteriaTo.setEventId(eventEntityId); - // queueDetailSearchcriteriaTo.setVisitorId(visitorEntityId); - Pageable pageable = PageRequest.of(0, 1000); - queueDetailSearchcriteriaTo.setPageable(pageable); - List queueDetailEtosInEvent = getQueuedetailmanagement() - .findQueueDetailEtos(queueDetailSearchcriteriaTo).getContent(); + EventEto event = getEventDetailById(eventEntityId); + + List queueDetailEtosInEvent = getQueueDetailEtosInEvent(eventEntityId); // if there are no ETOs, we set the ticket to the first code // else we get the digit of the last ticket in the list and generate a new code for the ticket if (queueDetailEtosInEvent.isEmpty()) { @@ -121,45 +87,84 @@ public QueueDetailEto joinQueue(QueueDetailEto queueDetail) { queueDetailEntity.setQueueNumber(generateQueueNumber(lastQueueDigit)); } queueDetailEntity.setCreationTime(Timestamp.from(Instant.now())); - queueDetailEntity.setStartTime(null); - queueDetailEntity.setEndTime(null); - queueDetailEntity.setMinEstimatedTime(getEstimatedTime(eventEntityId, queueDetailEntity.getQueueNumber())); + queueDetailEntity.setStartTime(event.getStartDate()); + queueDetailEntity.setEndTime(event.getEndDate()); + queueDetailEntity.setMinEstimatedTime(getQueueEstimatedTime(eventEntityId, queueDetailEntity.getQueueNumber())); // save access code QueueDetailEntity queueDetailEntitySaved = getQueueDetailRepository().save(queueDetailEntity); - LOG.debug("The queuedetail with id '{}' has been saved.", queueDetailEntitySaved.getId()); - /** - * Using the method getEventmanagement() gives access to the methods that were created earlier in the usecasemanage - * (inside the event component). This is done so each component takes care of its own modifications. - */ getEventmanagement().increaseEventCustomer(queueDetailEntitySaved.getEventId()); LOG.debug("The event with id '{}' has increased its customers.", queueDetailEntitySaved.getEventId()); return getBeanMapper().map(queueDetailEntitySaved, QueueDetailEto.class); } - private String getEstimatedTime(long eventId, String queueNo) { + /** + * @param eventEntityId + * @return + */ + private List getQueueDetailEtosInEvent(long eventEntityId) { + + QueueDetailSearchCriteriaTo queueDetailSearchcriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailSearchcriteriaTo.setEventId(eventEntityId); + Pageable pageable = PageRequest.of(0, 1000); + queueDetailSearchcriteriaTo.setPageable(pageable); + return getQueuedetailmanagement().findQueueDetailEtos(queueDetailSearchcriteriaTo).getContent(); + + } + + /** + * Generates a new queue code using the queue digit of the last codeaccess created. + * + * @param lastQueueDigit the int of the last codeaccess created. + * @return the String with the new queue code (example: 'Q007'). + */ + public String generateQueueNumber(int lastQueueDigit) { + + int newQueueDigit = lastQueueDigit + 1; + String newQueueCode = ""; + if (newQueueDigit == 1000) { + newQueueCode = "Q000"; + } else { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(newQueueDigit); + while (stringBuilder.length() < 3) { + stringBuilder.insert(0, "0"); + } + stringBuilder.insert(0, "Q"); + newQueueCode = stringBuilder.toString(); + } + return newQueueCode; + } + + /** + * @param eventId + * @param queueNo + * @return Minimum estimated time for that queue number + */ + public Timestamp getQueueEstimatedTime(long eventId, String queueNo) { String currentlyAttended = getEventmanagement().findEvent(eventId).getCurrentNumber(); - // System.out.println(currentlyAttended); int currently = Integer.parseInt(currentlyAttended.substring(1)); int queue = Integer.parseInt(queueNo.substring(1)); - // System.out.println(queue); - int result = (queue - currently) * 120; - // System.out.println(result); - return Integer.toString(result); + long currentTime = Timestamp.from(Instant.now()).getTime(); + Timestamp queueTime = new Timestamp(currentTime + (queue - currently) * 120000); + return queueTime; + } + + @Override + public EventEto getEventDetailById(long eventId) { + + return getEventmanagement().findEvent(eventId); } @Override public void leaveQueue(long queueDetailId) { long eventId = getQueueDetailRepository().find(queueDetailId).getEventId(); - this.eventmanagement.decreaseEventCustomer(eventId); - this.eventmanagement.increaseCurrentlyAttended(eventId); + getEventmanagement().decreaseEventCustomer(eventId); LOG.debug("The event with id '{}' has decreased its customers.", eventId); - - // then we delete the queueDetail getQueueDetailRepository().deleteById(queueDetailId); LOG.debug("The queuedetail with id '{}' has been deleted.", queueDetailId); } diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql index 6d6e72a..e70f20b 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0006__Event.sql @@ -4,6 +4,8 @@ eventName VARCHAR(255), logo VARCHAR(255), description VARCHAR(255), currentNumber VARCHAR(255), - attentionTime BIGINT, +startDate TIMESTAMP, +endDate TIMESTAMP, +minAttentionTime TIMESTAMP, customers INTEGER NOT NULL DEFAULT '0', CONSTRAINT PK_Event PRIMARY KEY(id) ); \ No newline at end of file diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql index 4eee0d5..bed3487 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0007__QueueDetail.sql @@ -5,7 +5,7 @@ CREATE TABLE QueueDetail( creationTime TIMESTAMP, startTime TIMESTAMP, endTime TIMESTAMP, - minEstimatedTime VARCHAR(255), + minEstimatedTime TIMESTAMP, idVisitor BIGINT NOT NULL, idEvent BIGINT NOT NULL, CONSTRAINT PK_QueueDetail PRIMARY KEY(id), diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql index da4b2d3..84b6c71 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/main/resources/db/migration/1.0/V0008__Master_Data.sql @@ -1,9 +1,9 @@ INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, acceptedTerms, userType) VALUES (0, 1, 'raj@mail.com', 'raj', 'raj123', '9876543211', '0', '1', '1'); INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, acceptedTerms, userType) VALUES (1, 1, 'krishna@mail.com', 'krishna', 'krishna123', '9876543211', '1', '1', '0'); -INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (11, 1, 'Butter Cup', 'C:/logos/Day1Logo.png', 'Q001',120, 0); -INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (22, 1, 'Christmas party', 'C:/logos/Day1Logo.png', 'Q001',120,0); -INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (33, 1, 'New Year', 'C:/logos/Day1Logo.png', 'Q001',120, 0); -INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (44, 1, 'Fintech Festival', 'C:/logos/Day1Logo.png', 'Q001',120, 0); -INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, attentionTime, customers) VALUES (55, 1, 'Dark Roast', 'C:/logos/Day1Logo.png', 'Q001',120,0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, startDate, endDate, minAttentionTime, customers) VALUES (11, 1, 'Butter Cup', 'C:/logos/Day1Logo.png', 'Q001','2020-12-10 00:00:01','2008-12-15 00:00:01',null, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, startDate, endDate, minAttentionTime, customers) VALUES (22, 1, 'Christmas party', 'C:/logos/Day1Logo.png', 'Q001','2020-12-10 00:00:01','2008-12-15 00:00:01',null,0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, startDate, endDate, minAttentionTime, customers) VALUES (33, 1, 'New Year', 'C:/logos/Day1Logo.png', 'Q001','2020-12-10 00:00:01','2008-12-15 00:00:01',null, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, startDate, endDate, minAttentionTime, customers) VALUES (44, 1, 'Fintech Festival', 'C:/logos/Day1Logo.png', 'Q001','2020-12-10 00:00:01','2008-12-15 00:00:01',null, 0); +INSERT INTO Event (id, modificationCounter, eventName, logo, currentNumber, startDate, endDate, minAttentionTime, customers) VALUES (55, 1, 'Dark Roast', 'C:/logos/Day1Logo.png', 'Q001','2020-12-10 00:00:01','2008-12-15 00:00:01',null,0); diff --git a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java index 440a905..a94b189 100644 --- a/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java +++ b/Raj_Bhushan/jump_java/jtqj1/core/src/test/java/com/devonfw/application/jtqj/eventmanagement/logic/impl/EventmanagementTest.java @@ -31,7 +31,7 @@ protected void doSetUp() { this.eventEto.setEventName("Butter Cup"); this.eventEto.setLogo(null); this.eventEto.setCurrentNumber("Q001"); - this.eventEto.setAttentionTime(null); + this.eventEto.setMinAttentionTime(null); this.eventEto.setCustomers(2); } From f48a13f8e295da8ba129d835e4c4b68232b5cbd1 Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Mon, 14 Dec 2020 16:17:38 +0530 Subject: [PATCH 7/8] update readme --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f1bce55..2969ac4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ -# JumpTheQueueGallery -Various implementations of JumpTheQueue +JUMP THE QUEUE +When visiting public (free) or private (paid) events there are often large queues creating significant waiting +times. Ideally the organizer of the event would like to streamline the entry of people into the venue. +If people were to arrive right on time they could get into line more efficiently. A website or application +could support this process by assigning visitors a queue number. This document describes the design of such a + website/application, appropriately named JumpTheQueue. + +Technical Architecture: +We have designed our application in 3 layered architecture. these are divided as follows:- +For front end we have used devon4ng in angular and for backend we have used devon4j in java. + + +Execution: For the execution of front end 'devon ng serve' command has been used. For backend execution we have run the application in Eclipse.. + For checking the backend functionalities we have used Postman. + For checking the frontend functionalities we have used chrome. + +Integration: We have integrated backend and frontend using the REST API calls. From 03919f6327f9d2abe4dcefd65498c1e7b0e50464 Mon Sep 17 00:00:00 2001 From: BHUSHAN Date: Wed, 6 Jan 2021 12:43:14 +0530 Subject: [PATCH 8/8] queue update --- .../src/app/event/queue/queue.component.ts | 13 +++++++------ .../src/app/event/queue/services/queue.service.ts | 13 ++++++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts index 53fd559..d27f145 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/queue.component.ts @@ -48,9 +48,10 @@ export class QueueComponent implements OnInit, OnChanges { } }); } - onJoinQueue(eventId) { + onJoinQueue(eventId) { console.log(eventId); - this.queueService.joinQueue(eventId, this.authService.getVisitorId()).subscribe((data) => { + this.queueService.joinQueue(eventId, this.authService.getVisitorId()) + .then((data) => { this.queueDetail = data; console.log(data); const user = this.getCurrentUser(); @@ -59,7 +60,7 @@ export class QueueComponent implements OnInit, OnChanges { minEstimatedTime: this.queueDetail.minEstimatedTime}; localStorage.setItem(user + '#' + this.event.id, JSON.stringify(temp)) ; this.snackbar.open( - 'Succefully joined the queue ', '', + 'Successfully joined the queue ', '', { duration: 2000, panelClass: ['success'], @@ -92,7 +93,7 @@ export class QueueComponent implements OnInit, OnChanges { onLeaveQueue(queueId) { console.log(queueId); - this.queueService.leaveQueue(queueId).subscribe((data) => { + this.queueService.leaveQueue(queueId).then((data) => { console.log(queueId + ' has been deleted successfully') const user = this.getCurrentUser(); localStorage.removeItem(user + '#' + this.event.id); @@ -116,8 +117,8 @@ export class QueueComponent implements OnInit, OnChanges { getQueueIdFromLocal() { const user = this.getCurrentUser(); - const a = localStorage.getItem(user + '#' + this.event.id); - if ( a == null) { + const temp = localStorage.getItem(user + '#' + this.event.id); + if ( temp == null) { return ''; } const abc = JSON.parse(localStorage.getItem(user + '#' + this.event.id)); diff --git a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts index e568bcd..ca7e9ef 100644 --- a/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts +++ b/Raj_Bhushan/jump_angular/src/app/event/queue/services/queue.service.ts @@ -4,7 +4,7 @@ import { Event } from '../../../core/model/event'; import { Observable } from 'rxjs'; import { FilterEvent, Pageable, QueueDetail } from '../../../core/model/shared'; import { environment } from 'src/environments/environment'; -import { map } from 'rxjs/operators'; +import { delay, map } from 'rxjs/operators'; import { AuthService } from 'src/app/core/security/auth.service'; @Injectable({ @@ -31,13 +31,16 @@ private baseUrl = environment.baseUrlRestServices; ); } - leaveQueue(queuedetailId: number): Observable { - return this.http.delete(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/leavequeue/' + queuedetailId + '/'); + async leaveQueue(queuedetailId: number) { + const leave=await this.http.delete(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/leavequeue/' + queuedetailId + '/').toPromise(); + return leave; } - joinQueue(eventId: number , visitorId: number ): Observable { + + async joinQueue(eventId: number , visitorId: number ) { const queuedetail: QueueDetail = new QueueDetail(); queuedetail.eventId = eventId; queuedetail.visitorId = visitorId; - return this.http.post(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/joinqueue/', queuedetail); + const result = await this.http.post(`${this.baseUrl}` + '/queuedetailmanagement/v1/queuedetail/joinqueue/', queuedetail).toPromise() + return result; } }