From f507d92d55ee77fad16cc024ea95c869e0d5dc32 Mon Sep 17 00:00:00 2001 From: elinuxhenrik Date: Thu, 19 Mar 2020 14:52:24 +0100 Subject: [PATCH] First version of NonRT RIC Controlpanel Change-Id: Ie068bbc18c8c07d8fcb5a6608c07f223cda6f88b Issue-ID: NONRTRIC-168 Signed-off-by: elinuxhenrik --- .gitignore | 53 + LICENSES.txt | 30 + README.md | 26 + pom.xml | 122 + tox.ini | 30 + webapp-backend/.gitignore | 34 + webapp-backend/README.md | 26 + webapp-backend/config/.gitignore | 2 + webapp-backend/config/key.properties.template | 21 + webapp-backend/config/portal.properties.template | 34 + webapp-backend/eclipse-formatter.xml | 315 + webapp-backend/pom.xml | 348 + .../controlpanel/ControlpanelApplication.java | 60 + .../controlpanel/ControlpanelConstants.java | 45 + .../controlpanel/ControlpanelUserManager.java | 183 + .../controlpanel/config/AdminConfiguration.java | 58 + .../config/PortalApiConfiguration.java | 58 + .../controlpanel/config/SpringContextCache.java | 44 + .../controlpanel/config/SwaggerConfiguration.java | 69 + .../config/WebSecurityConfiguration.java | 124 + .../CustomResponseEntityExceptionHandler.java | 83 + .../controller/Html5PathsController.java | 67 + .../controlpanel/controller/PolicyController.java | 139 + .../controller/SimpleErrorController.java | 92 + .../k8sapi/SimpleKubernetesClient.java | 56 + .../controlpanel/model/EcompUserDetails.java | 93 + .../controlpanel/model/ErrorTransport.java | 134 + .../controlpanel/model/IControlpanelResponse.java | 28 + .../nonrtric/controlpanel/model/PolicyInfo.java | 42 + .../controlpanel/model/PolicyInstances.java | 29 + .../nonrtric/controlpanel/model/PolicyType.java | 58 + .../nonrtric/controlpanel/model/PolicyTypes.java | 29 + .../controlpanel/model/SuccessTransport.java | 64 + .../policyagentapi/PolicyAgentApi.java | 40 + .../policyagentapi/PolicyAgentApiImpl.java | 213 + .../portalapi/IPortalSdkDecryptor.java | 42 + .../controlpanel/portalapi/PortalAuthManager.java | 120 + .../portalapi/PortalAuthenticationFilter.java | 281 + .../portalapi/PortalRestCentralServiceImpl.java | 93 + .../portalapi/PortalSdkDecryptorAes.java | 34 + .../portalapi/PortalSdkDecryptorPkc.java | 33 + .../controlpanel/util/HttpsURLConnectionUtils.java | 69 + webapp-backend/src/main/resources/ESAPI.properties | 385 + .../src/main/resources/application.properties | 63 + webapp-backend/src/main/resources/key.properties | 22 + webapp-backend/src/main/resources/logback.xml | 78 + .../src/main/resources/portal.properties | 34 + .../src/main/resources/static/error.html | 36 + .../src/main/resources/validation.properties | 19 + .../controlpanel/ControlpanelTestServer.java | 70 + .../controlpanel/ControlpanelUserManagerTest.java | 86 + .../config/PolicyControllerMockConfiguration.java | 192 + .../config/PortalApIMockConfiguration.java | 84 + .../config/WebSecurityMockConfiguration.java | 85 + .../controller/AbstractControllerTest.java | 113 + .../controller/DefaultContextTest.java | 49 + .../controller/PortalRestCentralServiceTest.java | 112 + .../policyagentapi/PolicyAgentApiImplTest.java | 322 + .../portalapi/PortalAuthManagerTest.java | 95 + .../test/resources/caas-ingress-ricaux-pods.json | 9 + .../test/resources/caas-ingress-ricplt-pods.json | 1847 +++ .../src/test/resources/demo-policy-schema-1.json | 42 + .../src/test/resources/demo-policy-schema-2.json | 49 + .../src/test/resources/demo-policy-schema-3.json | 59 + webapp-backend/src/test/resources/key.properties | 22 + .../src/test/resources/portal.properties | 26 + webapp-frontend/.gitignore | 41 + webapp-frontend/README.md | 44 + webapp-frontend/angular.json | 150 + webapp-frontend/browserslist | 11 + webapp-frontend/e2e/protractor.conf.js | 47 + webapp-frontend/e2e/src/app.e2e-spec.ts | 42 + webapp-frontend/e2e/src/app.po.ts | 30 + webapp-frontend/e2e/tsconfig.e2e.json | 13 + webapp-frontend/ng | 27 + webapp-frontend/npm | 27 + webapp-frontend/package-lock.json | 13396 +++++++++++++++++++ webapp-frontend/package.json | 73 + webapp-frontend/pom.xml | 114 + webapp-frontend/proxy.conf.json | 6 + .../src/app/controlpanel-routing.module.ts | 43 + .../src/app/controlpanel.component.html | 117 + .../src/app/controlpanel.component.scss | 379 + .../src/app/controlpanel.component.spec.ts | 54 + webapp-frontend/src/app/controlpanel.component.ts | 57 + webapp-frontend/src/app/controlpanel.module.ts | 141 + .../src/app/footer/footer.component.html | 25 + .../src/app/footer/footer.component.scss | 30 + .../src/app/footer/footer.component.spec.ts | 44 + webapp-frontend/src/app/footer/footer.component.ts | 52 + .../src/app/interfaces/controlpanel.types.ts | 58 + webapp-frontend/src/app/interfaces/policy.types.ts | 40 + webapp-frontend/src/app/main/main.component.html | 23 + webapp-frontend/src/app/main/main.component.scss | 27 + .../src/app/main/main.component.spec.ts | 44 + webapp-frontend/src/app/main/main.component.ts | 33 + .../sidenav-list/sidenav-list.component.html | 30 + .../sidenav-list/sidenav-list.component.scss | 36 + .../sidenav-list/sidenav-list.component.ts | 44 + .../policy-control/policy-control.component.html | 80 + .../policy-control/policy-control.component.scss | 45 + .../policy-control.component.spec.ts | 44 + .../app/policy-control/policy-control.component.ts | 112 + .../policy-instance-dialog.component.html | 99 + .../policy-instance-dialog.component.scss | 72 + .../policy-instance-dialog.component.ts | 236 + .../policy-control/policy-instance.component.html | 75 + .../policy-control/policy-instance.component.scss | 52 + .../policy-control/policy-instance.component.ts | 129 + .../policy-control/policy-instance.datasource.ts | 103 + .../app/policy-control/policy-type.datasource.ts | 106 + .../caas-ingress/caas-ingress.service.spec.ts | 31 + .../services/caas-ingress/caas-ingress.service.ts | 58 + .../controlpanel/controlpanel.service.spec.ts | 32 + .../services/controlpanel/controlpanel.service.ts | 65 + .../src/app/services/policy/policy.service.spec.ts | 31 + .../src/app/services/policy/policy.service.ts | 110 + .../app/services/ui/confirm-dialog.service.spec.ts | 32 + .../src/app/services/ui/confirm-dialog.service.ts | 55 + .../src/app/services/ui/error-dialog.service.ts | 52 + .../app/services/ui/notification.service.spec.ts | 32 + .../src/app/services/ui/notification.service.ts | 58 + .../src/app/services/ui/ui.service.spec.ts | 34 + webapp-frontend/src/app/services/ui/ui.service.ts | 32 + .../confirm-dialog/confirm-dialog.component.html | 29 + .../confirm-dialog.component.spec.ts | 45 + .../ui/confirm-dialog/confirm-dialog.component.ts | 39 + .../ui/error-dialog/error-dialog.component.html | 27 + .../ui/error-dialog/error-dialog.component.scss | 24 + .../app/ui/error-dialog/error-dialog.component.ts | 41 + .../app/ui/policy-card/policy-card.component.html | 31 + .../app/ui/policy-card/policy-card.component.scss | 58 + .../ui/policy-card/policy-card.component.spec.ts | 44 + .../app/ui/policy-card/policy-card.component.ts | 46 + webapp-frontend/src/assets/ORANlogo.png | Bin 0 -> 61444 bytes webapp-frontend/src/assets/at_t.png | Bin 0 -> 5778 bytes webapp-frontend/src/assets/intelligence.png | Bin 0 -> 278486 bytes webapp-frontend/src/assets/latency.png | Bin 0 -> 13966 bytes webapp-frontend/src/assets/mockdata/config.json | 872 ++ webapp-frontend/src/assets/mockdata/db.json | 36 + webapp-frontend/src/assets/mockdata/routes.json | 4 + webapp-frontend/src/assets/oran-logo.png | Bin 0 -> 43935 bytes webapp-frontend/src/assets/policy.png | Bin 0 -> 70259 bytes webapp-frontend/src/assets/profile_default.png | Bin 0 -> 6214 bytes webapp-frontend/src/assets/xAppControl.png | Bin 0 -> 46015 bytes .../src/environments/environment.prod.ts | 22 + webapp-frontend/src/environments/environment.ts | 35 + webapp-frontend/src/favicon.ico | Bin 0 -> 15086 bytes webapp-frontend/src/index.html | 33 + webapp-frontend/src/karma.conf.js | 50 + webapp-frontend/src/main.ts | 32 + webapp-frontend/src/polyfills.ts | 104 + webapp-frontend/src/styles.scss | 45 + webapp-frontend/src/styles/dark-theme.scss | 37 + webapp-frontend/src/test.ts | 39 + webapp-frontend/src/tsconfig.app.json | 11 + webapp-frontend/src/tsconfig.spec.json | 18 + webapp-frontend/src/tslint.json | 17 + webapp-frontend/tsconfig.json | 23 + webapp-frontend/tslint.json | 131 + 160 files changed, 26386 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSES.txt create mode 100644 README.md create mode 100644 pom.xml create mode 100644 tox.ini create mode 100644 webapp-backend/.gitignore create mode 100644 webapp-backend/README.md create mode 100644 webapp-backend/config/.gitignore create mode 100644 webapp-backend/config/key.properties.template create mode 100644 webapp-backend/config/portal.properties.template create mode 100644 webapp-backend/eclipse-formatter.xml create mode 100644 webapp-backend/pom.xml create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApiConfiguration.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SpringContextCache.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/CustomResponseEntityExceptionHandler.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/Html5PathsController.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/SimpleErrorController.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/k8sapi/SimpleKubernetesClient.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/EcompUserDetails.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstances.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyType.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyTypes.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApi.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/IPortalSdkDecryptor.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManager.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorAes.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorPkc.java create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/HttpsURLConnectionUtils.java create mode 100644 webapp-backend/src/main/resources/ESAPI.properties create mode 100644 webapp-backend/src/main/resources/application.properties create mode 100644 webapp-backend/src/main/resources/key.properties create mode 100644 webapp-backend/src/main/resources/logback.xml create mode 100644 webapp-backend/src/main/resources/portal.properties create mode 100644 webapp-backend/src/main/resources/static/error.html create mode 100644 webapp-backend/src/main/resources/validation.properties create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PolicyControllerMockConfiguration.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApIMockConfiguration.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/AbstractControllerTest.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/DefaultContextTest.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java create mode 100644 webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java create mode 100644 webapp-backend/src/test/resources/caas-ingress-ricaux-pods.json create mode 100644 webapp-backend/src/test/resources/caas-ingress-ricplt-pods.json create mode 100644 webapp-backend/src/test/resources/demo-policy-schema-1.json create mode 100644 webapp-backend/src/test/resources/demo-policy-schema-2.json create mode 100644 webapp-backend/src/test/resources/demo-policy-schema-3.json create mode 100644 webapp-backend/src/test/resources/key.properties create mode 100644 webapp-backend/src/test/resources/portal.properties create mode 100644 webapp-frontend/.gitignore create mode 100644 webapp-frontend/README.md create mode 100644 webapp-frontend/angular.json create mode 100644 webapp-frontend/browserslist create mode 100644 webapp-frontend/e2e/protractor.conf.js create mode 100644 webapp-frontend/e2e/src/app.e2e-spec.ts create mode 100644 webapp-frontend/e2e/src/app.po.ts create mode 100644 webapp-frontend/e2e/tsconfig.e2e.json create mode 100644 webapp-frontend/ng create mode 100644 webapp-frontend/npm create mode 100644 webapp-frontend/package-lock.json create mode 100644 webapp-frontend/package.json create mode 100644 webapp-frontend/pom.xml create mode 100644 webapp-frontend/proxy.conf.json create mode 100644 webapp-frontend/src/app/controlpanel-routing.module.ts create mode 100644 webapp-frontend/src/app/controlpanel.component.html create mode 100644 webapp-frontend/src/app/controlpanel.component.scss create mode 100644 webapp-frontend/src/app/controlpanel.component.spec.ts create mode 100644 webapp-frontend/src/app/controlpanel.component.ts create mode 100644 webapp-frontend/src/app/controlpanel.module.ts create mode 100644 webapp-frontend/src/app/footer/footer.component.html create mode 100644 webapp-frontend/src/app/footer/footer.component.scss create mode 100644 webapp-frontend/src/app/footer/footer.component.spec.ts create mode 100644 webapp-frontend/src/app/footer/footer.component.ts create mode 100644 webapp-frontend/src/app/interfaces/controlpanel.types.ts create mode 100644 webapp-frontend/src/app/interfaces/policy.types.ts create mode 100644 webapp-frontend/src/app/main/main.component.html create mode 100644 webapp-frontend/src/app/main/main.component.scss create mode 100644 webapp-frontend/src/app/main/main.component.spec.ts create mode 100644 webapp-frontend/src/app/main/main.component.ts create mode 100644 webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.html create mode 100644 webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.scss create mode 100644 webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-control.component.html create mode 100644 webapp-frontend/src/app/policy-control/policy-control.component.scss create mode 100644 webapp-frontend/src/app/policy-control/policy-control.component.spec.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-control.component.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-instance-dialog.component.html create mode 100644 webapp-frontend/src/app/policy-control/policy-instance-dialog.component.scss create mode 100644 webapp-frontend/src/app/policy-control/policy-instance-dialog.component.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-instance.component.html create mode 100644 webapp-frontend/src/app/policy-control/policy-instance.component.scss create mode 100644 webapp-frontend/src/app/policy-control/policy-instance.component.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-instance.datasource.ts create mode 100644 webapp-frontend/src/app/policy-control/policy-type.datasource.ts create mode 100644 webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.spec.ts create mode 100644 webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts create mode 100644 webapp-frontend/src/app/services/controlpanel/controlpanel.service.spec.ts create mode 100644 webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts create mode 100644 webapp-frontend/src/app/services/policy/policy.service.spec.ts create mode 100644 webapp-frontend/src/app/services/policy/policy.service.ts create mode 100644 webapp-frontend/src/app/services/ui/confirm-dialog.service.spec.ts create mode 100644 webapp-frontend/src/app/services/ui/confirm-dialog.service.ts create mode 100644 webapp-frontend/src/app/services/ui/error-dialog.service.ts create mode 100644 webapp-frontend/src/app/services/ui/notification.service.spec.ts create mode 100644 webapp-frontend/src/app/services/ui/notification.service.ts create mode 100644 webapp-frontend/src/app/services/ui/ui.service.spec.ts create mode 100644 webapp-frontend/src/app/services/ui/ui.service.ts create mode 100644 webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.html create mode 100644 webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.spec.ts create mode 100644 webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.ts create mode 100644 webapp-frontend/src/app/ui/error-dialog/error-dialog.component.html create mode 100644 webapp-frontend/src/app/ui/error-dialog/error-dialog.component.scss create mode 100644 webapp-frontend/src/app/ui/error-dialog/error-dialog.component.ts create mode 100644 webapp-frontend/src/app/ui/policy-card/policy-card.component.html create mode 100644 webapp-frontend/src/app/ui/policy-card/policy-card.component.scss create mode 100644 webapp-frontend/src/app/ui/policy-card/policy-card.component.spec.ts create mode 100644 webapp-frontend/src/app/ui/policy-card/policy-card.component.ts create mode 100644 webapp-frontend/src/assets/ORANlogo.png create mode 100644 webapp-frontend/src/assets/at_t.png create mode 100644 webapp-frontend/src/assets/intelligence.png create mode 100644 webapp-frontend/src/assets/latency.png create mode 100644 webapp-frontend/src/assets/mockdata/config.json create mode 100644 webapp-frontend/src/assets/mockdata/db.json create mode 100644 webapp-frontend/src/assets/mockdata/routes.json create mode 100644 webapp-frontend/src/assets/oran-logo.png create mode 100644 webapp-frontend/src/assets/policy.png create mode 100644 webapp-frontend/src/assets/profile_default.png create mode 100644 webapp-frontend/src/assets/xAppControl.png create mode 100644 webapp-frontend/src/environments/environment.prod.ts create mode 100644 webapp-frontend/src/environments/environment.ts create mode 100644 webapp-frontend/src/favicon.ico create mode 100644 webapp-frontend/src/index.html create mode 100644 webapp-frontend/src/karma.conf.js create mode 100644 webapp-frontend/src/main.ts create mode 100644 webapp-frontend/src/polyfills.ts create mode 100644 webapp-frontend/src/styles.scss create mode 100644 webapp-frontend/src/styles/dark-theme.scss create mode 100644 webapp-frontend/src/test.ts create mode 100644 webapp-frontend/src/tsconfig.app.json create mode 100644 webapp-frontend/src/tsconfig.spec.json create mode 100644 webapp-frontend/src/tslint.json create mode 100644 webapp-frontend/tsconfig.json create mode 100644 webapp-frontend/tslint.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1fe9c87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +/logs + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node +/node_modules + +/.classpath +/.project +/.settings +target +/.mvn/wrapper/maven-wrapper.jar +/.tox + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### visual studio ### +.vs +**/.vscode + +# OSx cruft +**/.DS_Store + +# documentation +.tox +docs/_build/* diff --git a/LICENSES.txt b/LICENSES.txt new file mode 100644 index 0000000..4ec6357 --- /dev/null +++ b/LICENSES.txt @@ -0,0 +1,30 @@ +LICENSES.txt + +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the "Software License"); +you may not use this software except in compliance with the Software +License. You may obtain a copy of the Software License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the Software License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the Software License for the specific language governing permissions +and limitations under the Software License. + + + +Unless otherwise specified, all documentation contained herein is licensed +under the Creative Commons License, Attribution 4.0 Intl. (the +"Documentation License"); you may not use this documentation except in +compliance with the Documentation License. You may obtain a copy of the +Documentation License at + +https://creativecommons.org/licenses/by/4.0/ + +Unless required by applicable law or agreed to in writing, documentation +distributed under the Documentation License is distributed on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the Documentation License for the specific language governing +permissions and limitations under the Documentation License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0317f18 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# O-RAN-SC NonRT RIC Controlpanel Web Application + +The O-RAN NonRT RIC Controlpanel provides administrative and operator functions for a NearRT RIC through the A1 API. +This web app consists of an Angular (version 8) front end +and a Java (version 11) Spring-Boot (version 2.1) back end. + +Please see the documentation in the docs/ folder. + +The backend server publishes live API documentation at the +URL `http://your-host-name-here:8080/swagger-ui.html` + +## License + +Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. +Modifications Copyright (C) 2019 Nordix Foundation +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1e9828a --- /dev/null +++ b/pom.xml @@ -0,0 +1,122 @@ + + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.2.5.RELEASE + + + org.o-ran-sc.portal.nonrtric.controlpanel + nonrtric-controlpanel-parent + NonRT RIC Controlpanel project + pom + 1.0.0-SNAPSHOT + + 11 + + AT&T Intellectual Property + O-RAN-SC + 2019 + apache_v2 + ========================LICENSE_START================================= + ========================LICENSE_END=================================== + + + webapp-frontend + webapp-backend + + + + + org.codehaus.mojo + license-maven-plugin + + ${lmp.organization.name} + ${lmp.inception.year} + ${lmp.project.name} + ${lmp.license.name} + ${lmp.process.start.tag} + ${lmp.process.end.tag} + false + + + + first + + update-file-header + + process-sources + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.6.0.1398 + + + + + + org.codehaus.mojo + license-maven-plugin + 1.20 + + + + + diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..c86cfdf --- /dev/null +++ b/tox.ini @@ -0,0 +1,30 @@ +# documentation only +[tox] +minversion = 2.0 +envlist = + docs, + docs-linkcheck, +skipsdist = true + +[testenv:docs] +basepython = python3 +deps = + sphinx + sphinx-rtd-theme + sphinxcontrib-httpdomain + recommonmark + lfdocs-conf + +commands = + sphinx-build -W -b html -n -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/html + echo "Generated docs available in {toxinidir}/docs/_build/html" +whitelist_externals = echo + +[testenv:docs-linkcheck] +basepython = python3 +deps = sphinx + sphinx-rtd-theme + sphinxcontrib-httpdomain + recommonmark + lfdocs-conf +commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck diff --git a/webapp-backend/.gitignore b/webapp-backend/.gitignore new file mode 100644 index 0000000..f4a6f7b --- /dev/null +++ b/webapp-backend/.gitignore @@ -0,0 +1,34 @@ +/.classpath +/.project +/.settings +/target/ +/logs/ +/.mvn/wrapper/maven-wrapper.jar +bin/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +/application-tlab2.properties +/application.properties +/controlpanel-users.json diff --git a/webapp-backend/README.md b/webapp-backend/README.md new file mode 100644 index 0000000..9a06c6c --- /dev/null +++ b/webapp-backend/README.md @@ -0,0 +1,26 @@ +# NonRT RIC Controlpanel Web Application Backend + +The NonRT RIC Controlpanel back-end provides REST services to the Controlpanel +front-end Typescript features running in the user's browser. For +production use, it also serves the Angular application files. + +Please see the documentation in the docs/ folder. + +The backend server publishes live API documentation at the +URL `http://your-host-name-here:8080/swagger-ui.html` + +## License + +Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. +Modifications Copyright (C) 2019 Nordix Foundation +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/webapp-backend/config/.gitignore b/webapp-backend/config/.gitignore new file mode 100644 index 0000000..edd66f1 --- /dev/null +++ b/webapp-backend/config/.gitignore @@ -0,0 +1,2 @@ +/key.properties +/portal.properties diff --git a/webapp-backend/config/key.properties.template b/webapp-backend/config/key.properties.template new file mode 100644 index 0000000..79c63d0 --- /dev/null +++ b/webapp-backend/config/key.properties.template @@ -0,0 +1,21 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Template for the file that provides a secret key for the NonRT RIC Controlpanel. + +cipher.enc.key = diff --git a/webapp-backend/config/portal.properties.template b/webapp-backend/config/portal.properties.template new file mode 100644 index 0000000..f0d6eca --- /dev/null +++ b/webapp-backend/config/portal.properties.template @@ -0,0 +1,34 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Template for the file that provides properties for the EPSDK-FW library. +# This file must be present on the Java classpath. + +# The following properties are the same in every deployment + +portal.api.impl.class = org.oransc.portal.nonrtric.controlpanel.portalapi.PortalRestCentralServiceImpl +role_access_centralized = remote + +# The following properties are DIFFERENT in every deployment + +# URL of portal login screen +ecomp_redirect_url = http://localhost/portal +# URL of portal API +ecomp_rest_url = http://localhost/portal +# Value assigned by portal instance +ueb_app_key = abcdef1234567890 diff --git a/webapp-backend/eclipse-formatter.xml b/webapp-backend/eclipse-formatter.xml new file mode 100644 index 0000000..7339434 --- /dev/null +++ b/webapp-backend/eclipse-formatter.xml @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp-backend/pom.xml b/webapp-backend/pom.xml new file mode 100644 index 0000000..96ebb1d --- /dev/null +++ b/webapp-backend/pom.xml @@ -0,0 +1,348 @@ + + + + 4.0.0 + + org.o-ran-sc.portal.nonrtric.controlpanel + nonrtric-controlpanel-parent + 1.0.0-SNAPSHOT + + nonrtric-controlpanel-be + NonRT RIC Controlpanel Webapp backend + + 2.9.2 + 2.7.1 + 1.7.9 + 2.8.1 + 1.18.0 + + 0 + + + + onap-releases + ONAP - Release Repository + https://nexus.onap.org/content/repositories/releases + + + + + + org.onap.portal.sdk + epsdk-fw + 2.6.0 + + + commons-logging + commons-logging + + + log4j + log4j + + + log4j + apache-log4j-extras + + + org.slf4j + slf4j-log4j12 + + + junit + junit + + + commons-fileupload + commons-fileupload + + + commons-beanutils + commons-beanutils + + + + org.powermock + powermock-module-junit4 + + + + org.powermock + powermock-api-mockito + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.slf4j + slf4j-api + + + org.apache.axis2 + axis2-kernel + ${apache-axis2.version} + + + + org.slf4j + jcl-over-slf4j + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.springfox + springfox-swagger-ui + ${springfox.version} + + + org.immutables + value + ${immutable.version} + provided + + + org.immutables + gson + ${immutable.version} + + + + + org.mockito + mockito-core + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.platform + junit-platform-launcher + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + net.revelc.code.formatter + formatter-maven-plugin + ${formatter-maven-plugin.version} + + ${project.basedir}/eclipse-formatter.xml + + + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless-maven-plugin.version} + + + + + com,java,javax,org + + + + + + + + org.codehaus.mojo + license-maven-plugin + + + src + + + **/*.json + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + + + ${project.version}-b${build.number} + + + + + + maven-resources-plugin + + + copy-resources + validate + + copy-resources + + + ${project.build.directory}/classes/resources/ + + + ${project.parent.basedir}/webapp-frontend/dist/controlpanelApp/ + + + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + org.jacoco + jacoco-maven-plugin + 0.8.4 + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + + + + io.fabric8 + docker-maven-plugin + 0.30.0 + + true + + ${env.CONTAINER_PULL_REGISTRY} + ${env.CONTAINER_PUSH_REGISTRY} + + + + + o-ran-sc/nonrtric-controlpanel:${project.version} + + openjdk:11-jre-slim + + + ${project.version} + + + artifact + + + + mkdir /logs + chmod -R 777 /logs + + + + + java + -Xms128m + -Xmx256m + -cp + maven:maven/${project.artifactId}-${project.version}.${project.packaging} + -Dloader.main=org.oransc.portal.nonrtric.controlpanel.ControlpanelApplication + -Djava.security.egd=file:/dev/./urandom + org.springframework.boot.loader.PropertiesLauncher + + + + + + + + + + + build + push + + + + + + + diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java new file mode 100644 index 0000000..76bb8bc --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java @@ -0,0 +1,60 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.portal.nonrtric.controlpanel; + +import java.lang.invoke.MethodHandles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +// Limit scan to controlpanel classes; exclude generated API classes +@ComponentScan("org.oransc.portal.nonrtric.controlpanel") +public class ControlpanelApplication { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public static void main(String[] args) { + SpringApplication.run(ControlpanelApplication.class); + // Ensure this appears on the console by using level WARN + logger.warn("main: version '{}' successful start", + getImplementationVersion(MethodHandles.lookup().lookupClass())); + } + + /** + * Gets version details for the specified class. + * + * @param clazz + * Class to get the version + * + * @return the value of the MANIFEST.MF property Implementation-Version as + * written by maven when packaged in a jar; 'unknown' otherwise. + */ + public static String getImplementationVersion(Class clazz) { + String classPath = clazz.getResource(clazz.getSimpleName() + ".class").toString(); + return classPath.startsWith("jar") ? clazz.getPackage().getImplementationVersion() : "unknown-not-jar"; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java new file mode 100644 index 0000000..913f803 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java @@ -0,0 +1,45 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel; + +public abstract class ControlpanelConstants { + + private ControlpanelConstants() { + // Sonar insists on hiding the constructor + } + + public static final String ENDPOINT_PREFIX = "/api"; + // Factor out method names used in multiple controllers + public static final String VERSION_METHOD = "version"; + public static final String APP_NAME_AC = "AC"; + public static final String APP_NAME_MC = "MC"; + // The role names are defined by ONAP Portal. + // The prefix "ROLE_" is required by Spring. + // These are used in Java code annotations that require constants. + public static final String ROLE_NAME_STANDARD = "Standard_User"; + public static final String ROLE_NAME_ADMIN = "System_Administrator"; + private static final String ROLE_PREFIX = "ROLE_"; + public static final String ROLE_ADMIN = ROLE_PREFIX + ROLE_NAME_ADMIN; + public static final String ROLE_STANDARD = ROLE_PREFIX + ROLE_NAME_STANDARD; + public static final String POLICY_CONTROLLER_USERNAME = "admin"; + public static final String POLICY_CONTROLLER_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"; + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java new file mode 100644 index 0000000..663526b --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java @@ -0,0 +1,183 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.File; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; +import org.onap.portalsdk.core.restful.domain.EcompRole; +import org.onap.portalsdk.core.restful.domain.EcompUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides simple user-management services. + * + * This first implementation serializes user details to a file. + */ +public class ControlpanelUserManager { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // This default value is only useful for development and testing. + public static final String USER_FILE_PATH = "controlpanel-users.json"; + + private final File userFile; + private final List users; + + /** + * Development/test-only constructor that uses default file path. + * + * @param clear + * If true, start empty and remove any existing file. + * + * @throws IOException + * On file error + */ + public ControlpanelUserManager(boolean clear) throws IOException { + this(USER_FILE_PATH); + if (clear) { + logger.debug("ctor: removing file {}", userFile.getAbsolutePath()); + File f = new File(ControlpanelUserManager.USER_FILE_PATH); + if (f.exists()) + Files.delete(f.toPath()); + users.clear(); + } + } + + /** + * Constructur that accepts a file path + * + * @param userFilePath + * File path + * @throws IOException + * If file cannot be read + */ + public ControlpanelUserManager(final String userFilePath) throws IOException { + logger.debug("ctor: userfile {}", userFilePath); + if (userFilePath == null) + throw new IllegalArgumentException("Missing or empty user file property"); + userFile = new File(userFilePath); + logger.debug("ctor: managing users in file {}", userFile.getAbsolutePath()); + if (userFile.exists()) { + final ObjectMapper mapper = new ObjectMapper(); + users = mapper.readValue(userFile, new TypeReference>() {}); + } else { + users = new ArrayList<>(); + } + } + + /** + * Gets the current users. + * + * @return List of EcompUser objects, possibly empty + */ + public List getUsers() { + return this.users; + } + + /** + * Gets the user with the specified login Id + * + * @param loginId + * Desired login Id + * @return User object; null if Id is not known + */ + public EcompUser getUser(String loginId) { + for (EcompUser u : this.users) { + if (u.getLoginId().equals(loginId)) { + logger.debug("getUser: match on {}", loginId); + return u; + } + } + logger.debug("getUser: no match on {}", loginId); + return null; + } + + private void saveUsers() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.writeValue(userFile, users); + } + + /* + * Allow at most one thread to create a user at one time. + */ + public synchronized void createUser(EcompUser user) throws PortalAPIException { + if (logger.isDebugEnabled()) { + logger.debug("createUser: loginId is {}", user.getLoginId()); + } + if (users.contains(user)) + throw new PortalAPIException("User exists: " + user.getLoginId()); + users.add(user); + try { + saveUsers(); + } catch (Exception ex) { + throw new PortalAPIException("Save failed", ex); + } + } + + /* + * Allow at most one thread to modify a user at one time. We still have + * last-edit-wins of course. + */ + public synchronized void updateUser(String loginId, EcompUser user) throws PortalAPIException { + logger.debug("editUser: loginId is {}", loginId); + int index = users.indexOf(user); + if (index < 0) + throw new PortalAPIException("User does not exist: " + user.getLoginId()); + users.remove(index); + users.add(user); + try { + saveUsers(); + } catch (Exception ex) { + throw new PortalAPIException("Save failed", ex); + } + } + + // Test infrastructure + public static void main(String[] args) throws Exception { + ControlpanelUserManager dum = new ControlpanelUserManager(false); + EcompUser user = new EcompUser(); + user.setActive(true); + user.setLoginId("demo"); + user.setFirstName("First"); + user.setLastName("Last"); + EcompRole role = new EcompRole(); + role.setId(1L); + role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + Set roles = new HashSet<>(); + roles.add(role); + user.setRoles(roles); + dum.createUser(user); + logger.debug("Created user {}", user); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java new file mode 100644 index 0000000..224d0a9 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +/** + * Creates an instance of the user manager. + */ +@Configuration +@Profile("!test") +public class AdminConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Populated by the autowired constructor + private final String userfile; + + @Autowired + public AdminConfiguration(@Value("${userfile}") final String userfile) { + logger.debug("ctor userfile '{}'", userfile); + this.userfile = userfile; + } + + @Bean + // The bean (method) name must be globally unique + public ControlpanelUserManager userManager() throws IOException { + return new ControlpanelUserManager(userfile); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApiConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApiConfiguration.java new file mode 100644 index 0000000..615d705 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApiConfiguration.java @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import java.lang.invoke.MethodHandles; + +import org.onap.portalsdk.core.onboarding.crossapi.PortalRestAPIProxy; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("!test") +public class PortalApiConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + /** + * Instantiates the EPSDK-FW servlet that implements the API called by Portal. + * Needed because this app is not configured to scan the EPSDK-FW packages; + * there's also a chance that Spring-Boot does not automatically + * process @WebServlet annotations. + * + * @return Servlet registration bean for the Portal Rest API proxy servlet. + */ + @Bean + public ServletRegistrationBean portalApiProxyServletBean() { + logger.debug("portalApiProxyServletBean"); + PortalRestAPIProxy servlet = new PortalRestAPIProxy(); + final ServletRegistrationBean servletBean = + new ServletRegistrationBean<>(servlet, PortalApiConstants.API_PREFIX + "/*"); + servletBean.setName("PortalRestApiProxyServlet"); + return servletBean; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SpringContextCache.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SpringContextCache.java new file mode 100644 index 0000000..5ceab55 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SpringContextCache.java @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Allows non-Spring-managed classes to obtain the Spring application context. + */ +@Component +public class SpringContextCache implements ApplicationContextAware { + + private ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(final ApplicationContext appContext) { + applicationContext = appContext; + } + + public ApplicationContext getApplicationContext() { + return applicationContext; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java new file mode 100644 index 0000000..7e7cd94 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java @@ -0,0 +1,69 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.portal.nonrtric.controlpanel.config; + +import org.oransc.portal.nonrtric.controlpanel.ControlpanelApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + + /** + * @return new Docket + */ + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2).select() // + .apis(RequestHandlerSelectors.basePackage(ControlpanelApplication.class.getPackage().getName())) // + .paths(PathSelectors.any()) // + .build() // + .apiInfo(apiInfo()); + } + + private ApiInfo apiInfo() { + final String version = ControlpanelApplication.class.getPackage().getImplementationVersion(); + return new ApiInfoBuilder() // + .title("NonRT RIC Controlpanel backend") // + .description("Proxies access to NearRT RIC.")// + .termsOfServiceUrl("Terms of service") // + .contact(new Contact("NonRT RIC Controlpanel Dev Team", // + "http://no-docs-yet.org/", // + "noreply@O-RAN-SC.org")) // + .license("Apache 2.0 License").licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") // + .version(version == null ? "version not available" : version) // + .build(); + } +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java new file mode 100644 index 0000000..4b65958 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java @@ -0,0 +1,124 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.InvocationTargetException; + +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.controller.PolicyController; +import org.oransc.portal.nonrtric.controlpanel.controller.SimpleErrorController; +import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthManager; +import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthenticationFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled = true) +@Profile("!test") +public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Although constructor arguments are recommended over field injection, + // this results in fewer lines of code. + @Value("${portalapi.security}") + private Boolean portalapiSecurity; + @Value("${portalapi.appname}") + private String appName; + @Value("${portalapi.username}") + private String userName; + @Value("${portalapi.password}") + private String password; + @Value("${portalapi.decryptor}") + private String decryptor; + @Value("${portalapi.usercookie}") + private String userCookie; + + @Autowired + ControlpanelUserManager userManager; + + @Override + protected void configure(HttpSecurity http) throws Exception { + logger.debug("configure: portalapi.username {}", userName); + // A chain of ".and()" always baffles me + http.authorizeRequests().anyRequest().authenticated(); + http.headers().frameOptions().disable(); + http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); + http.addFilterBefore(portalAuthenticationFilterBean(), BasicAuthenticationFilter.class); + } + + /** + * Resource paths that do not require authentication, especially including + * Swagger-generated documentation. + */ + @SuppressWarnings("squid:S1075") // URIs should not be hardcoded + protected static final String[] OPEN_PATHS = { // + "/v2/api-docs", // + "/swagger-resources/**", // + "/swagger-ui.html", // + "/webjars/**", // + PortalApiConstants.API_PREFIX + "/**", // + PolicyController.CONTROLLER_PATH + "/" + PolicyController.VERSION_METHOD, // + SimpleErrorController.ERROR_PATH}; + + @Override + public void configure(WebSecurity web) throws Exception { + // This disables Spring security, but not the app's filter. + web.ignoring().antMatchers(OPEN_PATHS); + } + + @Bean + public PortalAuthManager portalAuthManagerBean() throws ClassNotFoundException, InstantiationException, + IllegalAccessException, InvocationTargetException, NoSuchMethodException { + return new PortalAuthManager(appName, userName, password, decryptor, userCookie); + } + + /* + * If this is annotated with @Bean, it is created automatically AND REGISTERED, + * and Spring processes annotations in the source of the class. However, the + * filter is added in the chain apparently in the wrong order. Alternately, with + * no @Bean and added to the chain up in the configure() method in the desired + * order, the ignoring() matcher pattern configured above causes Spring to + * bypass this filter, which seems to me means the filter participates + * correctly. + */ + public PortalAuthenticationFilter portalAuthenticationFilterBean() throws ClassNotFoundException, + InstantiationException, IllegalAccessException, IOException, InvocationTargetException, NoSuchMethodException { + return new PortalAuthenticationFilter(portalapiSecurity, portalAuthManagerBean(), this.userManager); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/CustomResponseEntityExceptionHandler.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/CustomResponseEntityExceptionHandler.java new file mode 100644 index 0000000..a515cfd --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/CustomResponseEntityExceptionHandler.java @@ -0,0 +1,83 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.lang.invoke.MethodHandles; +import org.oransc.portal.nonrtric.controlpanel.model.ErrorTransport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientResponseException; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +/** + * Catches certain exceptions. This controller advice factors out try-catch + * blocks in many controller methods. + * + * Also see:
+ * https://www.baeldung.com/exception-handling-for-rest-with-spring + * https://www.springboottutorial.com/spring-boot-exception-handling-for-rest-services + */ +@ControllerAdvice +public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { + + // Superclass has "logger" that is exposed here, so use a different name + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + /** + * Logs the error and generates a JSON response when a REST controller method + * takes a RestClientResponseException. This is thrown by the Http client when a + * remote method returns a non-2xx code. All the controller methods are proxies + * in that they just forward the request along to a remote system, so if that + * remote system fails, return 502 plus some details about the failure, rather + * than the generic 500 that Spring-Boot will return on an uncaught exception. + * + * Why 502? I quote:
HTTP server received an invalid response from a + * server it consulted when acting as a proxy or gateway.
+ * + * @param ex + * The exception + * + * @param request + * The original request + * + * @return A response entity with status code 502 plus some details in the body. + */ + @ExceptionHandler({RestClientResponseException.class}) + public final ResponseEntity handleProxyMethodException(Exception ex, WebRequest request) { + // Capture the full stack trace in the log. + log.error("handleProxyMethodException: request {}, exception {}", request.getDescription(false), + ex.getMessage()); + if (ex instanceof HttpStatusCodeException) { + HttpStatusCodeException hsce = (HttpStatusCodeException) ex; + return new ResponseEntity<>(new ErrorTransport(hsce.getRawStatusCode(), hsce.getResponseBodyAsString(), + ex.toString(), request.getDescription(false)), HttpStatus.BAD_GATEWAY); + } else { + return new ResponseEntity<>(new ErrorTransport(500, ex), HttpStatus.BAD_GATEWAY); + } + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/Html5PathsController.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/Html5PathsController.java new file mode 100644 index 0000000..1ed6d0a --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/Html5PathsController.java @@ -0,0 +1,67 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.net.URL; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Listens for requests to known Angular routes. + */ +@Controller +public class Html5PathsController { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + /** + * Forwards the browser to the index (main) page upon request of a known route. + * This unfortunately requires duplication of the Angular route strings in the + * path mappings on this method. Could switch to a regex pattern instead someday + * if the routes change too often. + * + * https://stackoverflow.com/questions/44692781/configure-spring-boot-to-redirect-404-to-a-single-page-app + * + * @param request + * HttpServletRequest + * @param response + * HttpServletResponse + * @throws IOException + * On error + */ + @GetMapping("/policy") + public void forwardAngularRoutes(HttpServletRequest request, HttpServletResponse response) throws IOException { + URL url = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), "/index.html"); + if (logger.isDebugEnabled()) + logger.debug("forwardAngularRoutes: {} redirected to {}", request.getRequestURI(), url); + response.sendRedirect(url.toString()); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java new file mode 100644 index 0000000..3d08135 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java @@ -0,0 +1,139 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import io.swagger.annotations.ApiOperation; + +import java.lang.invoke.MethodHandles; + +import javax.servlet.http.HttpServletResponse; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * Proxies calls from the front end to the Policy agent API. + * + * If a method throws RestClientResponseException, it is handled by + * {@link CustomResponseEntityExceptionHandler#handleProxyMethodException(Exception, org.springframework.web.context.request.WebRequest)} + * which returns status 502. All other exceptions are handled by Spring which + * returns status 500. + */ +@RestController +@RequestMapping(value = PolicyController.CONTROLLER_PATH, produces = MediaType.APPLICATION_JSON_VALUE) +public class PolicyController { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Publish paths in constants so tests are easy to write + public static final String CONTROLLER_PATH = ControlpanelConstants.ENDPOINT_PREFIX + "/policy"; + // Endpoints + public static final String VERSION_METHOD = ControlpanelConstants.VERSION_METHOD; + public static final String POLICY_TYPES_METHOD = "policytypes"; + public static final String POLICY_TYPE_ID_NAME = "policy_type_id"; + public static final String POLICIES_NAME = "policies"; + public static final String POLICY_INSTANCE_ID_NAME = "policy_instance_id"; + + // Populated by the autowired constructor + private final PolicyAgentApi policyAgentApi; + + @Autowired + public PolicyController(final PolicyAgentApi policyAgentApi) { + Assert.notNull(policyAgentApi, "API must not be null"); + this.policyAgentApi = policyAgentApi; + logger.debug("ctor: configured with client type {}", policyAgentApi.getClass().getName()); + } + + /* + * The fields are defined in the Policy Control Typescript interface. + */ + @ApiOperation(value = "Gets the policy types from Near Realtime-RIC") + @GetMapping(POLICY_TYPES_METHOD) + @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + public ResponseEntity getAllPolicyTypes(HttpServletResponse response) { + logger.debug("getAllPolicyTypes"); + return this.policyAgentApi.getAllPolicyTypes(); + } + + @ApiOperation(value = "Returns the policy instances for the given policy type.") + @GetMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME) + @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + public ResponseEntity getPolicyInstances(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString) { + logger.debug("getPolicyInstances {}", policyTypeIdString); + return this.policyAgentApi.getPolicyInstancesForType(policyTypeIdString); + } + + @ApiOperation(value = "Returns a policy instance of a type") + @GetMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + + "}") + @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + public ResponseEntity getPolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, + @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { + logger.debug("getPolicyInstance {}:{}", policyTypeIdString, policyInstanceId); + return this.policyAgentApi.getPolicyInstance(policyInstanceId); + } + + @ApiOperation(value = "Creates the policy instances for the given policy type.") + @PutMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + + "}") + @Secured({ControlpanelConstants.ROLE_ADMIN}) + public ResponseEntity putPolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, + @RequestParam(name = "ric", required = true) String ric, + @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId, @RequestBody String instance) { + logger.debug("putPolicyInstance ric: {}, typeId: {}, instanceId: {}, instance: {}", ric, policyTypeIdString, + policyInstanceId, instance); + return this.policyAgentApi.putPolicy(policyTypeIdString, policyInstanceId, instance, ric); + } + + @ApiOperation(value = "Deletes the policy instances for the given policy type.") + @DeleteMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + + POLICY_INSTANCE_ID_NAME + "}") + @Secured({ControlpanelConstants.ROLE_ADMIN}) + public ResponseEntity deletePolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, + @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { + logger.debug("deletePolicyInstance typeId: {}, instanceId: {}", policyTypeIdString, policyInstanceId); + return this.policyAgentApi.deletePolicy(policyInstanceId); + } + + @ApiOperation(value = "Returns the rics supporting the given policy type.") + @GetMapping("/rics") + @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + public ResponseEntity getRicsSupportingType( + @RequestParam(name = "policyType", required = true) String supportingPolicyType) { + logger.debug("getRicsSupportingType {}", supportingPolicyType); + + return this.policyAgentApi.getRicsSupportingType(supportingPolicyType); + } +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/SimpleErrorController.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/SimpleErrorController.java new file mode 100644 index 0000000..da2a900 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/SimpleErrorController.java @@ -0,0 +1,92 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.lang.invoke.MethodHandles; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.error.ErrorAttributes; +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.ServletWebRequest; +import springfox.documentation.annotations.ApiIgnore; + +/** + * Provides a controller which is invoked on any error within the Spring-managed + * context, including page not found, and redirects the caller to a custom error + * page. The caller is also redirected to this page if a REST controller takes + * an uncaught exception. + * + * If trace is requested via request parameter ("?trace=true") and available, + * adds stack trace information to the standard JSON error response. + * + * Excluded from Swagger API documentation. + * + * https://stackoverflow.com/questions/25356781/spring-boot-remove-whitelabel-error-page + * https://www.baeldung.com/spring-boot-custom-error-page + */ + +@ApiIgnore +@Controller +@RequestMapping(value = SimpleErrorController.ERROR_PATH, produces = MediaType.APPLICATION_JSON_VALUE) +public class SimpleErrorController implements ErrorController { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @SuppressWarnings("squid:S1075") //URIs should not be hardcoded + public static final String ERROR_PATH = "/error"; + + private final ErrorAttributes errorAttributes; + + @Autowired + public SimpleErrorController(ErrorAttributes errorAttributes) { + this.errorAttributes = errorAttributes; + } + + @Override + public String getErrorPath() { + logger.warn("getErrorPath"); + return ERROR_PATH; + } + + @GetMapping + public String handleError(HttpServletRequest request) { + ServletWebRequest servletWebRequest = new ServletWebRequest(request); + Throwable t = errorAttributes.getError(servletWebRequest); + if (t != null) + logger.warn("handleError", t); + Map attributes = errorAttributes.getErrorAttributes(servletWebRequest, true); + attributes.forEach((attribute, value) -> logger.warn("handleError: {} -> {}", attribute, value)); + // Return the name of the page INCLUDING suffix, which I guess is a "view" name. + // Just "error" is not enough, but don't seem to need a ModelAndView object. + return "error.html"; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/k8sapi/SimpleKubernetesClient.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/k8sapi/SimpleKubernetesClient.java new file mode 100644 index 0000000..a95265c --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/k8sapi/SimpleKubernetesClient.java @@ -0,0 +1,56 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.k8sapi; + +import java.lang.invoke.MethodHandles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; + +/** + * Provides a method to get a list of pods using RestTemplate. As currently + * configured this uses the default JVM HTTPS support which can be configured to + * ignore errors as a workaround for self-signed SSL certificates. + */ +public class SimpleKubernetesClient { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private final String k8sUrl; + + public SimpleKubernetesClient(String baseUrl) { + logger.debug("ctor: baseUrl {}", baseUrl); + k8sUrl = baseUrl; + } + + public String listPods(String namespace) { + logger.debug("listPods for namespace {}", namespace); + String podsUrl = new DefaultUriBuilderFactory(k8sUrl.trim()).builder().pathSegment("v1") + .pathSegment("namespaces").pathSegment(namespace.trim()).pathSegment("pods").build().normalize().toString(); + RestTemplate rt = new RestTemplate(); + ResponseEntity podsResponse = rt.getForEntity(podsUrl, String.class); + return podsResponse.getBody(); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/EcompUserDetails.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/EcompUserDetails.java new file mode 100644 index 0000000..91e7aa9 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/EcompUserDetails.java @@ -0,0 +1,93 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.onap.portalsdk.core.restful.domain.EcompRole; +import org.onap.portalsdk.core.restful.domain.EcompUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class EcompUserDetails implements UserDetails { + + private static final long serialVersionUID = 1L; + private final transient EcompUser ecompUser; + + // This is the default Spring role-name prefix. + private static final String ROLEP = "ROLE_"; + + public EcompUserDetails(EcompUser ecompUser) { + this.ecompUser = ecompUser; + } + + /* + * Gets a list of authorities (roles) for this user. To keep Spring happy, every + * item has prefix ROLE_. + */ + @Override + public Collection getAuthorities() { + List roleList = new ArrayList<>(); + Iterator roleIter = ecompUser.getRoles().iterator(); + while (roleIter.hasNext()) { + EcompRole role = roleIter.next(); + // Add the prefix if the ONAP portal doesn't supply it. + final String roleName = role.getName().startsWith(ROLEP) ? role.getName() : ROLEP + role.getName(); + roleList.add(new SimpleGrantedAuthority(roleName)); + } + return roleList; + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return ecompUser.getLoginId(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return ecompUser.isActive(); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java new file mode 100644 index 0000000..efe2884 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java @@ -0,0 +1,134 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.portal.nonrtric.controlpanel.model; + +import java.time.Instant; + +/** + * This mimics the model Spring-Boot uses for a message returned on failure, to + * be serialized as JSON. + */ +public class ErrorTransport implements IControlpanelResponse { + + private Instant timestamp; + private Integer status; + private String error; + private String message; + private String path; + + /** + * Builds an empty object. + */ + public ErrorTransport() { + // no-arg constructor + } + + /** + * Convenience constructor for minimal value set. + * + * @param status + * Integer value like 400 + * @param error + * Error message + */ + public ErrorTransport(int status, String error) { + this(status, error, null, null); + } + + /** + * Convenience constructor for populating an error from an exception + * + * @param status + * Integer value like 400 + * @param throwable + * The caught exception/throwable to convert to String with + * an upper bound on characters + */ + public ErrorTransport(int status, Throwable throwable) { + this.timestamp = Instant.now(); + this.status = status; + final int enough = 256; + String exString = throwable.toString(); + this.error = exString.length() > enough ? exString.substring(0, enough) : exString; + } + + /** + * Builds an object with all fields + * + * @param status + * Integer value like 500 + * @param error + * Explanation + * @param message + * Additional explanation + * @param path + * Requested path + */ + public ErrorTransport(int status, String error, String message, String path) { + this.timestamp = Instant.now(); + this.status = status; + this.error = error; + this.message = message; + this.path = path; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String error) { + this.message = error; + } + + public Instant getTimestamp() { + return timestamp; + } + + public void setTimestamp(Instant timestamp) { + this.timestamp = timestamp; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java new file mode 100644 index 0000000..3fd5575 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java @@ -0,0 +1,28 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +/** + * Marker interface used by all transport models. + */ +public interface IControlpanelResponse { + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java new file mode 100644 index 0000000..782919d --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java @@ -0,0 +1,42 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +import org.immutables.gson.Gson; +import org.immutables.value.Value; + +@Value.Immutable +@Gson.TypeAdapters +public interface PolicyInfo { + + public String id(); + + public String type(); + + public String ric(); + + public Object json(); + + public String service(); + + public String lastModified(); + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstances.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstances.java new file mode 100644 index 0000000..6bb7161 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstances.java @@ -0,0 +1,29 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +import java.util.ArrayList; + +public class PolicyInstances extends ArrayList { + + private static final long serialVersionUID = -928428052502491021L; + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyType.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyType.java new file mode 100644 index 0000000..ca2996e --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyType.java @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class PolicyType { + + @JsonProperty("name") + String name; + + @JsonProperty("schema") + Object schema; + + public PolicyType(String name, Object schema) { + this.name = name; + this.schema = schema; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Object getSchema() { + return schema; + } + + public void setSchema(Object schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "[name:" + name + ", schema:" + schema.toString() + "]"; + } +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyTypes.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyTypes.java new file mode 100644 index 0000000..c998245 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyTypes.java @@ -0,0 +1,29 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +import java.util.ArrayList; + +public class PolicyTypes extends ArrayList { + + private static final long serialVersionUID = -928428052502491021L; + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java new file mode 100644 index 0000000..83403c3 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java @@ -0,0 +1,64 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.model; + +public class SuccessTransport implements IControlpanelResponse { + + private int status; + private Object data; + + /** + * Builds an empty object + */ + public SuccessTransport() { + // no-arg constructor + } + + /** + * Builds an object with the specified values. + * + * @param status + * Status code + * @param data + * Data to transport + */ + public SuccessTransport(int status, Object data) { + this.status = status; + this.data = data; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApi.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApi.java new file mode 100644 index 0000000..ce34d86 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApi.java @@ -0,0 +1,40 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.policyagentapi; + +import org.springframework.http.ResponseEntity; + +public interface PolicyAgentApi { + + public ResponseEntity getAllPolicyTypes(); + + public ResponseEntity getPolicyInstancesForType(String type); + + public ResponseEntity getPolicyInstance(String id); + + public ResponseEntity putPolicy(String policyTypeIdString, String policyInstanceId, Object json, + String ric); + + public ResponseEntity deletePolicy(String policyInstanceId); + + public ResponseEntity getRicsSupportingType(String typeName); + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java new file mode 100644 index 0000000..86eb81e --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java @@ -0,0 +1,213 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.policyagentapi; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.immutables.gson.Gson; +import org.immutables.value.Value; +import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyType; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component("PolicyAgentApi") +public class PolicyAgentApiImpl implements PolicyAgentApi { + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + RestTemplate restTemplate; + + private static com.google.gson.Gson gson = new GsonBuilder() // + .serializeNulls() // + .create(); // + + private final String urlPrefix; + + @Autowired + public PolicyAgentApiImpl( + @org.springframework.beans.factory.annotation.Value("${policycontroller.url.prefix}") final String urlPrefix) { + this(urlPrefix, new RestTemplate()); + logger.debug("ctor prefix '{}'", urlPrefix); + } + + public PolicyAgentApiImpl(String urlPrefix, RestTemplate restTemplate) { + this.urlPrefix = urlPrefix; + this.restTemplate = restTemplate; + } + + private String baseUrl() { + return urlPrefix; + } + + @Value.Immutable + @Gson.TypeAdapters + interface PolicyTypeInfo { + + public String name(); + + public String schema(); + } + + @Override + public ResponseEntity getAllPolicyTypes() { + try { + String url = baseUrl() + "/policy_schemas"; + ResponseEntity rsp = this.restTemplate.getForEntity(url, String.class); + if (!rsp.getStatusCode().is2xxSuccessful()) { + return rsp; + } + + PolicyTypes result = new PolicyTypes(); + + JsonArray schemas = JsonParser.parseString(rsp.getBody()).getAsJsonArray(); + for (JsonElement schema : schemas) { + JsonObject schemaObj = schema.getAsJsonObject(); + String title = schemaObj.get("title").getAsString(); + String schemaAsStr = schemaObj.toString(); + PolicyType pt = new PolicyType(title, schemaAsStr); + result.add(pt); + } + return new ResponseEntity<>(gson.toJson(result), rsp.getStatusCode()); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity getPolicyInstancesForType(String type) { + String url = baseUrl() + "/policies?type={type}"; + Map uriVariables = Map.of("type", type); + ResponseEntity rsp = this.restTemplate.getForEntity(url, String.class, uriVariables); + if (!rsp.getStatusCode().is2xxSuccessful()) { + return rsp; + } + + try { + Type listType = new TypeToken>() {}.getType(); + List rspParsed = gson.fromJson(rsp.getBody(), listType); + PolicyInstances result = new PolicyInstances(); + for (PolicyInfo p : rspParsed) { + result.add(p); + } + return new ResponseEntity<>(gson.toJson(result), rsp.getStatusCode()); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity getPolicyInstance(String id) { + String url = baseUrl() + "/policy?instance={id}"; + Map uriVariables = Map.of("id", id); + + return this.restTemplate.getForEntity(url, Object.class, uriVariables); + } + + @Override + public ResponseEntity putPolicy(String policyTypeIdString, String policyInstanceId, Object json, + String ric) { + String url = baseUrl() + "/policy?type={type}&instance={instance}&ric={ric}&service={service}"; + Map uriVariables = Map.of( // + "type", policyTypeIdString, // + "instance", policyInstanceId, // + "ric", ric, // + "service", "controlpanel"); + + try { + this.restTemplate.put(url, createJsonHttpEntity(json), uriVariables); + return new ResponseEntity<>(HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity deletePolicy(String policyInstanceId) { + String url = baseUrl() + "/policy?instance={instance}"; + Map uriVariables = Map.of("instance", policyInstanceId); + try { + this.restTemplate.delete(url, uriVariables); + return new ResponseEntity<>(HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.NOT_FOUND); + } + + } + + @Value.Immutable + @Gson.TypeAdapters + interface RicInfo { + public String ricName(); + + public Collection nodeNames(); + + public Collection policyTypes(); + } + + @Override + public ResponseEntity getRicsSupportingType(String typeName) { + String url = baseUrl() + "/rics?policyType={typeName}"; + Map uriVariables = Map.of("typeName", typeName); + String rsp = this.restTemplate.getForObject(url, String.class, uriVariables); + + try { + Type listType = new TypeToken>() {}.getType(); + List rspParsed = gson.fromJson(rsp, listType); + Collection result = new ArrayList<>(rspParsed.size()); + for (RicInfo ric : rspParsed) { + result.add(ric.ricName()); + } + return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + private HttpEntity createJsonHttpEntity(Object content) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + return new HttpEntity<>(content, headers); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/IPortalSdkDecryptor.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/IPortalSdkDecryptor.java new file mode 100644 index 0000000..5a16392 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/IPortalSdkDecryptor.java @@ -0,0 +1,42 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; + +/** + * Supports an upgrade path among methods in CipherUtil because the PortalSDK is + * changing encryption methods. + */ +public interface IPortalSdkDecryptor { + + /** + * Decrypts the specified value using a known key. + * + * @param cipherText + * Encrypted value + * @return Clear text on success, null otherwise. + * @throws CipherUtilException + * if any decryption step fails + */ + String decrypt(String cipherText) throws CipherUtilException; + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManager.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManager.java new file mode 100644 index 0000000..8847d7a --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManager.java @@ -0,0 +1,120 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import java.lang.invoke.MethodHandles; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.onap.portalsdk.core.onboarding.crossapi.IPortalRestCentralService; +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides services to authenticate requests from/to ONAP Portal. + */ +public class PortalAuthManager { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + final Map credentialsMap; + private final IPortalSdkDecryptor portalSdkDecryptor; + private final String userIdCookieName; + + public PortalAuthManager(final String appName, final String username, final String password, + final String decryptorClassName, final String userCookie) throws ClassNotFoundException, InstantiationException, + IllegalAccessException, InvocationTargetException, NoSuchMethodException { + credentialsMap = new HashMap<>(); + credentialsMap.put(IPortalRestCentralService.CREDENTIALS_APP, appName); + credentialsMap.put(IPortalRestCentralService.CREDENTIALS_USER, username); + credentialsMap.put(IPortalRestCentralService.CREDENTIALS_PASS, password); + this.userIdCookieName = userCookie; + // Instantiate here so configuration errors are detected at app-start time + logger.debug("ctor: using decryptor class {}", decryptorClassName); + Class decryptorClass = Class.forName(decryptorClassName); + portalSdkDecryptor = (IPortalSdkDecryptor) decryptorClass.getDeclaredConstructor().newInstance(); + } + + /** + * @return A map of key-value pairs with application name, user name and + * password. + */ + public Map getAppCredentials() { + return credentialsMap; + } + + /** + * Searches the request for a cookie with the specified name. + * + * @param request + * HttpServletRequest + * @param cookieName + * Cookie name + * @return Cookie, or null if not found. + */ + private Cookie getCookie(HttpServletRequest request, String cookieName) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) + for (Cookie cookie : cookies) + if (cookie.getName().equals(cookieName)) + return cookie; + return null; + } + + /** + * Validates whether the ECOMP Portal sign-on process has completed. Checks for + * the ECOMP cookie first, then the user cookie. + * + * @param request + * HttpServletRequest + * @return User ID if the ECOMP cookie is present and the sign-on process + * established a user ID; else null. + */ + public String validateEcompSso(HttpServletRequest request) { + // Check ECOMP Portal cookie + Cookie ep = getCookie(request, PortalApiConstants.EP_SERVICE); + if (ep == null) { + logger.debug("validateEcompSso: cookie not found: {}", PortalApiConstants.EP_SERVICE); + return null; + } + logger.trace("validateEcompSso: found cookie {}", PortalApiConstants.EP_SERVICE); + Cookie user = getCookie(request, userIdCookieName); + if (user == null) { + logger.debug("validateEcompSso: cookie not found: {}", userIdCookieName); + return null; + } + logger.trace("validateEcompSso: user cookie {}", userIdCookieName); + String userid = null; + try { + userid = portalSdkDecryptor.decrypt(user.getValue()); + } catch (CipherUtilException e) { + throw new IllegalArgumentException("validateEcompSso failed", e); + } + return userid; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java new file mode 100644 index 0000000..3e0fea6 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java @@ -0,0 +1,281 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.lang.invoke.MethodHandles; +import java.net.URLEncoder; +import java.util.HashSet; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.onap.portalsdk.core.onboarding.util.KeyProperties; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.onap.portalsdk.core.onboarding.util.PortalApiProperties; +import org.onap.portalsdk.core.restful.domain.EcompRole; +import org.onap.portalsdk.core.restful.domain.EcompUser; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.model.EcompUserDetails; +import org.owasp.esapi.reference.DefaultSecurityConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; + +/** + * This filter checks every request for the cookie set by the ONAP Portal single + * sign on process. The possible paths and actions: + *
    + *
  1. User starts at an app page via a bookmark. No Portal cookie is set. + * Redirect there to get one; then continue as below. + *
  2. User starts at Portal and goes to app. Alternately, the user's session + * times out and the user hits refresh. The Portal cookie is set, but there is + * no valid session. Create one and publish info. + *
  3. User has valid Portal cookie and session. Reset the max idle in that + * session. + *
+ *

+ * Notes: + *

    + *
  • While redirecting, the cookie "redirectUrl" should also be set so that + * Portal knows where to forward the request to once the Portal Session is + * created and EPService cookie is set. + *
+ * + * Open question: What about sessions? Will this be stateless? + * + * This filter uses no annotations to avoid Spring's automatic registration, + * which add this filter in the chain in the wrong order. + */ +public class PortalAuthenticationFilter implements Filter { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Unfortunately not all file names are defined as constants + private static final String[] securityPropertyFiles = + {KeyProperties.PROPERTY_FILE_NAME, PortalApiProperties.PROPERTY_FILE_NAME, + DefaultSecurityConfiguration.DEFAULT_RESOURCE_FILE, "validation.properties"}; + + public static final String REDIRECT_URL_KEY = "redirectUrl"; + + private final boolean enforcePortalSecurity; + private final PortalAuthManager authManager; + + private final ControlpanelUserManager userManager; + + public PortalAuthenticationFilter(boolean portalSecurity, PortalAuthManager authManager, + ControlpanelUserManager userManager) throws IOException { + this.enforcePortalSecurity = portalSecurity; + this.authManager = authManager; + this.userManager = userManager; + if (portalSecurity) { + // Throw if security is requested and prerequisites are not met + for (String pf : securityPropertyFiles) { + InputStream in = MethodHandles.lookup().lookupClass().getClassLoader().getResourceAsStream(pf); + if (in == null) { + String msg = "Failed to find property file on classpath: " + pf; + logger.error(msg); + throw new IOException(msg); + } else { + try { + in.close(); + } catch (IOException ex) { + logger.warn("Failed to close stream", ex); + } + } + } + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // complain loudly if this key property is missing + String url = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); + logger.debug("init: Portal redirect URL {}", url); + if (url == null) + logger + .error("init: Failed to find property in portal.properties: " + PortalApiConstants.ECOMP_REDIRECT_URL); + } + + @Override + public void destroy() { + // No resources to release + } + + /** + * Requests for pages ignored in the web security config do not hit this filter. + */ + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + if (enforcePortalSecurity) + doFilterEPSDKFW(req, res, chain); + else + doFilterMockUserAdminRole(req, res, chain); + } + + /* + * Populates security context with a mock user in the admin role. + * + */ + private void doFilterMockUserAdminRole(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth == null || auth.getAuthorities().isEmpty()) { + if (logger.isDebugEnabled()) { + logger.debug("doFilter adding auth to request URI {}", + (req instanceof HttpServletRequest) ? ((HttpServletRequest) req).getRequestURL() : req); + } + EcompRole admin = new EcompRole(); + admin.setId(1L); + admin.setName(ControlpanelConstants.ROLE_ADMIN); + HashSet roles = new HashSet<>(); + roles.add(admin); + EcompUser user = new EcompUser(); + user.setLoginId("fakeLoginId"); + user.setRoles(roles); + user.setActive(true); + EcompUserDetails userDetails = new EcompUserDetails(user); + PreAuthenticatedAuthenticationToken authToken = + new PreAuthenticatedAuthenticationToken(userDetails, "fakeCredentials", userDetails.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authToken); + } else { + logger.debug("doFilter: authorities {}", auth.getAuthorities()); + } + chain.doFilter(req, res); + } + + /* + * Checks for valid cookies and allows request to be served if found; redirects + * to Portal otherwise. + */ + private void doFilterEPSDKFW(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + if (logger.isTraceEnabled()) + logger.trace("doFilter: req {}", request.getRequestURI()); + // Need to authenticate the request + final String userId = authManager.validateEcompSso(request); + final EcompUser ecompUser = (userId == null ? null : userManager.getUser(userId)); + if (userId == null || ecompUser == null) { + logger.debug("doFilter: unauthorized user requests URI {}, serving login page", request.getRequestURI()); + StringBuffer sb = request.getRequestURL(); + sb.append(request.getQueryString() == null ? "" : "?" + request.getQueryString()); + String body = generateLoginRedirectPage(sb.toString()); + response.setContentType(MediaType.TEXT_HTML_VALUE); + response.getWriter().print(body); + response.getWriter().flush(); + } else { + EcompUserDetails userDetails = new EcompUserDetails(ecompUser); + // Using portal session as credentials is a hack + PreAuthenticatedAuthenticationToken authToken = new PreAuthenticatedAuthenticationToken(userDetails, + getPortalSessionId(request), userDetails.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authToken); + // Pass request back down the filter chain + chain.doFilter(request, response); + } + } + + /** + * Generates a page with text only, absolutely no references to any webapp + * resources, so this can be served to an unauthenticated user without + * triggering a new authentication attempt. The page has a link to the Portal + * URL from configuration, with a return URL that is the original request. + * + * @param appUrl + * Original requested URL + * @return HTML + * @throws UnsupportedEncodingException + * On error + */ + private static String generateLoginRedirectPage(String appUrl) throws UnsupportedEncodingException { + String encodedAppUrl = URLEncoder.encode(appUrl, "UTF-8"); + String portalBaseUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); + String redirectUrl = portalBaseUrl + "?" + PortalAuthenticationFilter.REDIRECT_URL_KEY + "=" + encodedAppUrl; + String aHref = ""; + // If only Java had "here" documents. + return String.join(// + System.getProperty("line.separator"), // + "", // + "", // + "NonRT RIC Controlpanel", // + "", // + "", // + "", // + "

NonRT RIC Controlpanel

", // + "

Please log in.

", // + "

", // + aHref, "Click here to authenticate at the ONAP Portal", // + "

", // + "", // + ""); + } + + /** + * Searches the request for a cookie with the specified name. + * + * @param request + * HttpServletRequest + * @param cookieName + * Cookie name + * @return Cookie, or null if not found. + */ + private Cookie getCookie(HttpServletRequest request, String cookieName) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) + for (Cookie cookie : cookies) + if (cookie.getName().equals(cookieName)) + return cookie; + return null; + } + + /** + * Gets the ECOMP Portal service cookie value. + * + * @param request + * @return Cookie value, or null if not found. + */ + private String getPortalSessionId(HttpServletRequest request) { + Cookie ep = getCookie(request, PortalApiConstants.EP_SERVICE); + if (ep == null) + return null; + return ep.getValue(); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java new file mode 100644 index 0000000..ea97b1c --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java @@ -0,0 +1,93 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.onap.portalsdk.core.onboarding.crossapi.IPortalRestCentralService; +import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; +import org.onap.portalsdk.core.restful.domain.EcompUser; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.config.SpringContextCache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +/** + * Implements the contract used by the Portal to transmit user details to this + * on-boarded application. The requests are intercepted first by a servlet in + * the EPSDK-FW library, which proxies the calls to these methods. + * + * An instance of this class is created upon first request to the API. But this + * class is found and instantiated via Class.forName(), so cannot use Spring + * annotations. + */ +public class PortalRestCentralServiceImpl implements IPortalRestCentralService { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @Autowired + private SpringContextCache springContextCache; + private final PortalAuthManager authManager; + private final ControlpanelUserManager userManager; + + public PortalRestCentralServiceImpl() throws IOException, PortalAPIException { + final ApplicationContext context = springContextCache.getApplicationContext(); + authManager = context.getBean(PortalAuthManager.class); + userManager = context.getBean(ControlpanelUserManager.class); + } + + /* + * Answers the Portal API credentials. + */ + @Override + public Map getAppCredentials() throws PortalAPIException { + logger.debug("getAppCredentials"); + return authManager.getAppCredentials(); + } + + /* + * Extracts the user ID from a cookie in the header + */ + @Override + public String getUserId(HttpServletRequest request) throws PortalAPIException { + logger.debug("getuserId"); + return authManager.validateEcompSso(request); + } + + @Override + public void pushUser(EcompUser user) throws PortalAPIException { + logger.debug("pushUser: {}", user); + userManager.createUser(user); + } + + @Override + public void editUser(String loginId, EcompUser user) throws PortalAPIException { + logger.debug("editUser: {}", user); + userManager.updateUser(loginId, user); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorAes.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorAes.java new file mode 100644 index 0000000..27d1fc1 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorAes.java @@ -0,0 +1,34 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; +import org.onap.portalsdk.core.onboarding.util.CipherUtil; + +public class PortalSdkDecryptorAes implements IPortalSdkDecryptor { + + @Override + @SuppressWarnings("squid:CallToDeprecatedMethod") + public String decrypt(String cipherText) throws CipherUtilException { + return CipherUtil.decrypt(cipherText); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorPkc.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorPkc.java new file mode 100644 index 0000000..b0f8924 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalSdkDecryptorPkc.java @@ -0,0 +1,33 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; +import org.onap.portalsdk.core.onboarding.util.CipherUtil; + +public class PortalSdkDecryptorPkc implements IPortalSdkDecryptor { + + @Override + public String decrypt(String cipherText) throws CipherUtilException { + return CipherUtil.decryptPKC(cipherText); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/HttpsURLConnectionUtils.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/HttpsURLConnectionUtils.java new file mode 100644 index 0000000..5b1dcb4 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/HttpsURLConnectionUtils.java @@ -0,0 +1,69 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.portal.nonrtric.controlpanel.util; + +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; + +import org.apache.axis2.java.security.TrustAllTrustManager; + +/** + * Disables and enables certificate and host-name checking in + * HttpsURLConnection, the default JVM implementation of the HTTPS/TLS protocol. + * Has no effect on implementations such as Apache Http Client, Ok Http. + * + * https://stackoverflow.com/questions/23504819/how-to-disable-ssl-certificate-checking-with-spring-resttemplate/58291331#58291331 + */ +public final class HttpsURLConnectionUtils { + + private static final HostnameVerifier jvmHostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier(); + + private static final HostnameVerifier trivialHostnameVerifier = + (hostname, sslSession) -> hostname.equalsIgnoreCase(sslSession.getPeerHost()); + + private static final TrustManager[] UNQUESTIONING_TRUST_MANAGER = new TrustManager[] {new TrustAllTrustManager()}; + + public static void turnOffSslChecking() throws NoSuchAlgorithmException, KeyManagementException { + HttpsURLConnection.setDefaultHostnameVerifier(trivialHostnameVerifier); + // Install the all-trusting trust manager + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, UNQUESTIONING_TRUST_MANAGER, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + public static void turnOnSslChecking() throws KeyManagementException, NoSuchAlgorithmException { + HttpsURLConnection.setDefaultHostnameVerifier(jvmHostnameVerifier); + // Return it to the initial state (discovered by reflection, now hardcoded) + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, null, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + private HttpsURLConnectionUtils() { + throw new UnsupportedOperationException("Do not instantiate libraries."); + } +} diff --git a/webapp-backend/src/main/resources/ESAPI.properties b/webapp-backend/src/main/resources/ESAPI.properties new file mode 100644 index 0000000..ca45e09 --- /dev/null +++ b/webapp-backend/src/main/resources/ESAPI.properties @@ -0,0 +1,385 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +#=========================================================================== +# ESAPI Configuration +# +# If true, then print all the ESAPI properties set here when they are loaded. +# If false, they are not printed. Useful to reduce output when running JUnit tests. +# If you need to troubleshoot a properties related problem, turning this on may help. +# This is 'false' in the src/test/resources/.esapi version. It is 'true' by +# default for reasons of backward compatibility with earlier ESAPI versions. +ESAPI.printProperties=false + +# ESAPI is designed to be easily extensible. You can use the reference implementation +# or implement your own providers to take advantage of your enterprise's security +# infrastructure. The functions in ESAPI are referenced using the ESAPI locator, like: +# +# String ciphertext = +# ESAPI.encryptor().encrypt("Secret message"); // Deprecated in 2.0 +# CipherText cipherText = +# ESAPI.encryptor().encrypt(new PlainText("Secret message")); // Preferred +# +# Below you can specify the classname for the provider that you wish to use in your +# application. The only requirement is that it implement the appropriate ESAPI interface. +# This allows you to switch security implementations in the future without rewriting the +# entire application. +# +# ExperimentalAccessController requires ESAPI-AccessControlPolicy.xml in .esapi directory +ESAPI.AccessControl=org.owasp.esapi.reference.DefaultAccessController +# FileBasedAuthenticator requires users.txt file in .esapi directory +ESAPI.Authenticator=org.owasp.esapi.reference.FileBasedAuthenticator +ESAPI.Encoder=org.owasp.esapi.reference.DefaultEncoder +ESAPI.Encryptor=org.owasp.esapi.reference.crypto.JavaEncryptor + +ESAPI.Executor=org.owasp.esapi.reference.DefaultExecutor +ESAPI.HTTPUtilities=org.owasp.esapi.reference.DefaultHTTPUtilities +ESAPI.IntrusionDetector=org.owasp.esapi.reference.DefaultIntrusionDetector +#ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory +ESAPI.Randomizer=org.owasp.esapi.reference.DefaultRandomizer +ESAPI.Validator=org.owasp.esapi.reference.DefaultValidator + +#=========================================================================== +# ESAPI Authenticator +# +Authenticator.AllowedLoginAttempts=3 +#Authenticator.MaxOldPasswordHashes=13 +Authenticator.UsernameParameterName=username +#Authenticator.PasswordParameterName=password +# RememberTokenDuration (in days) +Authenticator.RememberTokenDuration=14 +# Session Timeouts (in minutes) +Authenticator.IdleTimeoutDuration=20 +Authenticator.AbsoluteTimeoutDuration=120 + +#=========================================================================== +# ESAPI Encoder +# +# ESAPI canonicalizes input before validation to prevent bypassing filters with encoded attacks. +# Failure to canonicalize input is a very common mistake when implementing validation schemes. +# Canonicalization is automatic when using the ESAPI Validator, but you can also use the +# following code to canonicalize data. +# +# ESAPI.Encoder().canonicalize( "%22hello world"" ); +# +# Multiple encoding is when a single encoding format is applied multiple times. Allowing +# multiple encoding is strongly discouraged. +Encoder.AllowMultipleEncoding=false + +# Mixed encoding is when multiple different encoding formats are applied, or when +# multiple formats are nested. Allowing multiple encoding is strongly discouraged. +Encoder.AllowMixedEncoding=false + +# The default list of codecs to apply when canonicalizing untrusted data. The list should include the codecs +# for all downstream interpreters or decoders. For example, if the data is likely to end up in a URL, HTML, or +# inside JavaScript, then the list of codecs below is appropriate. The order of the list is not terribly important. +Encoder.DefaultCodecList=HTMLEntityCodec,PercentCodec,JavaScriptCodec + + +#=========================================================================== +# ESAPI Encryption +# +# The ESAPI Encryptor provides basic cryptographic functions with a simplified API. +# To get started, generate a new key using java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor +# There is not currently any support for key rotation, so be careful when changing your key and salt as it +# will invalidate all signed, encrypted, and hashed data. +# +# WARNING: Not all combinations of algorithms and key lengths are supported. +# If you choose to use a key length greater than 128, you MUST download the +# unlimited strength policy files and install in the lib directory of your JRE/JDK. +# See http://java.sun.com/javase/downloads/index.jsp for more information. +# +# Backward compatibility with ESAPI Java 1.4 is supported by the two deprecated API +# methods, Encryptor.encrypt(String) and Encryptor.decrypt(String). However, whenever +# possible, these methods should be avoided as they use ECB cipher mode, which in almost +# all circumstances a poor choice because of it's weakness. CBC cipher mode is the default +# for the new Encryptor encrypt / decrypt methods for ESAPI Java 2.0. In general, you +# should only use this compatibility setting if you have persistent data encrypted with +# version 1.4 and even then, you should ONLY set this compatibility mode UNTIL +# you have decrypted all of your old encrypted data and then re-encrypted it with +# ESAPI 2.0 using CBC mode. If you have some reason to mix the deprecated 1.4 mode +# with the new 2.0 methods, make sure that you use the same cipher algorithm for both +# (256-bit AES was the default for 1.4; 128-bit is the default for 2.0; see below for +# more details.) Otherwise, you will have to use the new 2.0 encrypt / decrypt methods +# where you can specify a SecretKey. (Note that if you are using the 256-bit AES, +# that requires downloading the special jurisdiction policy files mentioned above.) +# +# ***** IMPORTANT: Do NOT forget to replace these with your own values! ***** +# To calculate these values, you can run: +# java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor +# +Encryptor.MasterKey=tzfztf56ftv +Encryptor.MasterSalt=123456ztrewq + +# Provides the default JCE provider that ESAPI will "prefer" for its symmetric +# encryption and hashing. (That is it will look to this provider first, but it +# will defer to other providers if the requested algorithm is not implemented +# by this provider.) If left unset, ESAPI will just use your Java VM's current +# preferred JCE provider, which is generally set in the file +# "$JAVA_HOME/jre/lib/security/java.security". +# +# The main intent of this is to allow ESAPI symmetric encryption to be +# used with a FIPS 140-2 compliant crypto-module. For details, see the section +# "Using ESAPI Symmetric Encryption with FIPS 140-2 Cryptographic Modules" in +# the ESAPI 2.0 Symmetric Encryption User Guide, at: +# http://owasp-esapi-java.googlecode.com/svn/trunk/documentation/esapi4java-core-2.0-symmetric-crypto-user-guide.html +# However, this property also allows you to easily use an alternate JCE provider +# such as "Bouncy Castle" without having to make changes to "java.security". +# See Javadoc for SecurityProviderLoader for further details. If you wish to use +# a provider that is not known to SecurityProviderLoader, you may specify the +# fully-qualified class name of the JCE provider class that implements +# java.security.Provider. If the name contains a '.', this is interpreted as +# a fully-qualified class name that implements java.security.Provider. +# +# NOTE: Setting this property has the side-effect of changing it in your application +# as well, so if you are using JCE in your application directly rather than +# through ESAPI (you wouldn't do that, would you? ;-), it will change the +# preferred JCE provider there as well. +# +# Default: Keeps the JCE provider set to whatever JVM sets it to. +Encryptor.PreferredJCEProvider= + +# AES is the most widely used and strongest encryption algorithm. This +# should agree with your Encryptor.CipherTransformation property. +# By default, ESAPI Java 1.4 uses "PBEWithMD5AndDES" and which is +# very weak. It is essentially a password-based encryption key, hashed +# with MD5 around 1K times and then encrypted with the weak DES algorithm +# (56-bits) using ECB mode and an unspecified padding (it is +# JCE provider specific, but most likely "NoPadding"). However, 2.0 uses +# "AES/CBC/PKCSPadding". If you want to change these, change them here. +# Warning: This property does not control the default reference implementation for +# ESAPI 2.0 using JavaEncryptor. Also, this property will be dropped +# in the future. +# @deprecated +Encryptor.EncryptionAlgorithm=AES +# For ESAPI Java 2.0 - New encrypt / decrypt methods use this. +Encryptor.CipherTransformation=AES/CBC/PKCS5Padding + +# Applies to ESAPI 2.0 and later only! +# Comma-separated list of cipher modes that provide *BOTH* +# confidentiality *AND* message authenticity. (NIST refers to such cipher +# modes as "combined modes" so that's what we shall call them.) If any of these +# cipher modes are used then no MAC is calculated and stored +# in the CipherText upon encryption. Likewise, if one of these +# cipher modes is used with decryption, no attempt will be made +# to validate the MAC contained in the CipherText object regardless +# of whether it contains one or not. Since the expectation is that +# these cipher modes support support message authenticity already, +# injecting a MAC in the CipherText object would be at best redundant. +# +# Note that as of JDK 1.5, the SunJCE provider does not support *any* +# of these cipher modes. Of these listed, only GCM and CCM are currently +# NIST approved. YMMV for other JCE providers. E.g., Bouncy Castle supports +# GCM and CCM with "NoPadding" mode, but not with "PKCS5Padding" or other +# padding modes. +Encryptor.cipher_modes.combined_modes=GCM,CCM,IAPM,EAX,OCB,CWC + +# Applies to ESAPI 2.0 and later only! +# Additional cipher modes allowed for ESAPI 2.0 encryption. These +# cipher modes are in _addition_ to those specified by the property +# 'Encryptor.cipher_modes.combined_modes'. +# Note: We will add support for streaming modes like CFB & OFB once +# we add support for 'specified' to the property 'Encryptor.ChooseIVMethod' +# (probably in ESAPI 2.1). +# DISCUSS: Better name? +Encryptor.cipher_modes.additional_allowed=CBC + +# 128-bit is almost always sufficient and appears to be more resistant to +# related key attacks than is 256-bit AES. Use '_' to use default key size +# for cipher algorithms (where it makes sense because the algorithm supports +# a variable key size). Key length must agree to what's provided as the +# cipher transformation, otherwise this will be ignored after logging a +# warning. +# +# NOTE: This is what applies BOTH ESAPI 1.4 and 2.0. See warning above about mixing! +Encryptor.EncryptionKeyLength=128 + +# Because 2.0 uses CBC mode by default, it requires an initialization vector (IV). +# (All cipher modes except ECB require an IV.) There are two choices: we can either +# use a fixed IV known to both parties or allow ESAPI to choose a random IV. While +# the IV does not need to be hidden from adversaries, it is important that the +# adversary not be allowed to choose it. Also, random IVs are generally much more +# secure than fixed IVs. (In fact, it is essential that feed-back cipher modes +# such as CFB and OFB use a different IV for each encryption with a given key so +# in such cases, random IVs are much preferred. By default, ESAPI 2.0 uses random +# IVs. If you wish to use 'fixed' IVs, set 'Encryptor.ChooseIVMethod=fixed' and +# uncomment the Encryptor.fixedIV. +# +# Valid values: random|fixed|specified 'specified' not yet implemented; planned for 2.1 +Encryptor.ChooseIVMethod=random +# If you choose to use a fixed IV, then you must place a fixed IV here that +# is known to all others who are sharing your secret key. The format should +# be a hex string that is the same length as the cipher block size for the +# cipher algorithm that you are using. The following is an *example* for AES +# from an AES test vector for AES-128/CBC as described in: +# NIST Special Publication 800-38A (2001 Edition) +# "Recommendation for Block Cipher Modes of Operation". +# (Note that the block size for AES is 16 bytes == 128 bits.) +# +Encryptor.fixedIV=0x000102030405060708090a0b0c0d0e0f + +# Whether or not CipherText should use a message authentication code (MAC) with it. +# This prevents an adversary from altering the IV as well as allowing a more +# fool-proof way of determining the decryption failed because of an incorrect +# key being supplied. This refers to the "separate" MAC calculated and stored +# in CipherText, not part of any MAC that is calculated as a result of a +# "combined mode" cipher mode. +# +# If you are using ESAPI with a FIPS 140-2 cryptographic module, you *must* also +# set this property to false. +Encryptor.CipherText.useMAC=true + +# Whether or not the PlainText object may be overwritten and then marked +# eligible for garbage collection. If not set, this is still treated as 'true'. +Encryptor.PlainText.overwrite=true + +# Do not use DES except in a legacy situations. 56-bit is way too small key size. +#Encryptor.EncryptionKeyLength=56 +#Encryptor.EncryptionAlgorithm=DES + +# TripleDES is considered strong enough for most purposes. +# Note: There is also a 112-bit version of DESede. Using the 168-bit version +# requires downloading the special jurisdiction policy from Sun. +#Encryptor.EncryptionKeyLength=168 +#Encryptor.EncryptionAlgorithm=DESede + +Encryptor.HashAlgorithm=SHA-512 +Encryptor.HashIterations=1024 +Encryptor.DigitalSignatureAlgorithm=SHA1withDSA +Encryptor.DigitalSignatureKeyLength=1024 +Encryptor.RandomAlgorithm=SHA1PRNG +Encryptor.CharacterEncoding=UTF-8 + +# This is the Pseudo Random Function (PRF) that ESAPI's Key Derivation Function +# (KDF) normally uses. Note this is *only* the PRF used for ESAPI's KDF and +# *not* what is used for ESAPI's MAC. (Currently, HmacSHA1 is always used for +# the MAC, mostly to keep the overall size at a minimum.) +# +# Currently supported choices for JDK 1.5 and 1.6 are: +# HmacSHA1 (160 bits), HmacSHA256 (256 bits), HmacSHA384 (384 bits), and +# HmacSHA512 (512 bits). +# Note that HmacMD5 is *not* supported for the PRF used by the KDF even though +# the JDKs support it. See the ESAPI 2.0 Symmetric Encryption User Guide +# further details. +Encryptor.KDF.PRF=HmacSHA256 +#=========================================================================== +# ESAPI Logging +# Set the application name if these logs are combined with other applications +Logger.ApplicationName=portal_nonrtric_controlpanel +# If you use an HTML log viewer that does not properly HTML escape log data, you can set LogEncodingRequired to true +Logger.LogEncodingRequired=false +# Determines whether ESAPI should log the application name. This might be clutter in some single-server/single-app environments. +Logger.LogApplicationName=true +# Determines whether ESAPI should log the server IP and port. This might be clutter in some single-server environments. +Logger.LogServerIP=true +# LogFileName, the name of the logging file. Provide a full directory path (e.g., C:\\ESAPI\\ESAPI_logging_file) if you +# want to place it in a specific directory. +Logger.LogFileName=portal_nonrtric_controlpanel_esapi_log +# MaxLogFileSize, the max size (in bytes) of a single log file before it cuts over to a new one (default is 10,000,000) +Logger.MaxLogFileSize=10000000 + + +#=========================================================================== +# ESAPI Intrusion Detection +# +# Each event has a base to which .count, .interval, and .action are added +# The IntrusionException will fire if we receive "count" events within "interval" seconds +# The IntrusionDetector is configurable to take the following actions: log, logout, and disable +# (multiple actions separated by commas are allowed e.g. event.test.actions=log,disable +# +# Custom Events +# Names must start with "event." as the base +# Use IntrusionDetector.addEvent( "test" ) in your code to trigger "event.test" here +# You can also disable intrusion detection completely by changing +# the following parameter to true +# +IntrusionDetector.Disable=false +# +IntrusionDetector.event.test.count=2 +IntrusionDetector.event.test.interval=10 +IntrusionDetector.event.test.actions=disable,log + +# Exception Events +# All EnterpriseSecurityExceptions are registered automatically +# Call IntrusionDetector.getInstance().addException(e) for Exceptions that do not extend EnterpriseSecurityException +# Use the fully qualified classname of the exception as the base + +# any intrusion is an attack +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.count=1 +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.interval=1 +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.actions=log,disable,logout + +# for test purposes +# CHECKME: Shouldn't there be something in the property name itself that designates +# that these are for testing??? +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.count=10 +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.interval=5 +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.actions=log,disable,logout + +# rapid validation errors indicate scans or attacks in progress +# org.owasp.esapi.errors.ValidationException.count=10 +# org.owasp.esapi.errors.ValidationException.interval=10 +# org.owasp.esapi.errors.ValidationException.actions=log,logout + +# sessions jumping between hosts indicates session hijacking +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.count=2 +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.interval=10 +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.actions=log,logout + + +#=========================================================================== +# ESAPI Validation +# +# The ESAPI Validator works on regular expressions with defined names. You can define names +# either here, or you may define application specific patterns in a separate file defined below. +# This allows enterprises to specify both organizational standards as well as application specific +# validation rules. +# +Validator.ConfigurationFile=validation.properties +Validator.ConfigurationFile.MultiValued=false + +# Validators used by ESAPI +Validator.AccountName=^[a-zA-Z0-9]{3,20}$ +Validator.SystemCommand=^[a-zA-Z\\-\\/]{1,64}$ +Validator.RoleName=^[a-z]{1,20}$ + +#the word TEST below should be changed to your application +#name - only relative URL's are supported +Validator.Redirect=^\\/test.*$ + +# Global HTTP Validation Rules +# Values with Base64 encoded data (e.g. encrypted state) will need at least [a-zA-Z0-9\/+=] +Validator.HTTPScheme=^(http|https)$ +Validator.HTTPServerName=^[a-zA-Z0-9_.\\-]*$ +Validator.HTTPParameterName=^[a-zA-Z0-9_]{1,32}$ +Validator.HTTPParameterValue=^[a-zA-Z0-9.\\-\\/+=@_ ]*$ +Validator.HTTPCookieName=^[a-zA-Z0-9\\-_]{1,32}$ +Validator.HTTPCookieValue=^[a-zA-Z0-9\\-\\/+=_ ]*$ +Validator.HTTPHeaderName=^[a-zA-Z0-9\\-_]{1,32}$ +Validator.HTTPHeaderValue=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ +Validator.HTTPContextPath=^\\/?[a-zA-Z0-9.\\-\\/_]*$ +Validator.HTTPServletPath=^[a-zA-Z0-9.\\-\\/_]*$ +Validator.HTTPPath=^[a-zA-Z0-9.\\-_]*$ +Validator.HTTPQueryString=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ %]*$ +Validator.HTTPURI=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ +Validator.HTTPURL=^.*$ +Validator.HTTPJSESSIONID=^[A-Z0-9]{10,30}$ + +# Validation of file related input +Validator.FileName=^[a-zA-Z0-9!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ +Validator.DirectoryName=^[a-zA-Z0-9:/\\\\!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ diff --git a/webapp-backend/src/main/resources/application.properties b/webapp-backend/src/main/resources/application.properties new file mode 100644 index 0000000..725f658 --- /dev/null +++ b/webapp-backend/src/main/resources/application.properties @@ -0,0 +1,63 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# Modifications Copyright (C) 2019 Nordix Foundation +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Defines NonRT RIC Controlpanel property keys and default values. +# Create a copy in the launch directory to override values; or +# copy to "application-abc.properties" as mentioned in the README. + +# A spring property but without a "spring" prefix; +# the port number is chosen RANDOMLY when running tests +server.port = 8080 + +# path to file that stores user details; +# use a persistent volume in a K8S deployment +userfile = users.json + +# boolean flag whether to enforce Portal user and roles on requests +portalapi.security = false +# class that decrypts ciphertext from Portal +portalapi.decryptor = org.oransc.portal.nonrtric.controlpanel.portalapi.PortalSdkDecryptorAes +# name of request cookie with user ID +portalapi.usercookie = UserId + +# portal credentials must be supplied at deployment time +portalapi.appname = NonRT RIC Controlpanel +portalapi.username = +portalapi.password = + +# endpoint URLs must be supplied at deployment time +# NOTE: change policycontroller.url.prefix to http://localhost:8081 when running +# controlpanel locally (i.e., not inside the docker container) +policycontroller.url.prefix = http://policy-agent-container:8081 + + +# Kubernetes API via https://github.com/nokia/caas-ingress +# Set insecure=true to disable SSL certificate and hostname checking +caasingress.insecure = true +caasingress.aux.url.prefix = https://jar-app-props-default-caas-ingress-aux-URL +caasingress.aux.url.suffix = /api +caasingress.plt.url.prefix = https://jar-app-props-default-caas-ingress-plt-URL +caasingress.plt.url.suffix = /api + +# Mimic slow endpoints by defining sleep period, in milliseconds +mock.config.delay = 0 + +# Kibana report on metrics +metrics.url.ac = http://jar-app-props-kibana-url-ac +metrics.url.mc = http://jar-app-props-kibana-url-mc diff --git a/webapp-backend/src/main/resources/key.properties b/webapp-backend/src/main/resources/key.properties new file mode 100644 index 0000000..c2cab7d --- /dev/null +++ b/webapp-backend/src/main/resources/key.properties @@ -0,0 +1,22 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Test properties for the EPSDK-FW library. +# This file must be present on the Java classpath. + +cipher.enc.key = bogus diff --git a/webapp-backend/src/main/resources/logback.xml b/webapp-backend/src/main/resources/logback.xml new file mode 100644 index 0000000..e966bc6 --- /dev/null +++ b/webapp-backend/src/main/resources/logback.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + ${pattern} + + + + + ${logDirectory}/${componentName}.log + true + + ${logDirectory}/${componentName}.%i.log.zip + 1 + 9 + + + 10MB + + + + ${pattern} + + + + + + + + + + > + + + + + + + + + + + diff --git a/webapp-backend/src/main/resources/portal.properties b/webapp-backend/src/main/resources/portal.properties new file mode 100644 index 0000000..f0d6eca --- /dev/null +++ b/webapp-backend/src/main/resources/portal.properties @@ -0,0 +1,34 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Template for the file that provides properties for the EPSDK-FW library. +# This file must be present on the Java classpath. + +# The following properties are the same in every deployment + +portal.api.impl.class = org.oransc.portal.nonrtric.controlpanel.portalapi.PortalRestCentralServiceImpl +role_access_centralized = remote + +# The following properties are DIFFERENT in every deployment + +# URL of portal login screen +ecomp_redirect_url = http://localhost/portal +# URL of portal API +ecomp_rest_url = http://localhost/portal +# Value assigned by portal instance +ueb_app_key = abcdef1234567890 diff --git a/webapp-backend/src/main/resources/static/error.html b/webapp-backend/src/main/resources/static/error.html new file mode 100644 index 0000000..f52c9b1 --- /dev/null +++ b/webapp-backend/src/main/resources/static/error.html @@ -0,0 +1,36 @@ + + + + + +Static error page + + + +

NonRT RIC Controlpanel Error

+

The previous request could not be processed.

+Click here to reload the application + + diff --git a/webapp-backend/src/main/resources/validation.properties b/webapp-backend/src/main/resources/validation.properties new file mode 100644 index 0000000..22eaa4e --- /dev/null +++ b/webapp-backend/src/main/resources/validation.properties @@ -0,0 +1,19 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# empty file to suppress OWASP complaints emitted to stdout diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java new file mode 100644 index 0000000..fdd8103 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java @@ -0,0 +1,70 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel; + +import java.lang.invoke.MethodHandles; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +/** + * This class supports front-end web development. Placing this class in the test + * area allows excluding the mock configuration classes and the Mockito + * dependencies from the packaged version of the app. + * + * To launch a development server set the environment variable as listed below. + * This runs a Spring-Boot server with mock back-end beans, and keeps the server + * alive for manual testing. Supply this JVM argument: + * + *
+ * -Dorg.org.oransc.portal.nonrtric.controlpanel=mock
+ * 
+ */ +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +public class ControlpanelTestServer { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + /* + * Keeps the test server alive forever. Use a guard so this test is never run by + * Jenkins. + */ + @SuppressWarnings("squid:S2699") // To avoid warning about missing assertion. + @EnabledIfSystemProperty(named = "org.oransc.portal.nonrtric.controlpanel", matches = "mock") + @Test + public void keepServerAlive() { + logger.warn("Keeping server alive!"); + try { + synchronized (this) { + this.wait(); + } + } catch (Exception ex) { + logger.warn(ex.toString()); + } + } +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java new file mode 100644 index 0000000..034a154 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java @@ -0,0 +1,86 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel; + +import java.lang.invoke.MethodHandles; +import java.util.HashSet; +import java.util.Set; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; +import org.onap.portalsdk.core.restful.domain.EcompRole; +import org.onap.portalsdk.core.restful.domain.EcompUser; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +public class ControlpanelUserManagerTest { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public static EcompUser createEcompUser(String loginId) { + EcompUser user = new EcompUser(); + user.setActive(true); + user.setLoginId(loginId); + user.setFirstName("First"); + user.setLastName("Last"); + EcompRole role = new EcompRole(); + role.setId(1L); + role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + Set roles = new HashSet<>(); + roles.add(role); + user.setRoles(roles); + return user; + } + + @Test + public void testUserMgr() throws Exception { + final String loginId = "demo"; + ControlpanelUserManager dum = new ControlpanelUserManager(true); + EcompUser user = createEcompUser(loginId); + dum.createUser(user); + logger.info("Created user {}", user); + try { + dum.createUser(user); + throw new Exception("Unexpected success"); + } catch (PortalAPIException ex) { + logger.info("caught expected exception: {}", ex.toString()); + } + Assert.assertFalse(dum.getUsers().isEmpty()); + EcompUser fetched = dum.getUser(loginId); + Assert.assertEquals(fetched, user); + fetched.setLastName("Lastier"); + dum.updateUser(loginId, fetched); + EcompUser missing = dum.getUser("foo"); + Assert.assertNull(missing); + EcompUser unk = createEcompUser("unknown"); + try { + dum.updateUser("unk", unk); + } catch (PortalAPIException ex) { + logger.info("caught expected exception: {}", ex.toString()); + } + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PolicyControllerMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PolicyControllerMockConfiguration.java new file mode 100644 index 0000000..0f9599b --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PolicyControllerMockConfiguration.java @@ -0,0 +1,192 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import com.google.gson.GsonBuilder; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Vector; +import java.util.stream.Collectors; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyType; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes; +import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApi; +import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; + +/** + * Creates a mock implementation of the policy controller client API. + */ +@TestConfiguration +public class PolicyControllerMockConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private static com.google.gson.Gson gson = new GsonBuilder() // + .serializeNulls() // + .create(); // + + @Bean + public PolicyAgentApi policyAgentApi() { + MockPolicyAgentApi apiClient = new MockPolicyAgentApi(); + return apiClient; + } + + class MockPolicyAgentApi implements PolicyAgentApi { + private final Database database = new Database(); + + @Override + public ResponseEntity getPolicyInstance(String id) { + return new ResponseEntity<>(database.getInstance(id), HttpStatus.OK); + } + + @Override + public ResponseEntity putPolicy(String policyTypeIdString, String policyInstanceId, Object json, + String ric) { + database.putInstance(policyTypeIdString, policyInstanceId, json, ric); + return new ResponseEntity<>("Policy was put successfully", HttpStatus.OK); + } + + @Override + public ResponseEntity deletePolicy(String policyInstanceId) { + database.deleteInstance(policyInstanceId); + return new ResponseEntity<>("Policy was deleted successfully", HttpStatus.NO_CONTENT); + } + + @Override + public ResponseEntity getAllPolicyTypes() { + PolicyTypes result = new PolicyTypes(); + result.addAll(database.getTypes()); + return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK); + } + + @Override + public ResponseEntity getPolicyInstancesForType(String type) { + PolicyInstances result = new PolicyInstances(); + List inst = database.getInstances(Optional.of(type)); + result.addAll(inst); + return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK); + } + + @Override + public ResponseEntity getRicsSupportingType(String typeName) { + Vector res = new Vector<>(); + res.add("ric_1"); + res.add("ric_2"); + res.add("ric_3"); + return new ResponseEntity<>(gson.toJson(res), HttpStatus.OK); + } + } + + class Database { + + Database() { + String schema = getStringFromFile("demo-policy-schema-1.json"); + PolicyType policyType = new PolicyType("type2", schema); + types.put("type2", policyType); + + schema = getStringFromFile("demo-policy-schema-2.json"); + policyType = new PolicyType("type3", schema); + types.put("type3", policyType); + + schema = getStringFromFile("demo-policy-schema-3.json"); + policyType = new PolicyType("type4", schema); + types.put("type4", policyType); + } + + private String getStringFromFile(String path) { + try { + InputStream inputStream = + MethodHandles.lookup().lookupClass().getClassLoader().getResourceAsStream(path); + return new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n")); + } catch (Exception e) { + logger.error("Cannot read file :" + path, e); + return ""; + } + } + + String normalize(String str) { + return str.replace('\n', ' '); + } + + private String getTimeStampUTC() { + return java.time.Instant.now().toString(); + } + + void putInstance(String typeId, String instanceId, Object instanceData, String ric) { + PolicyInfo i = ImmutablePolicyInfo.builder().json(instanceData).lastModified(getTimeStampUTC()) + .id(instanceId).ric(ric).service("service").type(typeId).build(); + instances.put(instanceId, i); + } + + public void deleteInstance(String instanceId) { + instances.remove(instanceId); + } + + Object getInstance(String id) throws RestClientException { + PolicyInfo i = instances.get(id); + if (i == null) { + throw new RestClientException("Type not found: " + id); + } + return i.json(); + } + + public Collection getTypes() { + return types.values(); + } + + public List getInstances(Optional typeId) { + ArrayList result = new ArrayList<>(); + for (PolicyInfo i : instances.values()) { + if (typeId.isPresent()) { + if (i.type().equals(typeId.get())) { + result.add(i); + } + + } else { + result.add(i); + } + } + return result; + } + + private Map types = new HashMap<>(); + private Map instances = new HashMap<>(); + + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApIMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApIMockConfiguration.java new file mode 100644 index 0000000..ced6b75 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/PortalApIMockConfiguration.java @@ -0,0 +1,84 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; + +import java.lang.invoke.MethodHandles; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.onap.portalsdk.core.onboarding.crossapi.PortalRestAPIProxy; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("test") +public class PortalApIMockConfiguration { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Unfortunately EPSDK-FW does not define these as constants + public static final String PORTAL_USERNAME_HEADER_KEY = "username"; + public static final String PORTAL_PASSWORD_HEADER_KEY = "password"; + + @Bean + public ServletRegistrationBean portalApiProxyServlet() { + PortalRestAPIProxy servlet = new PortalRestAPIProxy(); + final ServletRegistrationBean servletBean = + new ServletRegistrationBean<>(servlet, PortalApiConstants.API_PREFIX + "/*"); + servletBean.setName("PortalRestApiProxyServlet"); + return servletBean; + } + + @Bean + public PortalAuthManager portalAuthManager() throws Exception { + PortalAuthManager mockManager = mock(PortalAuthManager.class); + final Map credentialsMap = new HashMap<>(); + credentialsMap.put("appName", "appName"); + credentialsMap.put(PORTAL_USERNAME_HEADER_KEY, PORTAL_USERNAME_HEADER_KEY); + credentialsMap.put(PORTAL_PASSWORD_HEADER_KEY, PORTAL_PASSWORD_HEADER_KEY); + doAnswer(inv -> { + logger.debug("getAppCredentials"); + return credentialsMap; + }).when(mockManager).getAppCredentials(); + doAnswer(inv -> { + logger.debug("getUserId"); + return "userId"; + }).when(mockManager).validateEcompSso(any(HttpServletRequest.class)); + doAnswer(inv -> { + logger.debug("getAppCredentials"); + return credentialsMap; + }).when(mockManager).getAppCredentials(); + return mockManager; + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java new file mode 100644 index 0000000..e72fd1c --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java @@ -0,0 +1,85 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.config; + +import java.lang.invoke.MethodHandles; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.config.WebSecurityConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled = true) +@Profile("test") +public class WebSecurityMockConfiguration extends WebSecurityConfigurerAdapter { + + public static final String TEST_CRED_ADMIN = "admin"; + public static final String TEST_CRED_STANDARD = "standard"; + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public WebSecurityMockConfiguration(@Value("${userfile}") final String userFilePath) { + logger.debug("ctor: user file path {}", userFilePath); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); + auth.inMemoryAuthentication() // + .passwordEncoder(encoder) // + // The admin user has the admin AND standard roles + .withUser(TEST_CRED_ADMIN) // + .password(encoder.encode(TEST_CRED_ADMIN)) + .roles(ControlpanelConstants.ROLE_NAME_ADMIN, ControlpanelConstants.ROLE_NAME_STANDARD)// + .and()// + // The standard user has only the standard role + .withUser(TEST_CRED_STANDARD) // + .password(encoder.encode(TEST_CRED_STANDARD)) // + .roles(ControlpanelConstants.ROLE_NAME_STANDARD); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().anyRequest().authenticated()// + .and().httpBasic() // + .and().csrf().disable(); + } + + @Override + public void configure(WebSecurity web) throws Exception { + // This disables Spring security, but not the app's filter. + web.ignoring().antMatchers(WebSecurityConfiguration.OPEN_PATHS); + web.ignoring().antMatchers("/", "/csrf"); // allow swagger-ui to load + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/AbstractControllerTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/AbstractControllerTest.java new file mode 100644 index 0000000..08c1c74 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/AbstractControllerTest.java @@ -0,0 +1,113 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.lang.invoke.MethodHandles; +import java.net.URI; +import java.util.Map; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.oransc.portal.nonrtric.controlpanel.config.WebSecurityMockConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.util.UriComponentsBuilder; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +// Need the fake answers from the backend +@ActiveProfiles("test") +public class AbstractControllerTest { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + // Created by Spring black magic + // https://spring.io/guides/gs/testing-web/ + @LocalServerPort + private int localServerPort; + + @Autowired + protected TestRestTemplate restTemplate; + + /** + * Flexible URI builder. + * + * @param queryParams + * Map of string-string query parameters + * @param path + * Array of path components. If a component has an + * embedded slash, the string is split and each + * subcomponent is added individually. + * @return URI + */ + protected URI buildUri(final Map queryParams, final String... path) { + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:" + localServerPort + "/"); + for (int p = 0; p < path.length; ++p) { + if (path[p] == null || path[p].isEmpty()) { + throw new IllegalArgumentException("Unexpected null or empty at path index " + Integer.toString(p)); + } else if (path[p].contains("/")) { + String[] subpaths = path[p].split("/"); + for (String s : subpaths) + if (!s.isEmpty()) + builder.pathSegment(s); + } else { + builder.pathSegment(path[p]); + } + } + if (queryParams != null && queryParams.size() > 0) { + for (Map.Entry entry : queryParams.entrySet()) { + if (entry.getKey() == null || entry.getValue() == null) + throw new IllegalArgumentException("Unexpected null key or value"); + else + builder.queryParam(entry.getKey(), entry.getValue()); + } + } + return builder.build().encode().toUri(); + } + + // Because I put the annotations on this parent class, + // must define at least one test here. + @Test + public void contextLoads() { + // Silence Sonar warning about missing assertion. + Assertions.assertTrue(logger.isWarnEnabled()); + logger.info("Context loads on mock profile"); + } + + public TestRestTemplate testRestTemplateAdminRole() { + return restTemplate.withBasicAuth(WebSecurityMockConfiguration.TEST_CRED_ADMIN, + WebSecurityMockConfiguration.TEST_CRED_ADMIN); + } + + public TestRestTemplate testRestTemplateStandardRole() { + return restTemplate.withBasicAuth(WebSecurityMockConfiguration.TEST_CRED_STANDARD, + WebSecurityMockConfiguration.TEST_CRED_STANDARD); + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/DefaultContextTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/DefaultContextTest.java new file mode 100644 index 0000000..4c2687b --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/DefaultContextTest.java @@ -0,0 +1,49 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.lang.invoke.MethodHandles; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +/** + * Tests whether the default (not mock) configuration classes run to completion. + */ +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class DefaultContextTest { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @Test + public void contextLoads() { + // Silence Sonar warning about missing assertion. + Assertions.assertTrue(logger.isWarnEnabled()); + logger.info("Context loads on default profile"); + } + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java new file mode 100644 index 0000000..77038b6 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java @@ -0,0 +1,112 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.controller; + +import java.lang.invoke.MethodHandles; +import java.net.URI; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; + +public class PortalRestCentralServiceTest extends AbstractControllerTest { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @Test + public void getAnalyticsTest() { + // paths are hardcoded here exactly like the EPSDK-FW library :( + URI uri = buildUri(null, PortalApiConstants.API_PREFIX, "/analytics"); + logger.info("Invoking {}", uri); + ResponseEntity response = restTemplate.exchange(uri, HttpMethod.GET, null, String.class); + // No Portal is available so this always fails + Assertions.assertTrue(response.getStatusCode().is4xxClientError()); + } + + @Test + public void getErrorPageTest() { + // Send unauthorized request + URI uri = buildUri(null, "/favicon.ico"); + logger.info("Invoking {}", uri); + ResponseEntity response = restTemplate.exchange(uri, HttpMethod.GET, null, String.class); + Assertions.assertTrue(response.getStatusCode().is4xxClientError()); + Assertions.assertTrue(response.getBody().contains("Static error page")); + } + + /* + * private HttpEntity getEntityWithHeaders(Object body) { + * HttpHeaders headers = new HttpHeaders(); + * headers.set(PortalApIMockConfiguration.PORTAL_USERNAME_HEADER_KEY, + * PortalApIMockConfiguration.PORTAL_USERNAME_HEADER_KEY); + * headers.set(PortalApIMockConfiguration.PORTAL_PASSWORD_HEADER_KEY, + * PortalApIMockConfiguration.PORTAL_PASSWORD_HEADER_KEY); + * HttpEntity entity = new HttpEntity<>(body, headers); + * return entity; + * } + * + * private EcompUser createEcompUser(String loginId) { + * EcompUser user = new EcompUser(); + * user.setLoginId(loginId); + * EcompRole role = new EcompRole(); + * role.setRoleFunctions(Collections.EMPTY_SET); + * role.setId(1L); + * role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + * Set roles = new HashSet<>(); + * roles.add(role); + * user.setRoles(roles); + * return user; + * } + * + * @Test + * + * @Test + * public void createUserTest() { + * final String loginId = "login1"; + * URI create = buildUri(null, PortalApiConstants.API_PREFIX, "user"); + * logger.info("Invoking {}", create); + * HttpEntity requestEntity = getEntityWithHeaders(createEcompUser(loginId)); + * ResponseEntity response = restTemplate.exchange(create, HttpMethod.POST, requestEntity, String.class); + * Assertions.assertTrue(response.getStatusCode().is2xxSuccessful()); + * } + * + * @Test + * public void updateUserTest() { + * final String loginId = "login2"; + * URI create = buildUri(null, PortalApiConstants.API_PREFIX, "user"); + * EcompUser user = createEcompUser(loginId); + * logger.info("Invoking {}", create); + * HttpEntity requestEntity = getEntityWithHeaders(user); + * // Create + * ResponseEntity response = restTemplate.exchange(create, HttpMethod.POST, requestEntity, String.class); + * Assertions.assertTrue(response.getStatusCode().is2xxSuccessful()); + * URI update = buildUri(null, PortalApiConstants.API_PREFIX, "user", loginId); + * user.setEmail("user@company.org"); + * requestEntity = getEntityWithHeaders(user); + * response = restTemplate.exchange(update, HttpMethod.POST, requestEntity, String.class); + * Assertions.assertTrue(response.getStatusCode().is2xxSuccessful()); + * } + */ + +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java new file mode 100644 index 0000000..dacb303 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java @@ -0,0 +1,322 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2020 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.policyagentapi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyType; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes; +import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApiImpl; +import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApiImpl.RicInfo; +import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +public class PolicyAgentApiImplTest { + private static final String URL_PREFIX = "UrlPrefix"; + private static final String URL_POLICY_SCHEMAS = "/policy_schemas"; + private static final String URL_POLICY_INSTANCES = "/policies?type={type}"; + private static final String URL_POLICY_INSTANCE = "/policy?instance={id}"; + private static final String URL_PUT_POLICY = "/policy?type={type}&instance={instance}&ric={ric}&service={service}"; + private static final String URL_DELETE_POLICY = "/policy?instance={instance}"; + private static final String URL_RIC_INFO = "/rics?policyType={typeName}"; + private static final String POLICY_TYPE_1_ID = "type1"; + private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}"; + private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}"; + private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}"; + private static final String POLICY_1_ID = "policy1"; + private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}"; + private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}"; + private static final String RIC_1_ID = "ric1"; + private static final String RIC_1_INFO_VALID = "{\"name\":\"ric1\",\"policyTypes\":[\"type1\"]}"; + private static final String RIC_1_INFO_INVALID = "{\"name\":\"ric1\",\"policyTypes\":\"type1\"]}"; + private static final String CLIENT_ERROR_MESSAGE = "Exception: Client returned failure"; + + private static com.google.gson.Gson gson = new GsonBuilder() // + .serializeNulls() // + .create(); // + + PolicyAgentApiImpl apiUnderTest; + + RestTemplate restTemplateMock; + + @BeforeEach + public void init() { + restTemplateMock = mock(RestTemplate.class); + apiUnderTest = new PolicyAgentApiImpl(URL_PREFIX, restTemplateMock); + } + + @Test + public void testGetAllPolicyTypesFailure() { + ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) + .thenReturn(getAllPolicyTypesResp); + + ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); + assertNull(returnedResp.getBody()); + assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); + } + + @Test + public void testGetAllPolicyTypesSuccessValidJson() { + String policyTypes = Arrays.asList(POLICY_TYPE_1_VALID, POLICY_TYPE_2_VALID).toString(); + String policyTypesJson = parsePolicyTypesJson(policyTypes); + ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) + .thenReturn(getAllPolicyTypesResp); + + ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); + assertEquals(returnedResp.getBody(), policyTypesJson); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testGetAllPolicyTypesSuccessInvalidJson() { + String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString(); + ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) + .thenReturn(getAllPolicyTypesResp); + + ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); + assertTrue(returnedResp.getBody().contains("Exception")); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); + } + + @Test + public void testGetPolicyInstancesForTypeFailure() { + ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) + .thenReturn(getPolicyInstancesForTypeResp); + + ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); + assertNull(returnedResp.getBody()); + assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); + } + + @Test + public void testGetPolicyInstancesForTypeSuccessValidJson() { + String policyInstances = Arrays.asList(POLICY_1_VALID).toString(); + String policyInstancesJson = parsePolicyInstancesJson(policyInstances); + ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK); + Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) + .thenReturn(getPolicyInstancesForTypeResp); + + ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); + assertEquals(returnedResp.getBody(), policyInstancesJson); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testGetPolicyInstancesForTypeSuccessInvalidJson() { + String policyInstances = Arrays.asList(POLICY_1_INVALID).toString(); + ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK); + Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) + .thenReturn(getPolicyInstancesForTypeResp); + + ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); + assertTrue(returnedResp.getBody().contains("Exception")); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); + } + + @Test + public void testGetPolicyInstance() { + ResponseEntity getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK); + Map uriVariables = Map.of("id", POLICY_1_ID); + when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables))) + .thenReturn(getPolicyInstanceResp); + + ResponseEntity returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID); + + verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCE, Object.class, uriVariables); + assertEquals(POLICY_1_VALID, returnedResp.getBody()); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testPutPolicyFailure() { + HttpEntity jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID); + Map uriVariables = Map.of( // + "type", POLICY_TYPE_1_ID, // + "instance", POLICY_1_ID, // + "ric", RIC_1_ID, // + "service", "controlpanel"); + doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock) + .put(eq(URL_PREFIX + URL_PUT_POLICY), eq(jsonHttpEntity), eq(uriVariables)); + + ResponseEntity returnedResp = + apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); + + verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables); + assertTrue(returnedResp.getBody().contains("Exception")); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); + } + + @Test + public void testPutPolicySuccess() { + HttpEntity jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID); + Map uriVariables = Map.of( // + "type", POLICY_TYPE_1_ID, // + "instance", POLICY_1_ID, // + "ric", RIC_1_ID, // + "service", "controlpanel"); + + ResponseEntity returnedResp = + apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); + + verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables); + assertNull(returnedResp.getBody()); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testDeletePolicyFailure() { + Map uriVariables = Map.of("instance", POLICY_1_ID); + doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock) + .delete(eq(URL_PREFIX + URL_DELETE_POLICY), eq(uriVariables)); + + ResponseEntity returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID); + + verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables); + assertTrue(returnedResp.getBody().contains("Exception")); + assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); + } + + @Test + public void testDeletePolicySuccess() { + Map uriVariables = Map.of("instance", POLICY_1_ID); + + ResponseEntity returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID); + + verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables); + assertNull(returnedResp.getBody()); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testGetRicsSupportingTypeValidJson() { + String rics = Arrays.asList(RIC_1_INFO_VALID).toString(); + String ricsJson = parseRicsJson(rics); + Map uriVariables = Map.of("typeName", POLICY_TYPE_1_ID); + when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables))) + .thenReturn(rics); + + ResponseEntity returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID); + + verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables); + assertEquals(returnedResp.getBody(), ricsJson); + assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); + } + + @Test + public void testGetRicsSupportingTypeInvalidJson() { + String rics = Arrays.asList(RIC_1_INFO_INVALID).toString(); + Map uriVariables = Map.of("typeName", POLICY_TYPE_1_ID); + when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables))) + .thenReturn(rics); + + ResponseEntity returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID); + + verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables); + assertTrue(returnedResp.getBody().contains("Exception")); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); + } + + private String parsePolicyTypesJson(String inputString) { + PolicyTypes policyTypes = new PolicyTypes(); + JsonArray schemas = JsonParser.parseString(inputString).getAsJsonArray(); + for (JsonElement schema : schemas) { + JsonObject schemaObj = schema.getAsJsonObject(); + policyTypes.add(new PolicyType(schemaObj.get("title").getAsString(), schemaObj.toString())); + } + return gson.toJson(policyTypes); + } + + private String parsePolicyInstancesJson(String inputString) { + Type listType = new TypeToken>() {}.getType(); + List rspParsed = gson.fromJson(inputString, listType); + PolicyInstances policyInstances = new PolicyInstances(); + for (PolicyInfo policy : rspParsed) { + policyInstances.add(policy); + } + return gson.toJson(policyInstances); + } + + private String parseRicsJson(String inputString) { + Type listType = new TypeToken>() {}.getType(); + List rspParsed = gson.fromJson(inputString, listType); + Collection rics = new ArrayList<>(rspParsed.size()); + for (RicInfo ric : rspParsed) { + rics.add(ric.ricName()); + } + return gson.toJson(rics); + } + + private HttpEntity createJsonHttpEntity(Object content) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + return new HttpEntity<>(content, headers); + } +} diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java new file mode 100644 index 0000000..cdb78f1 --- /dev/null +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java @@ -0,0 +1,95 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +package org.oransc.portal.nonrtric.controlpanel.portalapi; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.InvocationTargetException; + +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthManager; +import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthenticationFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ActiveProfiles("test") +public class PortalAuthManagerTest { + + @Value("${portalapi.decryptor}") + private String decryptor; + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @Test + public void testPortalStuff() throws ClassNotFoundException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchMethodException, IOException, ServletException { + + PortalAuthManager m = new PortalAuthManager("app", "user", "secret", decryptor, "cookie"); + Assert.assertNotNull(m.getAppCredentials()); + String s = null; + + MockHttpServletRequest request = new MockHttpServletRequest(); + s = m.validateEcompSso(request); + logger.debug("validateEcompSso answers {}", s); + Assert.assertNull(s); + + Cookie cookie = new Cookie(PortalApiConstants.EP_SERVICE, "bogus"); + request.setCookies(cookie); + s = m.validateEcompSso(request); + logger.debug("validateEcompSso answers {}", s); + Assert.assertNull(s); + + ControlpanelUserManager dum = new ControlpanelUserManager(true); + PortalAuthenticationFilter filter = new PortalAuthenticationFilter(false, m, dum); + filter.init(null); + filter.destroy(); + MockHttpServletResponse response = new MockHttpServletResponse(); + try { + filter.doFilter(request, response, null); + } catch (NullPointerException ex) { + logger.debug("chain is null"); + } + + filter = new PortalAuthenticationFilter(true, m, dum); + try { + filter.doFilter(request, response, null); + } catch (NullPointerException ex) { + logger.debug("chain is null"); + } + } + +} diff --git a/webapp-backend/src/test/resources/caas-ingress-ricaux-pods.json b/webapp-backend/src/test/resources/caas-ingress-ricaux-pods.json new file mode 100644 index 0000000..216b7db --- /dev/null +++ b/webapp-backend/src/test/resources/caas-ingress-ricaux-pods.json @@ -0,0 +1,9 @@ +{ + "kind": "PodList", + "apiVersion": "v1", + "metadata": { + "selfLink": "/api/v1/namespaces/ricaux/pods", + "resourceVersion": "1594484" + }, + "items": [] +} diff --git a/webapp-backend/src/test/resources/caas-ingress-ricplt-pods.json b/webapp-backend/src/test/resources/caas-ingress-ricplt-pods.json new file mode 100644 index 0000000..cf9c1a0 --- /dev/null +++ b/webapp-backend/src/test/resources/caas-ingress-ricplt-pods.json @@ -0,0 +1,1847 @@ +{ + "kind": "PodList", + "apiVersion": "v1", + "metadata": { + "selfLink": "/api/v1/namespaces/ricplt/pods", + "resourceVersion": "3189380" + }, + "items": [ + { + "metadata": { + "name": "deployment-ricplt-a1mediator-74d9fc4c8c-77vtp", + "generateName": "deployment-ricplt-a1mediator-74d9fc4c8c-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-a1mediator-74d9fc4c8c-77vtp", + "uid": "487c582d-36d6-406a-92a3-bfbce04b83de", + "resourceVersion": "2945631", + "creationTimestamp": "2019-10-18T16:15:04Z", + "labels": { + "app": "ricplt-a1mediator", + "group": "nagios", + "pod-template-hash": "74d9fc4c8c", + "release": "r1-a1mediator" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-a1mediator-74d9fc4c8c", + "uid": "84ef8695-3eb2-4dcd-b214-9d00ab5fb6b3", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "a1conf", + "configMap": { + "name": "configmap-ricplt-a1mediator-a1conf", + "defaultMode": 420 + } + }, + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-a1mediator", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-a1:0.10.3", + "ports": [ + { + "name": "http", + "containerPort": 10000, + "protocol": "TCP" + }, + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 4562, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-a1mediator-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "a1conf", + "mountPath": "/opt/ricmanifest.json", + "subPath": "ricmanifest.json" + }, + { + "name": "a1conf", + "mountPath": "/opt/rmr_string_int_mapping.txt", + "subPath": "rmr_string_int_mapping.txt" + }, + { + "name": "a1conf", + "mountPath": "/opt/route/local.rt", + "subPath": "local.rt" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "livenessProbe": { + "httpGet": { + "path": "/a1-p/healthcheck", + "port": "http", + "scheme": "HTTP" + }, + "timeoutSeconds": 1, + "periodSeconds": 10, + "successThreshold": 1, + "failureThreshold": 3 + }, + "readinessProbe": { + "httpGet": { + "path": "/a1-p/healthcheck", + "port": "http", + "scheme": "HTTP" + }, + "timeoutSeconds": 1, + "periodSeconds": 10, + "successThreshold": 1, + "failureThreshold": 3 + }, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.202", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "a1mediator", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:04Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:09Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:09Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:04Z" + } + ], + "hostIP": "172.29.16.202", + "podIP": "10.244.4.71", + "podIPs": [ + { + "ip": "10.244.4.71" + } + ], + "startTime": "2019-10-18T16:15:04Z", + "containerStatuses": [ + { + "name": "container-ricplt-a1mediator", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:05Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-a1:0.10.3", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-a1@sha256:64a61ed84d4d05dfa1690bb45949da333d7b088e2e12dbba0ce60c06445f52cb", + "containerID": "docker://07ceed10ee2a4413c167951e458b59a505a073cce82ac543146e58b698489d59", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-appmgr-6ccf55b98b-kbkt4", + "generateName": "deployment-ricplt-appmgr-6ccf55b98b-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-appmgr-6ccf55b98b-kbkt4", + "uid": "4e084e8a-eb0a-4ea2-9cc1-7f812cd6bb28", + "resourceVersion": "2945633", + "creationTimestamp": "2019-10-18T16:15:01Z", + "labels": { + "app": "ricplt-appmgr", + "group": "nagios", + "pod-template-hash": "6ccf55b98b", + "release": "r1-appmgr" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-appmgr-6ccf55b98b", + "uid": "a169ebc4-9b7c-4b8d-81ed-6364e07df24e", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "config-volume", + "configMap": { + "name": "configmap-ricplt-appmgr-appconfig", + "defaultMode": 420 + } + }, + { + "name": "cert-volume", + "configMap": { + "name": "xapp-mgr-certs", + "defaultMode": 420 + } + }, + { + "name": "secret-volume", + "secret": { + "secretName": "xapp-mgr-creds", + "defaultMode": 420 + } + }, + { + "name": "helm-secret-volume", + "emptyDir": { + + } + }, + { + "name": "appmgr-bin-volume", + "configMap": { + "name": "configmap-ricplt-appmgr-bin", + "defaultMode": 493 + } + }, + { + "name": "svcacct-ricplt-appmgr-token-kclzw", + "secret": { + "secretName": "svcacct-ricplt-appmgr-token-kclzw", + "defaultMode": 420 + } + } + ], + "initContainers": [ + { + "name": "container-ricplt-appmgr-copy-tiller-secret", + "image": "registry.kube-system.svc.rec.io:5555/ric/it-dep-init:0.0.1", + "command": [ + "/appmgr-tiller-secret-copier.sh" + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-appmgr-env" + } + } + ], + "env": [ + { + "name": "SVCACCT_NAME", + "value": "svcacct-ricplt-appmgr" + }, + { + "name": "CLUSTER_NAME", + "value": "kubernetes" + }, + { + "name": "KUBECONFIG", + "value": "/tmp/kubeconfig" + }, + { + "name": "K8S_API_HOST", + "value": "https://10.254.0.1:443" + }, + { + "name": "SECRET_NAMESPACE", + "value": "ricinfra" + }, + { + "name": "SECRET_NAME", + "value": "secret-helm-client-ricxapp" + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "helm-secret-volume", + "mountPath": "/opt/ric/secret" + }, + { + "name": "appmgr-bin-volume", + "mountPath": "/svcacct-to-kubeconfig.sh", + "subPath": "svcacct-to-kubeconfig.sh" + }, + { + "name": "appmgr-bin-volume", + "mountPath": "/appmgr-tiller-secret-copier.sh", + "subPath": "appmgr-tiller-secret-copier.sh" + }, + { + "name": "svcacct-ricplt-appmgr-token-kclzw", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "IfNotPresent" + } + ], + "containers": [ + { + "name": "container-ricplt-appmgr", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-appmgr:0.1.9", + "ports": [ + { + "name": "http", + "containerPort": 8080, + "protocol": "TCP" + }, + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 4560, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-appmgr-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/opt/ric/config/appmgr.yaml", + "subPath": "appmgr.yaml" + }, + { + "name": "cert-volume", + "mountPath": "/opt/ric/certificates" + }, + { + "name": "helm-secret-volume", + "mountPath": "/opt/ric/secret" + }, + { + "name": "secret-volume", + "mountPath": "/opt/ric/secret/helm_repo_username", + "subPath": "helm_repo_username" + }, + { + "name": "secret-volume", + "mountPath": "/opt/ric/secret/helm_repo_password", + "subPath": "helm_repo_password" + }, + { + "name": "svcacct-ricplt-appmgr-token-kclzw", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "svcacct-ricplt-appmgr", + "serviceAccount": "svcacct-ricplt-appmgr", + "nodeName": "172.29.16.203", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "appmgr", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:03Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:04Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:04Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:01Z" + } + ], + "hostIP": "172.29.16.203", + "podIP": "10.244.3.252", + "podIPs": [ + { + "ip": "10.244.3.252" + } + ], + "startTime": "2019-10-18T16:15:01Z", + "initContainerStatuses": [ + { + "name": "container-ricplt-appmgr-copy-tiller-secret", + "state": { + "terminated": { + "exitCode": 0, + "reason": "Completed", + "startedAt": "2019-10-18T16:15:02Z", + "finishedAt": "2019-10-18T16:15:02Z", + "containerID": "docker://130db0adfad526204726bf11fe24741d94f11f39f97f0d826b066ec852e5a452" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/it-dep-init:0.0.1", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/it-dep-init@sha256:d3a2c02660a0b5da5a7e38626c49018ca7f5e3bc39106b0728ff72245cd20be5", + "containerID": "docker://130db0adfad526204726bf11fe24741d94f11f39f97f0d826b066ec852e5a452" + } + ], + "containerStatuses": [ + { + "name": "container-ricplt-appmgr", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:03Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-appmgr:0.1.9", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-appmgr@sha256:5c076f702d570b385d10200cda8d504475ce44eb1bcbb131b1d50e00eabae4d7", + "containerID": "docker://791f455c1974a100aaa09ab0a290e438d75aa1c3aadcb717c42d53e02cdedb83", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-dbaas-d4c9f7b88-7wgb9", + "generateName": "deployment-ricplt-dbaas-d4c9f7b88-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-dbaas-d4c9f7b88-7wgb9", + "uid": "e54e51fc-c4bd-4308-805e-16c2d588dacd", + "resourceVersion": "2945634", + "creationTimestamp": "2019-10-18T16:15:01Z", + "labels": { + "app": "ricplt-dbaas", + "group": "nagios", + "pod-template-hash": "d4c9f7b88", + "release": "r1-dbaas" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-dbaas-d4c9f7b88", + "uid": "7e8d5d34-efa9-41fe-b92f-d9b71bc40360", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-dbaas", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-dbaas:0.1.0", + "ports": [ + { + "name": "sql", + "containerPort": 6379, + "protocol": "TCP" + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 0, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.202", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:01Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:03Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:03Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:01Z" + } + ], + "hostIP": "172.29.16.202", + "podIP": "10.244.4.70", + "podIPs": [ + { + "ip": "10.244.4.70" + } + ], + "startTime": "2019-10-18T16:15:01Z", + "containerStatuses": [ + { + "name": "container-ricplt-dbaas", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:02Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-dbaas:0.1.0", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-dbaas@sha256:f63cfa353f355155ec6455a68d18c631900a2602bf7cc2ba35d6210971736b76", + "containerID": "docker://8972d8b61d5c3ff56b50814575647d70fb3307602506cda3e34b6734c28a3f36", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-e2mgr-86c76477c5-mf5t5", + "generateName": "deployment-ricplt-e2mgr-86c76477c5-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-e2mgr-86c76477c5-mf5t5", + "uid": "5f2231ea-bec0-46fc-a8f8-09b0b80e982f", + "resourceVersion": "2945636", + "creationTimestamp": "2019-10-18T16:15:02Z", + "labels": { + "app": "ricplt-e2mgr", + "group": "nagios", + "pod-template-hash": "86c76477c5", + "release": "r1-e2mgr" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-e2mgr-86c76477c5", + "uid": "f7dfd4a3-4eb3-4c46-a6c8-adc4ae37ef57", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "local-router-file", + "configMap": { + "name": "configmap-ricplt-e2mgr-router-configmap", + "defaultMode": 420 + } + }, + { + "name": "local-configuration-file", + "configMap": { + "name": "configmap-ricplt-e2mgr-configuration-configmap", + "defaultMode": 420 + } + }, + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-e2mgr", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-e2mgr:2.0.7", + "ports": [ + { + "name": "http", + "containerPort": 3800, + "protocol": "TCP" + }, + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 3801, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-e2mgr-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "local-router-file", + "mountPath": "/opt/E2Manager/router.txt", + "subPath": "router.txt" + }, + { + "name": "local-configuration-file", + "mountPath": "/opt/E2Manager/resources/configuration.yaml", + "subPath": "configuration.yaml" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": false + }, + "stdin": true, + "tty": true + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.204", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "e2mgr", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:02Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:05Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:05Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:02Z" + } + ], + "hostIP": "172.29.16.204", + "podIP": "10.244.2.100", + "podIPs": [ + { + "ip": "10.244.2.100" + } + ], + "startTime": "2019-10-18T16:15:02Z", + "containerStatuses": [ + { + "name": "container-ricplt-e2mgr", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:04Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-e2mgr:2.0.7", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-e2mgr@sha256:87fa19a934215bdec71a355ef08eec9e273c992bab80af727f4f1b7a74ebacfa", + "containerID": "docker://ff3a2fcfc72b00e3c317899f2b620da2f65e3de260623daed7825f6a74dbcb5c", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-e2term-5dcf8b54b-5mkxl", + "generateName": "deployment-ricplt-e2term-5dcf8b54b-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-e2term-5dcf8b54b-5mkxl", + "uid": "8fae1dcd-5e42-4a66-be6f-e893d5563689", + "resourceVersion": "2945639", + "creationTimestamp": "2019-10-18T16:15:03Z", + "labels": { + "app": "ricplt-e2term", + "group": "nagios", + "pod-template-hash": "5dcf8b54b", + "release": "r1-e2term" + }, + "annotations": { + "danm.k8s.io/interfaces": "[\n {\"clusterNetwork\":\"default\", \"ip\":\"dynamic\"},\n {\"clusterNetwork\":\"ran\", \"ip\":\"dynamic\", \"ip6\":\"dynamic\"}\n]\n", + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-e2term-5dcf8b54b", + "uid": "cc20b8a0-6d74-4fb9-b384-bdce9c9ae184", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "local-router-file", + "configMap": { + "name": "configmap-ricplt-e2term-router-configmap", + "defaultMode": 420 + } + }, + { + "name": "localtime", + "hostPath": { + "path": "/etc/localtime", + "type": "" + } + }, + { + "name": "pizpub-config", + "configMap": { + "name": "configmap-ricplt-e2term-pizpub", + "defaultMode": 420 + } + }, + { + "name": "vol-shared", + "persistentVolumeClaim": { + "claimName": "pvc-ricplt-e2term" + } + }, + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-e2term", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-e2:2.0.7.5", + "ports": [ + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 38000, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-e2term-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "local-router-file", + "mountPath": "/opt/e2/router.txt", + "subPath": "router.txt" + }, + { + "name": "local-router-file", + "mountPath": "/tmp/rmr_verbose", + "subPath": "rmr_verbose" + }, + { + "name": "vol-shared", + "mountPath": "/data/outgoing/", + "subPath": "outgoing" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": false + }, + "stdin": true, + "tty": true + }, + { + "name": "container-ricplt-e2term-pizpub", + "image": "registry.kube-system.svc.rec.io:5555/ric/pizpub:0.0.5155", + "resources": { + + }, + "volumeMounts": [ + { + "name": "localtime", + "readOnly": true, + "mountPath": "/etc/localtime" + }, + { + "name": "vol-shared", + "mountPath": "/data" + }, + { + "name": "pizpub-config", + "mountPath": "/opt/app/config/conf/" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "lifecycle": { + "postStart": { + "exec": { + "command": [ + "/bin/sh", + "/opt/app/config/conf/cleaner.sh", + "/data/sent", + "3" + ] + } + } + }, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirstWithHostNet", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.201", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "e2term", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:22Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:33Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:33Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:22Z" + } + ], + "hostIP": "172.29.16.201", + "podIP": "10.244.1.90", + "podIPs": [ + { + "ip": "10.244.1.90" + } + ], + "startTime": "2019-10-18T16:15:22Z", + "containerStatuses": [ + { + "name": "container-ricplt-e2term", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:31Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "ranco-dev-tools.eastus.cloudapp.azure.com:10001/ric-plt-e2:2.0.7.5", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-e2@sha256:0ea1a356d018495a93e124ddd793e09626bf6e4d9b96355e731673ef7fab5a1f", + "containerID": "docker://bf9ca87dbad9436b0ed99ffe38036fb49033a9bc2cf2eb548397fbc9c48f1c3d", + "started": true + }, + { + "name": "container-ricplt-e2term-pizpub", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:32Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "ranco-dev-tools.eastus.cloudapp.azure.com:10001/pizpub:0.0.5155", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/pizpub@sha256:138c2d2d25e6528c4a5a8a402c277722d1c1fd4d6792b644967acd538affb1ed", + "containerID": "docker://93e39661623b7afc8156008bb6fbc206458964a6eb0633f80164e4c7ef59fe76", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-jaegeradapter-6ff8676c7-m4qkf", + "generateName": "deployment-ricplt-jaegeradapter-6ff8676c7-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-jaegeradapter-6ff8676c7-m4qkf", + "uid": "d6a5e9e9-87d0-4d1e-b1b7-cc1a4f20dc2e", + "resourceVersion": "2945640", + "creationTimestamp": "2019-10-18T16:15:08Z", + "labels": { + "app": "ricplt-jaegeradapter", + "group": "nagios", + "pod-template-hash": "6ff8676c7", + "release": "r1-jaegeradapter" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-jaegeradapter-6ff8676c7", + "uid": "98bc03d7-a082-4ac1-9b89-064022a37dff", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-jaegeradapter", + "image": "registry.kube-system.svc.rec.io:5555/ric/all-in-one:1.12", + "ports": [ + { + "name": "zipkincompact", + "containerPort": 5775, + "protocol": "UDP" + }, + { + "name": "jaegercompact", + "containerPort": 6831, + "protocol": "UDP" + }, + { + "name": "jaegerbinary", + "containerPort": 6832, + "protocol": "UDP" + }, + { + "name": "httpquery", + "containerPort": 16686, + "protocol": "TCP" + }, + { + "name": "httpconfig", + "containerPort": 5778, + "protocol": "TCP" + }, + { + "name": "zipkinhttp", + "containerPort": 9411, + "protocol": "TCP" + }, + { + "name": "jaegerhttp", + "containerPort": 14268, + "protocol": "TCP" + }, + { + "name": "jaegerhttpt", + "containerPort": 14267, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-jaegeradapter" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "livenessProbe": { + "httpGet": { + "path": "/", + "port": 16686, + "scheme": "HTTP" + }, + "timeoutSeconds": 1, + "periodSeconds": 10, + "successThreshold": 1, + "failureThreshold": 3 + }, + "readinessProbe": { + "httpGet": { + "path": "/", + "port": 16686, + "scheme": "HTTP" + }, + "timeoutSeconds": 1, + "periodSeconds": 10, + "successThreshold": 1, + "failureThreshold": 3 + }, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.203", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "jaegeradapter", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:08Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:15Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:15Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:08Z" + } + ], + "hostIP": "172.29.16.203", + "podIP": "10.244.3.254", + "podIPs": [ + { + "ip": "10.244.3.254" + } + ], + "startTime": "2019-10-18T16:15:08Z", + "containerStatuses": [ + { + "name": "container-ricplt-jaegeradapter", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:09Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/all-in-one:1.12", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/all-in-one@sha256:51b901b653f4a4ca5dd50be9133c08dacf2d3eb092e507c213e7955a0e132297", + "containerID": "docker://95013a49a1705a503f5f7dde7a38fa7277523a73cdef96d264fcefe170e8a921", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-rsm-88477585f-qkkj7", + "generateName": "deployment-ricplt-rsm-88477585f-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-rsm-88477585f-qkkj7", + "uid": "d4c58ff4-743e-4ed6-bd36-aeb02daa1ca6", + "resourceVersion": "2945642", + "creationTimestamp": "2019-10-18T16:15:07Z", + "labels": { + "app": "ricplt-rsm", + "group": "nagios", + "pod-template-hash": "88477585f", + "release": "r1-rsm" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-rsm-88477585f", + "uid": "1fe7de57-90d9-4898-9b71-1ae9c4a6f014", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "local-router-file", + "configMap": { + "name": "configmap-ricplt-rsm-router-configmap", + "defaultMode": 420 + } + }, + { + "name": "local-configuration-file", + "configMap": { + "name": "configmap-ricplt-rsm", + "defaultMode": 420 + } + }, + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-rsm", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-rsm:2.0.7", + "ports": [ + { + "name": "http", + "containerPort": 4800, + "protocol": "TCP" + }, + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 4801, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-rsm-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "local-router-file", + "mountPath": "/opt/RSM/router.txt", + "subPath": "router.txt" + }, + { + "name": "local-configuration-file", + "mountPath": "/opt/RSM/resources/configuration.yaml", + "subPath": "configuration.yaml" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": false + }, + "stdin": true, + "tty": true + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.203", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "rsm", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:07Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:09Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:09Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:07Z" + } + ], + "hostIP": "172.29.16.203", + "podIP": "10.244.3.253", + "podIPs": [ + { + "ip": "10.244.3.253" + } + ], + "startTime": "2019-10-18T16:15:07Z", + "containerStatuses": [ + { + "name": "container-ricplt-rsm", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:08Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-rsm:2.0.7", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-rsm@sha256:e6fb3bc17fcd5a2fbc7d34eeb744fbfed4eaaaf6c669e084b379ee05368820d3", + "containerID": "docker://5e90673a6b2c292f2ce7c731bf8747c8a63f429eca08d08a993130001c7d6f5e", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-submgr-7549b87fb8-4t6mx", + "generateName": "deployment-ricplt-submgr-7549b87fb8-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-submgr-7549b87fb8-4t6mx", + "uid": "c6fbd48b-2757-421c-a534-f1931b04312b", + "resourceVersion": "2945646", + "creationTimestamp": "2019-10-18T16:15:05Z", + "labels": { + "app": "ricplt-submgr", + "group": "nagios", + "pod-template-hash": "7549b87fb8", + "release": "r1-submgr" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-submgr-7549b87fb8", + "uid": "e2b9dd9f-cca4-4f64-9e11-b6ee174c4f6f", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "config-volume", + "configMap": { + "name": "submgrcfg", + "items": [ + { + "key": "submgrcfg", + "path": "submgr-config.yaml", + "mode": 420 + } + ], + "defaultMode": 420 + } + }, + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-submgr", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-submgr:0.10.5", + "command": [ + "/run_submgr.sh" + ], + "ports": [ + { + "name": "http", + "containerPort": 3800, + "protocol": "TCP" + }, + { + "name": "rmrroute", + "containerPort": 4561, + "protocol": "TCP" + }, + { + "name": "rmrdata", + "containerPort": 4560, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-submgr-env" + } + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/cfg" + }, + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.205", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "submgr", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:05Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:07Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:07Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:05Z" + } + ], + "hostIP": "172.29.16.205", + "podIP": "10.244.0.168", + "podIPs": [ + { + "ip": "10.244.0.168" + } + ], + "startTime": "2019-10-18T16:15:05Z", + "containerStatuses": [ + { + "name": "container-ricplt-submgr", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:07Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-submgr:0.10.5", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-submgr@sha256:aa8ada253d0800a849b6124fc54793815caaf93ad46b8d47cdd1f590ef69f813", + "containerID": "docker://724ba7834ef80d1f3c85ae7990ead480ed5226f0275816bae358edc9ddf54da6", + "started": true + } + ], + "qosClass": "BestEffort" + } + }, + { + "metadata": { + "name": "deployment-ricplt-vespamgr-55f6484b7-g5zfw", + "generateName": "deployment-ricplt-vespamgr-55f6484b7-", + "namespace": "ricplt", + "selfLink": "/api/v1/namespaces/ricplt/pods/deployment-ricplt-vespamgr-55f6484b7-g5zfw", + "uid": "a7ae0f4a-adfa-48c6-8c41-725ba1c84b11", + "resourceVersion": "2945649", + "creationTimestamp": "2019-10-18T16:15:06Z", + "labels": { + "app": "ricplt-vespamgr", + "group": "nagios", + "pod-template-hash": "55f6484b7", + "release": "r1-vespamgr" + }, + "annotations": { + "kubernetes.io/psp": "caas-default" + }, + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "deployment-ricplt-vespamgr-55f6484b7", + "uid": "dc5e0e81-23da-4fed-99da-14cb7a8fe06c", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "volumes": [ + { + "name": "default-token-5j24g", + "secret": { + "secretName": "default-token-5j24g", + "defaultMode": 420 + } + } + ], + "containers": [ + { + "name": "container-ricplt-vespamgr", + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-vespamgr:0.0.5", + "ports": [ + { + "name": "http", + "containerPort": 8080, + "protocol": "TCP" + } + ], + "envFrom": [ + { + "configMapRef": { + "name": "configmap-ricplt-vespamgr" + } + }, + { + "secretRef": { + "name": "vespa-secrets" + } + } + ], + "env": [ + { + "name": "VESMGR_APPMGRDOMAIN", + "value": "appmgr-service" + } + ], + "resources": { + + }, + "volumeMounts": [ + { + "name": "default-token-5j24g", + "readOnly": true, + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" + } + ], + "livenessProbe": { + "httpGet": { + "path": "/supervision", + "port": 8080, + "scheme": "HTTP" + }, + "initialDelaySeconds": 30, + "timeoutSeconds": 20, + "periodSeconds": 60, + "successThreshold": 1, + "failureThreshold": 3 + }, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "imagePullPolicy": "Always" + } + ], + "restartPolicy": "Always", + "terminationGracePeriodSeconds": 30, + "dnsPolicy": "ClusterFirst", + "serviceAccountName": "default", + "serviceAccount": "default", + "nodeName": "172.29.16.204", + "securityContext": { + + }, + "imagePullSecrets": [ + { + "name": "docker-reg-cred" + } + ], + "hostname": "vespamgr", + "schedulerName": "default-scheduler", + "enableServiceLinks": true + }, + "status": { + "phase": "Running", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:06Z" + }, + { + "type": "Ready", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:08Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:08Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastProbeTime": null, + "lastTransitionTime": "2019-10-18T16:15:06Z" + } + ], + "hostIP": "172.29.16.204", + "podIP": "10.244.2.101", + "podIPs": [ + { + "ip": "10.244.2.101" + } + ], + "startTime": "2019-10-18T16:15:06Z", + "containerStatuses": [ + { + "name": "container-ricplt-vespamgr", + "state": { + "running": { + "startedAt": "2019-10-18T16:15:08Z" + } + }, + "lastState": { + + }, + "ready": true, + "restartCount": 0, + "image": "registry.kube-system.svc.rec.io:5555/ric/ric-plt-vespamgr:0.0.5", + "imageID": "docker-pullable://registry.kube-system.svc.rec.io:5555/ric/ric-plt-vespamgr@sha256:97753ef72471a5fddd59ff35a2fe763b041848f6e83214acb78ad73c7316b371", + "containerID": "docker://80884c969cbf802945c075afc47d747b5e747e4645c691d376820c9d61094e7c", + "started": true + } + ], + "qosClass": "BestEffort" + } + } + ] +} \ No newline at end of file diff --git a/webapp-backend/src/test/resources/demo-policy-schema-1.json b/webapp-backend/src/test/resources/demo-policy-schema-1.json new file mode 100644 index 0000000..fa7410f --- /dev/null +++ b/webapp-backend/src/test/resources/demo-policy-schema-1.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Example_QoSTarget_1.0.0", + "description": "Example QoS Target policy type", + "type": "object", + "properties": { + "scope": { + "type": "object", + "properties": { + "qosId": { + "type": "string" + }, + "cellId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "qosId" + ] + }, + "statement": { + "type": "object", + "properties": { + "gfbr": { + "type": "number" + }, + "mfbr": { + "type": "number" + }, + "priorityLevel": { + "type": "number" + }, + "pdb": { + "type": "number" + } + }, + "minProperties": 1, + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/webapp-backend/src/test/resources/demo-policy-schema-2.json b/webapp-backend/src/test/resources/demo-policy-schema-2.json new file mode 100644 index 0000000..f3eb28f --- /dev/null +++ b/webapp-backend/src/test/resources/demo-policy-schema-2.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Example_QoETarget_1.0.0", + "description": "Example QoE Target policy type", + "type": "object", + "properties": { + "scope": { + "type": "object", + "properties": { + "ueId": { + "type": "string" + }, + "sliceId": { + "type": "string" + }, + "qosId": { + "type": "string" + }, + "cellId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "ueId", + "sliceId" + ] + }, + "statement": { + "type": "object", + "properties": { + "qoeScore": { + "type": "number" + }, + "initialBuffering": { + "type": "number" + }, + "reBuffFreq": { + "type": "number" + }, + "stallRatio": { + "type": "number" + } + }, + "minProperties": 1, + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/webapp-backend/src/test/resources/demo-policy-schema-3.json b/webapp-backend/src/test/resources/demo-policy-schema-3.json new file mode 100644 index 0000000..695514c --- /dev/null +++ b/webapp-backend/src/test/resources/demo-policy-schema-3.json @@ -0,0 +1,59 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Example_TrafficSteeringPreference_1.0.0", + "description": "Example QoE Target policy type", + "type": "object", + "properties": { + "scope": { + "type": "object", + "properties": { + "ueId": { + "type": "string" + }, + "sliceId": { + "type": "string" + }, + "qosId": { + "type": "string" + }, + "cellId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "ueId" + ] + }, + "statement": { + "type": "object", + "properties": { + "cellIdList": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "preference": { + "type": "string", + "enum": [ + "SHALL", + "PREFER", + "AVOID", + "FORBID" + ] + }, + "primary": { + "type": "boolean" + } + }, + "required": [ + "cellIdList", + "preference" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/webapp-backend/src/test/resources/key.properties b/webapp-backend/src/test/resources/key.properties new file mode 100644 index 0000000..c2cab7d --- /dev/null +++ b/webapp-backend/src/test/resources/key.properties @@ -0,0 +1,22 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Test properties for the EPSDK-FW library. +# This file must be present on the Java classpath. + +cipher.enc.key = bogus diff --git a/webapp-backend/src/test/resources/portal.properties b/webapp-backend/src/test/resources/portal.properties new file mode 100644 index 0000000..e01d9e6 --- /dev/null +++ b/webapp-backend/src/test/resources/portal.properties @@ -0,0 +1,26 @@ +# ========================LICENSE_START================================= +# O-RAN-SC +# %% +# Copyright (C) 2019 AT&T Intellectual Property +# %% +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================LICENSE_END=================================== + +# Test properties for the EPSDK-FW library. +# This file must be present on the Java classpath. + +portal.api.impl.class = org.oransc.portal.nonrtric.controlpanel.portalapi.PortalRestCentralServiceImpl +role_access_centralized = remote +ecomp_redirect_url = https://www.wikipedia.org +ecomp_rest_url = http://localhost/portal +ueb_app_key = abcdef1234567890 diff --git a/webapp-frontend/.gitignore b/webapp-frontend/.gitignore new file mode 100644 index 0000000..588ac10 --- /dev/null +++ b/webapp-frontend/.gitignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node +/node_modules + +/.classpath +/.externalToolBuilders +/.project +/.settings +/target/ +/.mvn/wrapper/maven-wrapper.jar +**/.vscode + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ diff --git a/webapp-frontend/README.md b/webapp-frontend/README.md new file mode 100644 index 0000000..311464a --- /dev/null +++ b/webapp-frontend/README.md @@ -0,0 +1,44 @@ +# NonRT RIC Controlpanel Web Application Frontend + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.3. + +## Development server + +Run `./ng serve --proxy-config proxy.conf.json` 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). + +## License + +Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. +Modifications Copyright (C) 2019 Nordix Foundation +Modifications Copyright (C) 2020 Nordix Foundation +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/webapp-frontend/angular.json b/webapp-frontend/angular.json new file mode 100644 index 0000000..be2d429 --- /dev/null +++ b/webapp-frontend/angular.json @@ -0,0 +1,150 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "controlpanelApp": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "rd", + "schematics": { + "@schematics/angular:component": { + "styleext": "scss" + } + }, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/controlpanelApp", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "node_modules/@fortawesome/fontawesome-free/scss/fontawesome.scss", + "node_modules/@fortawesome/fontawesome-free/scss/solid.scss", + "node_modules/@fortawesome/fontawesome-free/scss/regular.scss", + "node_modules/@fortawesome/fontawesome-free/scss/brands.scss", + "node_modules/angular-bootstrap-md/scss/bootstrap/bootstrap.scss", + "node_modules/angular-bootstrap-md/scss/mdb-free.scss", + "node_modules/material-design-icons/iconfont/material-icons.css", + "src/styles.scss", + "node_modules/ngx-toastr/toastr.css" + ], + "scripts": [ + "node_modules/chart.js/dist/Chart.js", + "node_modules/hammerjs/hammer.min.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "controlpanelApp:build" + }, + "configurations": { + "production": { + "browserTarget": "controlpanelApp:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "controlpanelApp:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.css" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "controlpanelApp-e2e": { + "root": "e2e/", + "projectType": "application", + "prefix": "", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "controlpanelApp:serve" + }, + "configurations": { + "production": { + "devServerTarget": "controlpanelApp:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "controlpanelApp" +} diff --git a/webapp-frontend/browserslist b/webapp-frontend/browserslist new file mode 100644 index 0000000..37371cb --- /dev/null +++ b/webapp-frontend/browserslist @@ -0,0 +1,11 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 \ No newline at end of file diff --git a/webapp-frontend/e2e/protractor.conf.js b/webapp-frontend/e2e/protractor.conf.js new file mode 100644 index 0000000..dc814ab --- /dev/null +++ b/webapp-frontend/e2e/protractor.conf.js @@ -0,0 +1,47 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +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.e2e.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/webapp-frontend/e2e/src/app.e2e-spec.ts b/webapp-frontend/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..e72cb6e --- /dev/null +++ b/webapp-frontend/e2e/src/app.e2e-spec.ts @@ -0,0 +1,42 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +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('Welcome to controlpanelApp!'); + }); + + 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, + })); + }); +}); diff --git a/webapp-frontend/e2e/src/app.po.ts b/webapp-frontend/e2e/src/app.po.ts new file mode 100644 index 0000000..7b1ccce --- /dev/null +++ b/webapp-frontend/e2e/src/app.po.ts @@ -0,0 +1,30 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/') as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/webapp-frontend/e2e/tsconfig.e2e.json b/webapp-frontend/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..a6dd622 --- /dev/null +++ b/webapp-frontend/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/webapp-frontend/ng b/webapp-frontend/ng new file mode 100644 index 0000000..a70d1b1 --- /dev/null +++ b/webapp-frontend/ng @@ -0,0 +1,27 @@ +#!/bin/sh +# +# The MIT License +# +# Copyright (c) 2010-2019 Google LLC. http://angular.io/license +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# +cd $(dirname $0) +PATH="$PWD/node/":"$PWD":$PATH +node_modules/@angular/cli/bin/ng "$@" diff --git a/webapp-frontend/npm b/webapp-frontend/npm new file mode 100644 index 0000000..7b88bce --- /dev/null +++ b/webapp-frontend/npm @@ -0,0 +1,27 @@ +#!/bin/sh +# +# The MIT License +# +# Copyright (c) 2010-2019 Google LLC. http://angular.io/license +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# +cd $(dirname $0) +PATH="$PWD/node/":$PATH +node "node/node_modules/npm/bin/npm-cli.js" "$@" diff --git a/webapp-frontend/package-lock.json b/webapp-frontend/package-lock.json new file mode 100644 index 0000000..75dfadd --- /dev/null +++ b/webapp-frontend/package-lock.json @@ -0,0 +1,13396 @@ +{ + "name": "dash-app", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.23.tgz", + "integrity": "sha512-BRDbnmdULrle2l7WFZHEW/OAwS8RRg08+jiNG3gEP0BxDN6QMNMKmWhxmX67pgq3e/xMvu2DH0z71mAPNtJDAw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.23", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.23.tgz", + "integrity": "sha512-hlaDMuScRbgdsH3Toyze5G5NhmJypWIPGcIt4CAcXAnVdSltrBPKzu5Psr+ACcDLH3TYtlMKBrkAG9xXS3it1g==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.23", + "@angular-devkit/build-optimizer": "0.803.23", + "@angular-devkit/build-webpack": "0.803.23", + "@angular-devkit/core": "8.3.23", + "@babel/core": "7.7.5", + "@babel/preset-env": "7.7.6", + "@ngtools/webpack": "8.3.23", + "ajv": "6.10.2", + "autoprefixer": "9.6.1", + "browserslist": "4.8.3", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30001019", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.1.1", + "core-js": "3.2.1", + "coverage-istanbul-loader": "2.0.3", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.3.9", + "terser-webpack-plugin": "1.4.3", + "tree-kill": "1.2.2", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.9.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "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" + } + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "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" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.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 + }, + "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 + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.23.tgz", + "integrity": "sha512-0MJAnGjpmE1hNrwDBi/7b9G1qyt2qN/wcZOj6QseZeWuoxIVXIWgdM6gBpJdgB7HI7vv4l4LpyFX9Doq+2r7Xg==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.23.tgz", + "integrity": "sha512-ttsvUpoMHAr84I3YQmr2Yyu1qPIjw3m+aYgeEh1cAN+Ck8/F/q+Z+nWsmcgIXEC2f8xN7uZWy4PIkCZR8YETOg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.23", + "@angular-devkit/core": "8.3.23", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.3.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.23.tgz", + "integrity": "sha512-y++LN6R/fu+obPUKEMDSKZ5FzeWN5rV0Z8vrdC+uF02VJLv/5QI/dUx3ROKFzJO3m2LU6EAuo5b/TLAPq4ving==", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "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" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "8.3.23", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.23.tgz", + "integrity": "sha512-O8i/vn6YfqbT0q7o4jsVOTnWE07T1tcvk2zJ4O/1ete2z+Z2aw1YtIddwXEGJNCDpeE0B7f2sUHoLOS4Jc4O9w==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.23", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.14.tgz", + "integrity": "sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA4HOMj0TTXKZ+Jzkg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.3.7.tgz", + "integrity": "sha512-xbXxhHHKGkVuW6K7pzPmvpJXIwpl0ykBnvA2g+/7Sgy5Pd35wCC+UtHD9RYczDM/mkygNxMQtagyCErwFnDtQA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.3.23", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.23.tgz", + "integrity": "sha512-umr5puS6j8elTIhhsjyb/psTmwL00oeBbsnnz5K3fkbWB2wgdMsJvLi9aR/oAyh2NlSA2ZzgB62I38VjoDR0yQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.23", + "@angular-devkit/core": "8.3.23", + "@angular-devkit/schematics": "8.3.23", + "@schematics/angular": "8.3.23", + "@schematics/update": "0.803.23", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "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 + }, + "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" + } + }, + "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 + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", + "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", + "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", + "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "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 + }, + "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" + } + }, + "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 + }, + "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 + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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 + }, + "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": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", + "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "7.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-7.0.0-beta.24.tgz", + "integrity": "sha512-ll6sK0nLGxqI/f5+z4jbd+pve1QITzgehv2AuGvfSDgIjPMeqUDB5YZqQmIGM/dQRk/vIio5KCW5LQPJWzMMYQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.14.tgz", + "integrity": "sha512-zhyKL3CFIqcyHJ/TQF/h1OZztK611a6rxuPHCrt/5Sn1SuBTJJQ1pPTkOYIDy6IrCrtyANc8qB6P17Mao71DNQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", + "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "dev": true + }, + "@angular/material": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.2.2.tgz", + "integrity": "sha512-HTtDhK5XkDvP6GPg4WTTa0HbeeagTfVRooTfw0TA+IuTAMBhXt5h1yzuGpFyMap8/PUVZN1D04g2CLhBSzoDxg==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.14.tgz", + "integrity": "sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz", + "integrity": "sha512-mO2JPR5kLU/A3AQngy9+R/Q5gaF9csMStBQjwsCRI0wNtlItOIGL6+wTYpiTuh/ux+WVN1F2sLcEYU4Zf1ud9A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz", + "integrity": "sha512-DHA2BhODqV7F0g6ZKgFaZgbsqzHHWRcfWchCOrOVKu2rYiKUTwwHVLBgZAhrpNeinq2pWanVYSIhMr7wy+LfEA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", + "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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 + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "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.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@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/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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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 + } + } + }, + "@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" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + }, + "dependencies": { + "@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/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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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 + } + } + }, + "@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" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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-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" + }, + "dependencies": { + "@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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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 + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@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" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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/helpers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", + "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@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/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "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-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-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-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-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.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "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.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + }, + "dependencies": { + "@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/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-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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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 + } + } + }, + "@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.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", + "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", + "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" + }, + "dependencies": { + "@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/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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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 + } + } + }, + "@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.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", + "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", + "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" + }, + "dependencies": { + "@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/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", + "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", + "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.7.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.6.tgz", + "integrity": "sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.4.7", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@fortawesome/fontawesome-free": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.0.tgz", + "integrity": "sha512-vKDJUuE2GAdBERaQWmmtsciAMzjwNrROXA5KTGSZvayAsmuTGjam5z6QNqNPCwDfVljLWuov1nEC3mEQf/n6fQ==" + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@kubernetes/client-node": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.10.3.tgz", + "integrity": "sha512-mw+1zdKfMW4QN2ns82SKFhAvqC4SVUAiItto4oFg3Me+a510h3h9N5O7ad6m4efAmlQBlMc6Y5FHz70dAwuiMg==", + "requires": { + "@types/js-yaml": "^3.12.1", + "@types/node": "^10.12.0", + "@types/request": "^2.47.1", + "@types/underscore": "^1.8.9", + "@types/ws": "^6.0.1", + "byline": "^5.0.0", + "execa": "1.0.0", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.13.1", + "jsonpath-plus": "^0.19.0", + "openid-client": "2.5.0", + "request": "^2.88.0", + "shelljs": "^0.8.2", + "tslib": "^1.9.3", + "underscore": "^1.9.1", + "ws": "^6.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.14.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.21.tgz", + "integrity": "sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "@material/animation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-1.0.0.tgz", + "integrity": "sha512-Ed5/vggn6ZhSJ87yn3ZS1d826VJNFz73jHF2bSsgRtHDoB8KCuOwQMfdgAgDa4lKDF6CDIPCKBZPKrs2ubehdw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-1.0.0.tgz", + "integrity": "sha512-5dxFp46x5FA+Epg6YHLzN+5zRt9S2wR84UdvVAEJ1egea94m9UHUg7y9tAnNSN16aexRSywmzyLwPr+i8PGEYA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-1.1.0.tgz", + "integrity": "sha512-+HWW38ZaM2UBPu4+7QCusLDSf4tFT31rsEXHkTkxYSg/QpDivfPx6YDz4OmYtafmhPR1d1YjqB3MYysUHdodyw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-0.44.1.tgz", + "integrity": "sha512-90cc7njn4aHbH9UxY8qgZth1W5JgOgcEdWdubH1t7sFkwqFxS5g3zgxSBt46TygFBVIXNZNq35Xmg80wgqO7Pg==" + }, + "@material/radio": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-2.3.0.tgz", + "integrity": "sha512-l22cFvA/cZj/tsyDJVk1xayXGUTFFXp8yFe4SuGRW00/hNgGNF44rOSjN5H41iPU3oD1AreQL8r43fWW4eMH8w==", + "requires": { + "@material/animation": "^1.0.0", + "@material/base": "^1.0.0", + "@material/feature-targeting": "^0.44.1", + "@material/ripple": "^2.3.0", + "@material/theme": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "@material/ripple": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-2.3.0.tgz", + "integrity": "sha512-ejXR0nstERofFhssRyFlwOLgebwm2uGbarHtWZ2/+7QY2Th/Z1wOqNb2h/WRoShsJXK11RUsochb6BJrg30u7w==", + "requires": { + "@material/animation": "^1.0.0", + "@material/base": "^1.0.0", + "@material/dom": "^1.1.0", + "@material/feature-targeting": "^0.44.1", + "@material/theme": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-1.1.0.tgz", + "integrity": "sha512-YYUV9Rhbx4r/EMb/zoOYJUWjhXChNaLlH1rqt3vpNVyxRcxGqoVMGp5u1XALBCFiD9dACPKLIkKyRYa928nmPQ==", + "requires": { + "@material/feature-targeting": "^0.44.1" + } + }, + "@ngtools/webpack": { + "version": "8.3.23", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.23.tgz", + "integrity": "sha512-+XekeThky6+Upped3hOwjHwYTsXJiDuCA5ZZLmGHkTxGzjB4ZHSlBaj75yTS+s+/Ab1WgdRo2P2BxOUS7oogtw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.23", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.2", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@nguniversal/express-engine": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-8.2.6.tgz", + "integrity": "sha512-IKUKTpesgjYyB0Xg+fFhSbwbGBJhG0Wfn8MkQAi9RgSi8QsrSMkI3oUXc86Z7fpQL55D/ZIH7PekoC0Fmh/kxA==", + "dev": true + }, + "@schematics/angular": { + "version": "8.3.23", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.23.tgz", + "integrity": "sha512-yisP1iCLGC4VnZNC3kOnYyTS5cmfKEnLM9bMzhZGMWwov9RRfdxKKeSnG9FJNwHxI0WjQ0UWwfiz1dj0YacG3g==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.23", + "@angular-devkit/schematics": "8.3.23" + } + }, + "@schematics/update": { + "version": "0.803.23", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.23.tgz", + "integrity": "sha512-pLd5PseFTYF3VZ+IgMeNEFATQY5A80ylot7Dcg9FDeihqr5R9Rd1maCWIR43oKXvtK5C5+ackwR0QaPBAZ9bdw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.23", + "@angular-devkit/schematics": "8.3.23", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.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 + } + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "@types/chart.js": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.11.tgz", + "integrity": "sha512-xuDh5pZWci1Z5DUkiGTTLIBymxUe8KMfo1JYM5HTY7LXURSCej458uMrD4eYn4v+BTYTZfKlTRNIk8jW4nTaOg==", + "requires": { + "moment": "^2.10.2" + } + }, + "@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": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.16.tgz", + "integrity": "sha512-056oRlBBp7MDzr+HoU5su099s/s7wjZ3KcHxLfv+Byqb9MwdLUvsfLgw1VS97hsh3ddxSPyQu+olHMnoVTUY6g==", + "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/js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==" + }, + "@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": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==" + }, + "@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/request": { + "version": "2.48.3", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz", + "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "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/tough-cookie": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", + "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==" + }, + "@types/underscore": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.9.3.tgz", + "integrity": "sha512-SwbHKB2DPIDlvYqtK5O+0LFtZAyrUSw4c0q+HWwmH1Ve3KMQ0/5PlV3RX97+3dP7yMrnNQ8/bCWWvQpPl03Mug==" + }, + "@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 + } + } + }, + "@types/ws": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.3.tgz", + "integrity": "sha512-yBTM0P05Tx9iXGq00BbJPo37ox68R5vaGTXivs6RGh/BQ6QP5zqZDGWdAO6JbRE/iR1l80xeGAwCQS2nMV9S/w==", + "requires": { + "@types/node": "*" + } + }, + "@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 + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "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": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", + "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", + "requires": { + "clean-stack": "^1.0.0", + "indent-string": "^3.0.0" + }, + "dependencies": { + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + } + } + }, + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "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 + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "angular-bootstrap-md": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/angular-bootstrap-md/-/angular-bootstrap-md-7.5.4.tgz", + "integrity": "sha512-LBVqSswd49hJ3YNTkXzwM0Cn1+9SQ2kVYQxX36ZjxaKNeDQKaUk3V2Rb/y8krhDJrPJh37pDzRmlCDObg37EIA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "angular6-json-schema-form": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/angular6-json-schema-form/-/angular6-json-schema-form-7.3.0.tgz", + "integrity": "sha512-ZoCCsE4KDjHF9sLcA3NnglVpA+N578R+DYMaSfc4F0UviUoil61oeGTMhVYOuFjJ6Yui0mxKY9B0sgJzvaCjxw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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": "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" + } + }, + "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==", + "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-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "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==", + "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=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + } + }, + "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=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "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" + } + }, + "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-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=" + }, + "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 + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "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=", + "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": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "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.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "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" + } + }, + "bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + } + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001017", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.44" + } + }, + "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 + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "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" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "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" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + } + } + }, + "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-lite": { + "version": "1.0.30001019", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz", + "integrity": "sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g==", + "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=" + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz", + "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=", + "requires": { + "chartjs-color-string": "^0.5.0", + "color-convert": "^0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + } + } + }, + "chartjs-color-string": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", + "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", + "requires": { + "color-name": "^1.0.0" + } + }, + "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": { + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "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" + } + }, + "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-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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "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 + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "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-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "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 + } + } + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.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" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "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-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=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "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.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "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.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "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": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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==" + }, + "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=" + }, + "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": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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 + }, + "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" + } + }, + "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-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "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" + } + } + } + }, + "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 + }, + "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.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "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" + } + }, + "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=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "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" + } + }, + "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 + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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=" + }, + "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" + } + }, + "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 + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "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=", + "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.342", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.342.tgz", + "integrity": "sha512-An/MLhGLIG/g7lZ5vqs4lar96zv74agd3ZcADDHLpjAa16T7Y/pO/33Q31JOwpmHeyjithtHtUcn7XLuaz78lw==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "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, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "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": { + "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" + } + } + } + }, + "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": { + "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" + } + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.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 + }, + "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" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "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": { + "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" + } + } + } + }, + "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": { + "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" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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 + }, + "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" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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=" + }, + "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=" + }, + "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=" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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 + }, + "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" + } + } + } + }, + "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": "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" + } + } + } + }, + "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": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "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.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "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.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.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" + } + } + } + }, + "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=" + }, + "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==", + "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=", + "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-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.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=" + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "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.1", + "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": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "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.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.3", + "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.1", + "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.3", + "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.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "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.0", + "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.6.3", + "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.6.0", + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "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.0.3", + "bundled": true, + "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 + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "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 + }, + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "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==", + "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-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "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-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "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": { + "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" + } + }, + "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": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "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" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "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.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" + } + }, + "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.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.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" + } + } + } + }, + "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=", + "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" + } + }, + "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 + } + } + }, + "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.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "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 + }, + "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=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "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.4.0", + "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" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "dependencies": { + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": 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-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": "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-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-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-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.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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" + } + } + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "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=" + }, + "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-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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=" + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", + "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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 + } + } + }, + "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": { + "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" + } + }, + "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 + }, + "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 + }, + "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.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "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": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "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": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "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-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "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=" + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpath-plus": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", + "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "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": "3.1.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz", + "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "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.5", + "log4js": "^3.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": { + "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" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "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 + }, + "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 + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + } + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "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" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "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" + }, + "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" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", + "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.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.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==" + }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, + "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 + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "dev": true, + "requires": { + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.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" + } + }, + "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 + } + } + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "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" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "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": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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" + } + }, + "material-design-icons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/material-design-icons/-/material-design-icons-3.0.1.tgz", + "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=" + }, + "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" + } + }, + "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.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" + } + }, + "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" + } + }, + "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.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.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 + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "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" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.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" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "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.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "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 + }, + "ng2-charts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-1.6.0.tgz", + "integrity": "sha512-9w0WH69x5/nuqC1og2WaY39NbaBqTGIP1+5gZaH7/KPN6UEPonNg/pYnsIVklLj1DWPWXKa8+XXIJZ1jy5nLxg==", + "requires": { + "chart.js": "^2.6.0" + }, + "dependencies": { + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + } + } + }, + "ng2-completer": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/ng2-completer/-/ng2-completer-2.0.8.tgz", + "integrity": "sha512-WzxJ4u3vAHsfBUaFCloEBoirPZrnDabtWEKyDok7dtjhS1ZvcbwQ4asdXuDO0hZ0T1QC66U/PwLhKfkG501hVg==" + }, + "ngx-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ngx-cookie/-/ngx-cookie-4.1.2.tgz", + "integrity": "sha512-BU3q+116mSQZvf8WsnKDxyWFy10LtxSvZz1YIjD7pmaSFpiKdWmHTHn0qLgm3OoIL9TfInQ7Ij46rKJWPD+4Kw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ngx-toastr": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-10.2.0.tgz", + "integrity": "sha512-6ASr5bcvQmtNKb4D2VEsQjCXyROq6GwberBWO0bVt+xcBYPUea4aRTgX8in9apX9buaTafzG+h3HlnIraspoPg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "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-jose": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-1.1.3.tgz", + "integrity": "sha512-kupfi4uGWhRjnOmtie2T64cLge5a1TZyalEa8uWWWBgtKBcu41A4IGKpI9twZAxRnmviamEUQRK7LSyfFb2w8A==", + "requires": { + "base64url": "^3.0.1", + "es6-promise": "^4.2.6", + "lodash": "^4.17.11", + "long": "^4.0.0", + "node-forge": "^0.8.1", + "uuid": "^3.3.2" + }, + "dependencies": { + "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==" + }, + "node-forge": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", + "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" + } + } + }, + "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.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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": { + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "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" + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "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-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": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz", + "integrity": "sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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=", + "requires": { + "path-key": "^2.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==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "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-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "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" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-token-hash": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-3.0.2.tgz", + "integrity": "sha512-dTzp80/y/da+um+i+sOucNqiPpwRL7M/xPwj7pH1TFA2/bqQ+OK2sJahSXbemEoLtPkHcFLyhLhLWZa9yW5+RA==" + }, + "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=", + "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": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "openid-client": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-2.5.0.tgz", + "integrity": "sha512-t3hFD7xEoW1U25RyBcRFaL19fGGs6hNVTysq9pgmiltH0IVUPzH/bQV9w24pM5Q7MunnGv2/5XjIru6BQcWdxg==", + "requires": { + "base64url": "^3.0.0", + "got": "^8.3.2", + "lodash": "^4.17.11", + "lru-cache": "^5.1.1", + "node-jose": "^1.1.0", + "object-hash": "^1.3.1", + "oidc-token-hash": "^3.0.1", + "p-any": "^1.1.0" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "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" + } + }, + "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": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "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-any": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-any/-/p-any-1.1.0.tgz", + "integrity": "sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==", + "requires": { + "p-some": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "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=" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "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-some": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-some/-/p-some-2.0.1.tgz", + "integrity": "sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY=", + "requires": { + "aggregate-error": "^1.0.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.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": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "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=" + }, + "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=" + }, + "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" + } + }, + "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=" + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "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" + } + }, + "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 + } + } + }, + "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.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "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 + } + } + }, + "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-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "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.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "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 + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "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.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "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==" + }, + "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==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "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.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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 + }, + "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-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.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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": "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", + "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "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.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "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.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, + "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 + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "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.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "rxjs-compat": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.3.3.tgz", + "integrity": "sha512-caGN7ixiabHpOofginKEquuHk7GgaCrC7UpUQ9ZqGp80tMc68msadOeP/2AKy2R4YJsT1+TX5GZCtxO82qWkyA==" + }, + "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==" + }, + "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==" + }, + "sass": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", + "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "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": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "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": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "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" + } + }, + "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" + } + }, + "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": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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 + }, + "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 + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + } + }, + "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" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "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=", + "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=" + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "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": { + "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" + } + }, + "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" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "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": { + "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" + } + } + } + }, + "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": { + "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 + } + } + }, + "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" + } + }, + "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 + } + } + }, + "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": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "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.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "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.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "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.7", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.7.tgz", + "integrity": "sha512-RuN23NzhAOuUtaivhcrjXx1OPXsFeH9m5sI373/U7+tGLKihjUyboZAzOadytMjnqHp1f45RGk1IzDKCpDpSYA==", + "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" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "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": { + "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" + } + }, + "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 + }, + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "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=" + }, + "sshpk": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", + "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": "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" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "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": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.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" + } + }, + "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 + } + } + }, + "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=" + }, + "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==", + "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=" + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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 + }, + "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" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "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": "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" + } + }, + "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": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": 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" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "terser": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", + "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.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" + } + } + } + }, + "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" + }, + "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" + } + }, + "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 + } + } + }, + "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 + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "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" + } + }, + "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": "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" + } + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "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=", + "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=" + }, + "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.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "uglify-js": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.4.tgz", + "integrity": "sha512-tinYWE8X1QfCHxS1lBS8yiDekyhSXOO6R66yNOCdUJeojxxw+PX2BHAz/BWyW7PQ7pkiWVxJfIEbiDxyLWvUGg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "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, + "optional": 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, + "optional": 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 + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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==", + "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" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "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" + } + }, + "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" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "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" + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "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 + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "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": { + "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" + } + }, + "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 + } + } + }, + "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" + } + }, + "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.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "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.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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 + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "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": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "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 + } + } + }, + "webpack-dev-server": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "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.4", + "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": { + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "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.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "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==", + "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 + }, + "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=" + }, + "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" + } + }, + "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": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "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.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/webapp-frontend/package.json b/webapp-frontend/package.json new file mode 100644 index 0000000..840ef04 --- /dev/null +++ b/webapp-frontend/package.json @@ -0,0 +1,73 @@ +{ + "name": "dash-app", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve --proxy-config proxy.conf.json", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "^8.2.14", + "@angular/cdk": "^7.3.7", + "@angular/common": "^8.2.14", + "@angular/compiler": "^8.2.14", + "@angular/core": "^8.2.14", + "@angular/flex-layout": "^7.0.0-beta.24", + "@angular/forms": "^8.2.14", + "@angular/material": "~7.2.0", + "@angular/platform-browser": "^8.2.14", + "@angular/platform-browser-dynamic": "^8.2.14", + "@angular/router": "^8.2.14", + "@fortawesome/fontawesome-free": "^5.12.0", + "@kubernetes/client-node": "^0.10.3", + "@material/radio": "^2.3.0", + "@types/chart.js": "^2.9.11", + "angular-bootstrap-md": "^7.5.4", + "angular6-json-schema-form": "^7.3.0", + "bootstrap": "^4.4.1", + "chart.js": "^2.9.3", + "core-js": "^2.6.11", + "hammerjs": "^2.0.8", + "lodash-es": "^4.17.15", + "material-design-icons": "^3.0.1", + "ng2-charts": "^1.6.0", + "ng2-completer": "^2.0.8", + "ngx-cookie": "^4.1.2", + "ngx-toastr": "^10.2.0", + "rxjs": "6.5.3", + "rxjs-compat": "6.3.3", + "tslib": "^1.10.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^0.803.23", + "@angular/cli": "^8.3.23", + "@angular/compiler-cli": "^8.2.14", + "@angular/language-service": "^8.2.14", + "@nguniversal/express-engine": "^8.2.6", + "@types/jasmine": "^2.8.16", + "@types/jasminewd2": "^2.0.8", + "@types/node": "~8.9.4", + "codelyzer": "^5.2.1", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~3.1.1", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "^2.1.1", + "karma-jasmine": "~1.1.2", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "^5.4.3", + "ts-node": "~7.0.0", + "tslint": "~5.11.0", + "typescript": "~3.5.3" + }, + "comments": { + "dependencies": { + "rxjs": "Its version needs to be same with rxjs-compat, otherwise apparently build is failing" + } + } +} diff --git a/webapp-frontend/pom.xml b/webapp-frontend/pom.xml new file mode 100644 index 0000000..c1ca2bf --- /dev/null +++ b/webapp-frontend/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + org.o-ran-sc.portal.nonrtric.controlpanel + nonrtric-controlpanel-parent + 1.0.0-SNAPSHOT + + nonrtric-controlpanel-fe + NonRT RIC Controlpanel Webapp frontend + + + + + org.codehaus.mojo + license-maven-plugin + + + e2e + src + + + **/*.json + + + + + com.github.eirslett + frontend-maven-plugin + 1.3 + + v10.15.3 + 6.7.0 + . + + + + install node and npm + + install-node-and-npm + + + + npm install + + npm + + + + npm run build + + npm + + + run build + + + + prod + + npm + + + run-script build + + generate-resources + + + + + org.apache.maven.plugins + maven-clean-plugin + + + + ${project.basedir} + + **/node_modules/** + dist/** + node/** + + false + + + node + + + + + + + diff --git a/webapp-frontend/proxy.conf.json b/webapp-frontend/proxy.conf.json new file mode 100644 index 0000000..b82271d --- /dev/null +++ b/webapp-frontend/proxy.conf.json @@ -0,0 +1,6 @@ +{ + "/api": { + "target": "http://localhost:8080", + "secure": false + } +} diff --git a/webapp-frontend/src/app/controlpanel-routing.module.ts b/webapp-frontend/src/app/controlpanel-routing.module.ts new file mode 100644 index 0000000..23665bc --- /dev/null +++ b/webapp-frontend/src/app/controlpanel-routing.module.ts @@ -0,0 +1,43 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Routes, RouterModule } from '@angular/router'; +import { MainComponent } from './main/main.component'; +import { PolicyControlComponent } from './policy-control/policy-control.component'; + + +const routes: Routes = [ + { path: '', component: MainComponent }, + { path: 'policy', component: PolicyControlComponent } +]; + +@NgModule({ + imports: [ + CommonModule, + RouterModule.forRoot(routes)], + exports: [ + RouterModule + ], + declarations: [] +}) + +export class ControlpanelRoutingModule { } diff --git a/webapp-frontend/src/app/controlpanel.component.html b/webapp-frontend/src/app/controlpanel.component.html new file mode 100644 index 0000000..6d47fde --- /dev/null +++ b/webapp-frontend/src/app/controlpanel.component.html @@ -0,0 +1,117 @@ + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + NonRT RIC Controlpanel + + + +
+ +

+ +
+ Light + + Dark +
+ +
+ + +
+
+
+ +
+
+ + +
+ +
+ +
+
+
\ No newline at end of file diff --git a/webapp-frontend/src/app/controlpanel.component.scss b/webapp-frontend/src/app/controlpanel.component.scss new file mode 100644 index 0000000..ddefe09 --- /dev/null +++ b/webapp-frontend/src/app/controlpanel.component.scss @@ -0,0 +1,379 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +.root__container { + width: 100vw; + height: 100vh; + display: grid; + grid-template-columns: auto; + grid-template-rows: 0.5fr auto; + position: relative; +} + +/* +================ + Header +================ +*/ +mat-sidenav-container, +mat-sidenav-content, +mat-sidenav { + height: 100%; +} + +mat-sidenav { + width: 250px; +} + +main { + padding: 10px; +} + +/* + Slide Menu += = = = = = = = = +*/ +.side-menu__dark { + color: white; + background: gray; +} + +.side-menu__container { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: hidden; + pointer-events: none; + z-index: 25; +} + +.side-menu__container-active { + pointer-events: auto; +} + +.side-menu__container::before { + content: ''; + cursor: pointer; + position: absolute; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: #0c1066; + opacity: 0; + transition: opacity 300ms linear; + will-change: opacity; +} + +.side-menu__container-active::before { + opacity: 0.3; +} + +.slide-menu { + box-sizing: border-box; + transform: translateX(-103%); + position: relative; + top: 0; + left: 0; + z-index: 10; + height: 100%; + width: 90%; + max-width: 26rem; + background-color: white; + box-shadow: 0 0 2rem rgba(0, 0, 255, 0.1); + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 2fr 4fr 1fr; + grid-gap: 1rem; + transition: transform 300ms linear; + will-change: transform; +} + +.slide-menu-active { + transform: none; +} + +.menu-header.menu-header__dark { + background: #2B244D; +} + +.menu-header { + background: linear-gradient(to right, rgb(181, 199, 192), #82bbb6); + display: grid; + grid-template-rows: 1fr 4fr; + grid-template-columns: 1fr 4fr; + grid-template-areas: "greeting greeting""image details"; + box-sizing: border-box; + width: 100%; + align-content: center; + color: white; + box-shadow: 0 0.5rem 2rem rgba(0, 0, 255, 0.2); +} + +mat-drawer { + width: 340px; +} + +mat-drawer-content { + overflow: overlay; +} + +.menumargin-top { + margin-top: 10px; +} + +.greeting__text { + grid-area: greeting; + font-size: 1.25rem; + letter-spacing: 0.15rem; + text-transform: uppercase; + margin-top: 1rem; + justify-self: center; + align-self: center; +} + +.account-details { + grid-area: details; + display: flex; + flex-flow: column; + margin-left: 1rem; + align-self: center; +} + +.name__text { + font-size: 1.15rem; + margin-bottom: 0.5rem; +} + +.email__text { + font-size: 0.9rem; + letter-spacing: 0.1rem; +} + +.menu-body { + display: grid; + width: 100%; +} + +.profile-image__container { + grid-area: image; + margin-right: 0.5rem; + border-radius: 50%; + height: 4rem; + width: 4rem; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + background-color: white; + align-self: center; + margin-left: 2rem; +} + +.profile__image { + max-width: 4rem; +} + +.home_bg_image { + height: 40em; + background-size: cover; + width: auto; + background-image: url('../assets/intelligence.png'); + background-position: 50% 50%; +} + +/*Header*/ +.main__header { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr 0.25fr; + grid-template-rows: 1fr; + box-shadow: 0 0 2rem rgba(0, 0, 255, 0.1); + height: 4rem; + margin: 0; + align-items: center; + transition: background-color 500ms linear; + animation: fadein 1s ease-in-out 0ms 1; +} + +.main__header-dark { + background-color: #2B244D; + color: white; +} + +.toggle-button__container { + cursor: pointer; + position: relative; + margin: 0 0.5rem; +} + +.mode-toggle__input { + -webkit-appearance: none; + -moz-appearance: none; +} + +.mode-toggle__bg { + height: 1rem; + width: 2rem; + border-radius: 0.5rem; + background-color: rgba(0, 0, 0, 0.5); + display: inline-block; + transition: background-color 300ms linear; +} + +.mode-toggle__circle { + height: 1.30rem; + width: 1.30rem; + background-color: #2B244D; + position: absolute; + top: -0.2rem; + border-radius: 50%; + box-shadow: 0 0 0 rgba(0, 0, 255, 0.5); + transition: left 300ms linear; + left: 0.1rem; +} + +.mode-toggle__circle-checked { + background-color: white; + left: 1.75rem; +} + +.mode-toggle__bg-checked { + background-color: #FF0070; +} + +.mode-toggle__text { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.1rem; +} + +/*Content*/ +.left__section { + display: grid; + grid-template-rows: 1fr; + grid-template-columns: 1fr 1fr; + max-width: 5rem; +} + +.left__section3Col { + display: grid; + grid-template-rows: 1fr; + grid-template-columns: 1fr 1fr 1fr; + max-width: 6rem; +} + +.date__text { + text-transform: uppercase; + letter-spacing: 0.1rem; + display: inline; + margin: 0.5rem 0; +} + +/*SVGs*/ +.hamburger__icon { + position: relative; + z-index: 35; + height: 2rem; + padding: 0.5rem 1.5rem; + margin-right: 1rem; + cursor: pointer; +} + +.logo__icon { + height: 2rem; + margin-left: 1rem; +} + +.logo__text { + fill: #2B244D; +} + +.logo__text-dark { + fill: #ffffff; +} + +.hamburger__icon__fill { + fill: #2B244D; +} + +.hamburger__icon__fill-dark { + fill: #ffffff; +} + +/* +================ + Body +================ +*/ + +.main__container { + height: 100%; + width: 100%; +} + +.main__container__body { + min-height: calc(100vh - 140px); +} + +.main-container__bg { + position: absolute; + top: 0; + left: 0; + z-index: -2; + opacity: 0; + background: white; + transition: opacity 300ms linear; +} + +.main-container__bg-dark { + opacity: 1; + background: linear-gradient(to bottom, rgb(62, 59, 68), rgb(11, 10, 15)); + transition: opacity 300ms linear; +} + +/* +================- + Footer +================ +*/ +.main__footer { + background: transparent; + z-index: 100; +} + +.main__footer-dark { + background-color: #2B244D; + color: white; +} + +.main-footer__bg-dark { + opacity: 1; + background: rgb(11, 10, 15); + transition: opacity 300ms linear; +} + +@media only screen and (max-width: 300px) { + .slide-menu { + width: 100%; + } +} \ No newline at end of file diff --git a/webapp-frontend/src/app/controlpanel.component.spec.ts b/webapp-frontend/src/app/controlpanel.component.spec.ts new file mode 100644 index 0000000..4a86e91 --- /dev/null +++ b/webapp-frontend/src/app/controlpanel.component.spec.ts @@ -0,0 +1,54 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + 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 'controlpanelApp'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('controlpanelApp'); + }); + + it('should render title in a h1 tag', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to controlpanelApp!'); + }); +}); diff --git a/webapp-frontend/src/app/controlpanel.component.ts b/webapp-frontend/src/app/controlpanel.component.ts new file mode 100644 index 0000000..be39fc1 --- /dev/null +++ b/webapp-frontend/src/app/controlpanel.component.ts @@ -0,0 +1,57 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnInit } from '@angular/core'; +import { UiService } from './services/ui/ui.service'; +import { CookieService } from 'ngx-cookie'; + +@Component({ + selector: 'rd-root', + templateUrl: './controlpanel.component.html', + styleUrls: ['./controlpanel.component.scss'] +}) +export class ControlpanelComponent implements OnInit { + private showMenu = false; + private darkMode: boolean; + private 'DARK_MODE_COOKIE' = 'darkMode'; + + constructor(private cookieService: CookieService, private ui: UiService) { + } + + ngOnInit() { + const dark = this.cookieService.get(this.DARK_MODE_COOKIE); + if (dark) { + this.ui.darkModeState.next(dark === 'yes'); + } + + this.ui.darkModeState.subscribe((value) => { + this.darkMode = value; + }); + } + + toggleMenu() { + this.showMenu = !this.showMenu; + } + + modeToggleSwitch() { + this.ui.darkModeState.next(!this.darkMode); + this.cookieService.put(this.DARK_MODE_COOKIE, this.darkMode ? 'yes' : 'no'); + } + +} diff --git a/webapp-frontend/src/app/controlpanel.module.ts b/webapp-frontend/src/app/controlpanel.module.ts new file mode 100644 index 0000000..2540edd --- /dev/null +++ b/webapp-frontend/src/app/controlpanel.module.ts @@ -0,0 +1,141 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { BrowserModule } from '@angular/platform-browser'; +// tslint:disable-next-line:max-line-length +import { + MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, + MatDialogModule, MatExpansionModule, MatFormFieldModule, MatGridListModule, + MatIconModule, MatInputModule, MatListModule, MatMenuModule, MatPaginatorModule, + MatProgressSpinnerModule, MatSelectModule, MatSidenavModule, MatSliderModule, + MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, + MatTabsModule, MatToolbarModule +} from '@angular/material'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule } from '@angular/common/http'; +import { NgModule } from '@angular/core'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { ChartsModule } from 'ng2-charts'; +import { MDBBootstrapModule } from 'angular-bootstrap-md'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { ToastrModule } from 'ngx-toastr'; +import { ConfirmDialogComponent } from './ui/confirm-dialog/confirm-dialog.component'; +import { ControlpanelService } from './services/controlpanel/controlpanel.service'; +import { ErrorDialogComponent } from './ui/error-dialog/error-dialog.component'; +import { ErrorDialogService } from './services/ui/error-dialog.service'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { FooterComponent } from './footer/footer.component'; +import { MainComponent } from './main/main.component'; +import { MaterialDesignFrameworkModule } from 'angular6-json-schema-form'; +import { PolicyCardComponent } from './ui/policy-card/policy-card.component'; +import { PolicyControlComponent } from './policy-control/policy-control.component'; +import { PolicyInstanceComponent } from './policy-control/policy-instance.component'; +import { PolicyInstanceDialogComponent } from './policy-control/policy-instance-dialog.component'; +import { ControlpanelComponent } from './controlpanel.component'; +import { ControlpanelRoutingModule } from './controlpanel-routing.module'; +import { SidenavListComponent } from './navigation/sidenav-list/sidenav-list.component'; +import { UiService } from './services/ui/ui.service'; +import { CookieModule } from 'ngx-cookie'; + +@NgModule({ + declarations: [ + ConfirmDialogComponent, + ErrorDialogComponent, + FooterComponent, + MainComponent, + PolicyCardComponent, + PolicyControlComponent, + PolicyInstanceComponent, + PolicyInstanceDialogComponent, + ControlpanelComponent, + SidenavListComponent + ], + imports: [ + BrowserModule, + BrowserAnimationsModule, + ChartsModule, + FlexLayoutModule, + FormsModule, + HttpClientModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatDialogModule, + MaterialDesignFrameworkModule, + MatExpansionModule, + MatFormFieldModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatPaginatorModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSliderModule, + MatSidenavModule, + MatSlideToggleModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MDBBootstrapModule.forRoot(), + ControlpanelRoutingModule, + ReactiveFormsModule, + ToastrModule.forRoot(), + CookieModule.forRoot() + ], + exports: [ + ErrorDialogComponent, + FormsModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatSidenavModule, + MatSliderModule, + MatSlideToggleModule, + MatTabsModule + ], + entryComponents: [ + ConfirmDialogComponent, + ErrorDialogComponent, + PolicyInstanceDialogComponent + ], + providers: [ + ControlpanelService, + ErrorDialogService, + UiService + ], + bootstrap: [ControlpanelComponent] +}) +export class ControlpanelModule { } diff --git a/webapp-frontend/src/app/footer/footer.component.html b/webapp-frontend/src/app/footer/footer.component.html new file mode 100644 index 0000000..34d88bb --- /dev/null +++ b/webapp-frontend/src/app/footer/footer.component.html @@ -0,0 +1,25 @@ + + \ No newline at end of file diff --git a/webapp-frontend/src/app/footer/footer.component.scss b/webapp-frontend/src/app/footer/footer.component.scss new file mode 100644 index 0000000..077567e --- /dev/null +++ b/webapp-frontend/src/app/footer/footer.component.scss @@ -0,0 +1,30 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +.copyright__text { + color: gray; + letter-spacing: 0.1rem; + font-size: 10px; + margin-left: 10px; +} + +.copyright__text-dark { + color: gray; +} \ No newline at end of file diff --git a/webapp-frontend/src/app/footer/footer.component.spec.ts b/webapp-frontend/src/app/footer/footer.component.spec.ts new file mode 100644 index 0000000..9b1d31a --- /dev/null +++ b/webapp-frontend/src/app/footer/footer.component.spec.ts @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FooterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/footer/footer.component.ts b/webapp-frontend/src/app/footer/footer.component.ts new file mode 100644 index 0000000..47e768e --- /dev/null +++ b/webapp-frontend/src/app/footer/footer.component.ts @@ -0,0 +1,52 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2019 Nordix Foundation + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnInit } from '@angular/core'; +import { ControlpanelSuccessTransport } from '../interfaces/controlpanel.types'; +import { ControlpanelService } from '../services/controlpanel/controlpanel.service'; +import { UiService } from '../services/ui/ui.service'; + +@Component({ + selector: 'rd-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'] +}) + +/** + * Fetches the version on load for display in the footer + */ +export class FooterComponent implements OnInit { + darkMode: boolean; + controlpanelVersion: string; + + // Inject the service + constructor(private controlpanelService: ControlpanelService, + private ui: UiService) { } + + ngOnInit() { + this.controlpanelVersion = '0.0'; + // this.controlpanelService.getVersion().subscribe((res: ControlpanelSuccessTransport) => this.controlpanelVersion = res.data); + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + } + +} diff --git a/webapp-frontend/src/app/interfaces/controlpanel.types.ts b/webapp-frontend/src/app/interfaces/controlpanel.types.ts new file mode 100644 index 0000000..ec6e5c8 --- /dev/null +++ b/webapp-frontend/src/app/interfaces/controlpanel.types.ts @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +// Models of data used by Controlpanel admin services + +export interface ControlpanelSuccessTransport { + status: number; + data: string; +} + +export interface EcompRoleFunction { + name: string; + code: string; + type: string; + action: string; +} + +export interface EcompRole { + id: number; + name: string; + [position: number]: EcompRoleFunction; +} + +export interface EcompUser { + orgId?: number; + managerId?: string; + firstName?: string; + middleInitial?: string; + lastName?: string; + phone?: string; + email?: string; + hrid?: string; + orgUserId?: string; + orgCode?: string; + orgManagerUserId?: string; + jobTitle?: string; + loginId: string; + active: boolean; + [position: number]: EcompRole; +} diff --git a/webapp-frontend/src/app/interfaces/policy.types.ts b/webapp-frontend/src/app/interfaces/policy.types.ts new file mode 100644 index 0000000..b6ecce6 --- /dev/null +++ b/webapp-frontend/src/app/interfaces/policy.types.ts @@ -0,0 +1,40 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +// Models of data used by the Policy Control + +export interface PolicyType { + name: string; + schema: string; + schemaObject: any; +} + +export interface PolicyInstance { + id: string; + json: string; + ric: string; + service: string; + lastModified: string; +} + +export interface PolicyInstanceAck { + status: string; + message: string; +} diff --git a/webapp-frontend/src/app/main/main.component.html b/webapp-frontend/src/app/main/main.component.html new file mode 100644 index 0000000..f05fd50 --- /dev/null +++ b/webapp-frontend/src/app/main/main.component.html @@ -0,0 +1,23 @@ + +
+ +
diff --git a/webapp-frontend/src/app/main/main.component.scss b/webapp-frontend/src/app/main/main.component.scss new file mode 100644 index 0000000..836d80a --- /dev/null +++ b/webapp-frontend/src/app/main/main.component.scss @@ -0,0 +1,27 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +.main__container { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(auto-fill, 1fr); + align-items: center; + justify-items: center; + height: 100%; +} diff --git a/webapp-frontend/src/app/main/main.component.spec.ts b/webapp-frontend/src/app/main/main.component.spec.ts new file mode 100644 index 0000000..df9a9aa --- /dev/null +++ b/webapp-frontend/src/app/main/main.component.spec.ts @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainComponent } from './main.component'; + +describe('MainComponent', () => { + let component: MainComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MainComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/main/main.component.ts b/webapp-frontend/src/app/main/main.component.ts new file mode 100644 index 0000000..9d11525 --- /dev/null +++ b/webapp-frontend/src/app/main/main.component.ts @@ -0,0 +1,33 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'rd-main', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'] +}) +export class MainComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.html b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.html new file mode 100644 index 0000000..9dea90a --- /dev/null +++ b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.html @@ -0,0 +1,30 @@ + + + + + + home Home + + + assignment Policy + + diff --git a/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.scss b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.scss new file mode 100644 index 0000000..d5a9e7e --- /dev/null +++ b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.scss @@ -0,0 +1,36 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +a { + text-decoration: none; + color: black; +} + +.dark a { + color: white; +} + +a:hover, a:active{ + color: lightgray; +} + +.nav-caption{ + display: inline-block; + padding-left: 6px; +} diff --git a/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts new file mode 100644 index 0000000..914fa2d --- /dev/null +++ b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { UiService } from '../../services/ui/ui.service'; + +@Component({ + selector: 'rd-sidenav-list', + templateUrl: './sidenav-list.component.html', + styleUrls: ['./sidenav-list.component.scss'] +}) +export class SidenavListComponent implements OnInit { + darkMode: boolean; + @Output() sidenavClose = new EventEmitter(); + + constructor(private ui: UiService) { } + + ngOnInit() { + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + } + + public onSidenavClose = () => { + this.sidenavClose.emit(); + } + +} diff --git a/webapp-frontend/src/app/policy-control/policy-control.component.html b/webapp-frontend/src/app/policy-control/policy-control.component.html new file mode 100644 index 0000000..f185207 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-control.component.html @@ -0,0 +1,80 @@ + + +

Policy Control

+ + + + + Policy Type + + {{isInstancesShown(policyType) ? 'expand_less' : 'expand_more'}} + + {{this.getName(policyType)}} + + + + + Description + {{policyType.schemaObject.description}} + + + + + Action + + + + + + + + + + + + + + + + No records found. + + + + + + + + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-control.component.scss b/webapp-frontend/src/app/policy-control/policy-control.component.scss new file mode 100644 index 0000000..fe0a741 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-control.component.scss @@ -0,0 +1,45 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +.spinner-container { + height: 100px; + width: 100px; +} + +.spinner-container mat-spinner { + margin: 0 auto 0 auto; +} + +.policy-type-table { + width: 100%; + min-height: 150px; + margin-top: 10px; + margin-bottom: 10px; + background-color: transparent; +} + +.action-cell { + display: flex; + justify-content: flex-end; +} + +.display-none { + display: none; +} \ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-control.component.spec.ts b/webapp-frontend/src/app/policy-control/policy-control.component.spec.ts new file mode 100644 index 0000000..7c8643a --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-control.component.spec.ts @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PolicyControlComponent } from './policy-control.component'; + +describe('PolicyControlComponent', () => { + let component: PolicyControlComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PolicyControlComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PolicyControlComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/policy-control/policy-control.component.ts b/webapp-frontend/src/app/policy-control/policy-control.component.ts new file mode 100644 index 0000000..cd8d948 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-control.component.ts @@ -0,0 +1,112 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSort } from '@angular/material/sort'; +import { animate, state, style, transition, trigger } from '@angular/animations'; + +import { PolicyService } from '../services/policy/policy.service'; +import { PolicyType } from '../interfaces/policy.types'; +import { PolicyTypeDataSource } from './policy-type.datasource'; +import { getPolicyDialogProperties } from './policy-instance-dialog.component'; +import { PolicyInstanceDialogComponent } from './policy-instance-dialog.component'; +import { NotificationService } from '../services/ui/notification.service'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { UiService } from '../services/ui/ui.service'; + +class PolicyTypeInfo { + constructor(public type: PolicyType) { } + + isExpanded: BehaviorSubject = new BehaviorSubject(false); +} + +@Component({ + selector: 'rd-policy-control', + templateUrl: './policy-control.component.html', + styleUrls: ['./policy-control.component.scss'], + animations: [ + trigger('detailExpand', [ + state('collapsed, void', style({ height: '0px', minHeight: '0', display: 'none' })), + state('expanded', style({ height: '*' })), + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), + transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]), + ], +}) +export class PolicyControlComponent implements OnInit { + + + policyTypesDataSource: PolicyTypeDataSource; + @ViewChild(MatSort, { static: true }) sort: MatSort; + + policyTypeInfo = new Map(); + darkMode: boolean; + + constructor( + private policySvc: PolicyService, + private dialog: MatDialog, + private notificationService: NotificationService, + private ui: UiService) { } + + ngOnInit() { + this.policyTypesDataSource = new PolicyTypeDataSource(this.policySvc, this.sort, this.notificationService); + this.policyTypesDataSource.loadTable(); + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + } + + createPolicyInstance(policyType: PolicyType): void { + const dialogRef = this.dialog.open(PolicyInstanceDialogComponent, getPolicyDialogProperties(policyType, null, this.darkMode)); + const info: PolicyTypeInfo = this.getPolicyTypeInfo(policyType); + dialogRef.afterClosed().subscribe( + (result: any) => { + info.isExpanded.next(info.isExpanded.getValue()); + } + ); + } + + toggleListInstances(policyType: PolicyType): void { + const info = this.getPolicyTypeInfo(policyType); + info.isExpanded.next(!info.isExpanded.getValue()); + } + + getPolicyTypeInfo(policyType: PolicyType): PolicyTypeInfo { + let info: PolicyTypeInfo = this.policyTypeInfo.get(policyType.name); + if (!info) { + info = new PolicyTypeInfo(policyType); + this.policyTypeInfo.set(policyType.name, info); + } + return info; + } + + getName(policyType: PolicyType): string { + if (policyType.schemaObject.title) { return policyType.schemaObject.title; } + return policyType.name; + } + + isInstancesShown(policyType: PolicyType): boolean { + return this.getPolicyTypeInfo(policyType).isExpanded.getValue(); + } + + getExpandedObserver(policyType: PolicyType): Observable { + return this.getPolicyTypeInfo(policyType).isExpanded.asObservable(); + } +} diff --git a/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.html b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.html new file mode 100644 index 0000000..d447c70 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.html @@ -0,0 +1,99 @@ + + +
+ +
+ +
{{jsonSchemaObject.description}}
+ +
+ + + + + + Select RIC + + + {{ric}} + + + + +

+ {{isVisible.form ? 'expand_less' : 'expand_more'}} + Properties +

+
+
{{jsonFormStatusMessage}}
+ + + +
+
+ + +
+

+ {{isVisible.json ? 'expand_less' : 'expand_more'}} + Json +

+
+
+ + {{formIsValid ? 'Json' : 'Not valid'}} + + Invalid form + — errors: +
+
+
+
{{prettyLiveFormData}}
+
+
+ +

+ {{isVisible.schema ? 'expand_less' : 'expand_more'}} + Json Schema +

+
+ Schema +
{{schemaAsString}}
+
+
+
\ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.scss b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.scss new file mode 100644 index 0000000..7ecfff1 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.scss @@ -0,0 +1,72 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + + +.logo__text { + fill: #2B244D; +} + +.logo__text-dark { + fill: #ffffff; +} + +.text__dark { + color: white; +} + +.header { + background: linear-gradient(to bottom, white 0%, grayscale($color: #eeeaea) 100%); + font-size: 40px; + margin-top: 10px; + margin-bottom: 10px; + margin-left: 2px; + margin-right: 2px; +} + +.header-dark { + background: #2B244D; +} + +.logo { + margin-left: 10px; +} + +.logo__icon { + height: 2rem; + margin-left: 1rem; +} + +.submitBtn { + background-color: #4CAF50; + /* Green */ + margin-right: 10px; +} + +.card { + height: 100%; + width: 100%; + margin-left: 2px; + margin-right: 2px; + background-color: grayscale($color: #eeeaea); +} + +.card-dark { + background-color: #1c1c24; +} \ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.ts b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.ts new file mode 100644 index 0000000..b4ad194 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance-dialog.component.ts @@ -0,0 +1,236 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { AfterViewInit, Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { MatDialogConfig, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatMenuTrigger } from '@angular/material/menu'; +import { JsonPointer } from 'angular6-json-schema-form'; +import * as uuid from 'uuid'; +import { PolicyInstance, PolicyType } from '../interfaces/policy.types'; +import { PolicyService } from '../services/policy/policy.service'; +import { ErrorDialogService } from '../services/ui/error-dialog.service'; +import { NotificationService } from './../services/ui/notification.service'; +import { UiService } from '../services/ui/ui.service'; + + +@Component({ + selector: 'rd-policy-instance-dialog', + templateUrl: './policy-instance-dialog.component.html', + styleUrls: ['./policy-instance-dialog.component.scss'], + animations: [ + trigger('expandSection', [ + state('in', style({ height: '*' })), + transition(':enter', [ + style({ height: 0 }), animate(100), + ]), + transition(':leave', [ + style({ height: '*' }), + animate(100, style({ height: 0 })), + ]), + ]), + ], +}) +export class PolicyInstanceDialogComponent implements OnInit, AfterViewInit { + + formActive = false; + isVisible = { + form: true, + json: false, + schema: false + }; + + jsonFormStatusMessage = 'Loading form...'; + jsonSchemaObject: any = {}; + jsonObject: any = {}; + + + jsonFormOptions: any = { + addSubmit: false, // Add a submit button if layout does not have one + debug: false, // Don't show inline debugging information + loadExternalAssets: true, // Load external css and JavaScript for frameworks + returnEmptyFields: false, // Don't return values for empty input fields + setSchemaDefaults: true, // Always use schema defaults for empty fields + defautWidgetOptions: { feedback: true }, // Show inline feedback icons + }; + + liveFormData: any = {}; + formValidationErrors: any; + formIsValid = false; + + @ViewChild(MatMenuTrigger, { static: true }) menuTrigger: MatMenuTrigger; + + policyInstanceId: string; // null if not yet created + policyTypeName: string; + darkMode: boolean; + ric: string; + allRics: string[]; + + private fetchRics() { + console.log('fetchRics ' + this.policyTypeName); + const self: PolicyInstanceDialogComponent = this; + this.dataService.getRics(this.policyTypeName).subscribe( + { + next(value) { + self.allRics = value; + console.log(value); + }, + error(error) { + self.errorService.displayError('Fetching of rics failed: ' + error.message); + }, + complete() { } + }); + } + + constructor( + private dataService: PolicyService, + private errorService: ErrorDialogService, + private notificationService: NotificationService, + @Inject(MAT_DIALOG_DATA) private data, + private dialogRef: MatDialogRef, + private ui: UiService) { + this.formActive = false; + this.policyInstanceId = data.instanceId; + this.policyTypeName = data.name; + this.jsonSchemaObject = data.createSchema; + this.jsonObject = this.parseJson(data.instanceJson); + this.ric = data.ric; + } + + ngOnInit() { + this.jsonFormStatusMessage = 'Init'; + this.formActive = true; + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + if (!this.policyInstanceId) { + this.fetchRics(); + } + } + + ngAfterViewInit() { + } + + onSubmit() { + if (this.policyInstanceId == null) { + this.policyInstanceId = uuid.v4(); + } + const policyJson: string = this.prettyLiveFormData; + const self: PolicyInstanceDialogComponent = this; + this.dataService.putPolicy(this.policyTypeName, this.policyInstanceId, policyJson, this.ric).subscribe( + { + next(value) { + self.notificationService.success('Policy ' + self.policyTypeName + ':' + self.policyInstanceId + ' submitted'); + }, + error(error) { + self.errorService.displayError('updatePolicy failed: ' + error.message); + }, + complete() { } + }); + } + + onClose() { + this.dialogRef.close(); + } + + public onChanges(formData: any) { + this.liveFormData = formData; + } + + get prettyLiveFormData() { + return JSON.stringify(this.liveFormData, null, 2); + } + + get schemaAsString() { + return JSON.stringify(this.jsonSchemaObject, null, 2); + } + + get jsonAsString() { + return JSON.stringify(this.jsonObject, null, 2); + } + + isValid(isValid: boolean): void { + this.formIsValid = isValid; + } + + validationErrors(validationErrors: any): void { + this.formValidationErrors = validationErrors; + } + + get prettyValidationErrors() { + if (!this.formValidationErrors) { return null; } + const errorArray = []; + for (const error of this.formValidationErrors) { + const message = error.message; + const dataPathArray = JsonPointer.parse(error.dataPath); + if (dataPathArray.length) { + let field = dataPathArray[0]; + for (let i = 1; i < dataPathArray.length; i++) { + const key = dataPathArray[i]; + field += /^\d+$/.test(key) ? `[${key}]` : `.${key}`; + } + errorArray.push(`${field}: ${message}`); + } else { + errorArray.push(message); + } + } + return errorArray.join('
'); + } + + private parseJson(str: string): string { + try { + if (str != null) { + return JSON.parse(str); + } + } catch (jsonError) { + this.jsonFormStatusMessage = + 'Invalid JSON\n' + + 'parser returned:\n\n' + jsonError; + } + return null; + } + + public toggleVisible(item: string) { + this.isVisible[item] = !this.isVisible[item]; + } +} + +export function getPolicyDialogProperties(policyType: PolicyType, instance: PolicyInstance, darkMode: boolean): MatDialogConfig { + const createSchema = policyType.schemaObject; + const instanceId = instance ? instance.id : null; + const instanceJson = instance ? instance.json : null; + const name = policyType.name; + const ric = instance ? instance.ric : null; + return { + maxWidth: '1200px', + maxHeight: '900px', + width: '900px', + role: 'dialog', + disableClose: false, + panelClass: darkMode ? 'dark-theme' : '', + data: { + createSchema, + instanceId, + instanceJson, + name, + ric + } + }; +} + diff --git a/webapp-frontend/src/app/policy-control/policy-instance.component.html b/webapp-frontend/src/app/policy-control/policy-instance.component.html new file mode 100644 index 0000000..8c305e4 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance.component.html @@ -0,0 +1,75 @@ + + + + + Instance + {{element.id}} + + + + + Ric + {{element.ric}} + + + + + Owner + {{element.service}} + + + + + Last modified + {{toLocalTime(element.lastModified)}} + + + + + Action + + + + + + + + No records found. + + + + + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-instance.component.scss b/webapp-frontend/src/app/policy-control/policy-instance.component.scss new file mode 100644 index 0000000..6a18c34 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance.component.scss @@ -0,0 +1,52 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +.instances-table { + width: 90%; + min-width: 1200px; + margin-top: 10px; + margin-bottom: 10px; + background-color: grayscale($color: #eeeaea); +} + +.mat-column-instanceId { + word-wrap: break-word; + white-space: unset; + flex: 0 0 28%; + width: 28%; +} + + +.table-dark { + background-color: #2d2d3d; +} + +.action-cell { + display: flex; + justify-content: flex-end; +} + +.display-none { + display: none; +} + +.spinner-container mat-spinner { + margin: 0 auto 0 auto; +} \ No newline at end of file diff --git a/webapp-frontend/src/app/policy-control/policy-instance.component.ts b/webapp-frontend/src/app/policy-control/policy-instance.component.ts new file mode 100644 index 0000000..ecf6f36 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance.component.ts @@ -0,0 +1,129 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { MatSort } from '@angular/material'; +import { Component, OnInit, ViewChild, Input, AfterViewInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { PolicyType } from '../interfaces/policy.types'; +import { PolicyInstanceDataSource } from './policy-instance.datasource'; +import { ErrorDialogService } from '../services/ui/error-dialog.service'; +import { NotificationService } from '../services/ui/notification.service'; +import { PolicyService } from '../services/policy/policy.service'; +import { ConfirmDialogService } from './../services/ui/confirm-dialog.service'; +import { PolicyInstance } from '../interfaces/policy.types'; +import { PolicyInstanceDialogComponent } from './policy-instance-dialog.component'; +import { getPolicyDialogProperties } from './policy-instance-dialog.component'; +import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { UiService } from '../services/ui/ui.service'; + +@Component({ + selector: 'rd-policy-instance', + templateUrl: './policy-instance.component.html', + styleUrls: ['./policy-instance.component.scss'] +}) + + +export class PolicyInstanceComponent implements OnInit, AfterViewInit { + instanceDataSource: PolicyInstanceDataSource; + @Input() policyType: PolicyType; + @Input() expanded: Observable; + @ViewChild(MatSort, { static: true }) sort: MatSort; + darkMode: boolean; + + constructor( + private policySvc: PolicyService, + private dialog: MatDialog, + private errorDialogService: ErrorDialogService, + private notificationService: NotificationService, + private confirmDialogService: ConfirmDialogService, + private ui: UiService) { + } + + ngOnInit() { + this.instanceDataSource = new PolicyInstanceDataSource(this.policySvc, this.sort, this.notificationService, this.policyType); + this.expanded.subscribe((isExpanded: boolean) => this.onExpand(isExpanded)); + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + } + + ngAfterViewInit() { + this.instanceDataSource.sort = this.sort; + } + + private onExpand(isExpanded: boolean) { + if (isExpanded) { + this.instanceDataSource.loadTable(); + } + } + + modifyInstance(instance: PolicyInstance): void { + this.policySvc.getPolicy(this.policyType.name, instance.id).subscribe( + (refreshedJson: any) => { + instance.json = JSON.stringify(refreshedJson); + this.dialog.open(PolicyInstanceDialogComponent, getPolicyDialogProperties(this.policyType, instance, this.darkMode)); + }, + (httpError: HttpErrorResponse) => { + this.notificationService.error('Could not refresh instance ' + httpError.message); + this.dialog.open(PolicyInstanceDialogComponent, getPolicyDialogProperties(this.policyType, instance, this.darkMode)); + } + ); + } + + hasInstances(): boolean { + return this.instanceDataSource.rowCount > 0; + } + + toLocalTime(utcTime: string): string { + const date = new Date(utcTime); + const toutc = date.toUTCString(); + return new Date(toutc + " UTC").toLocaleString(); + + } + + deleteInstance(instance: PolicyInstance): void { + this.confirmDialogService + .openConfirmDialog('Are you sure you want to delete this policy instance?') + .afterClosed().subscribe( + (res: any) => { + if (res) { + this.policySvc.deletePolicy(this.policyType.name, instance.id) + .subscribe( + (response: HttpResponse) => { + switch (response.status) { + case 200: + this.notificationService.success('Delete succeeded!'); + this.instanceDataSource.loadTable(); + break; + default: + this.notificationService.warn('Delete failed.'); + } + }, + (error: HttpErrorResponse) => { + this.errorDialogService.displayError(error.message); + }); + } + }); + } + + + +} diff --git a/webapp-frontend/src/app/policy-control/policy-instance.datasource.ts b/webapp-frontend/src/app/policy-control/policy-instance.datasource.ts new file mode 100644 index 0000000..b82ee75 --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-instance.datasource.ts @@ -0,0 +1,103 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { DataSource } from '@angular/cdk/collections'; +import { HttpErrorResponse } from '@angular/common/http'; +import { MatSort } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { merge } from 'rxjs'; +import { of } from 'rxjs/observable/of'; +import { catchError, finalize, map } from 'rxjs/operators'; +import { PolicyInstance } from '../interfaces/policy.types'; +import { PolicyService } from '../services/policy/policy.service'; +import { NotificationService } from '../services/ui/notification.service'; +import { PolicyType } from '../interfaces/policy.types'; + +export class PolicyInstanceDataSource extends DataSource { + + private policyInstanceSubject = new BehaviorSubject([]); + + private loadingSubject = new BehaviorSubject(false); + + public loading$ = this.loadingSubject.asObservable(); + + public rowCount = 1; // hide footer during intial load + + constructor( + private policySvc: PolicyService, + public sort: MatSort, + private notificationService: NotificationService, + private policyType: PolicyType) { + super(); + } + + loadTable() { + this.loadingSubject.next(true); + this.policySvc.getPolicyInstances(this.policyType.name) + .pipe( + catchError((her: HttpErrorResponse) => { + this.notificationService.error('Failed to get policy instances: ' + her.message); + return of([]); + }), + finalize(() => this.loadingSubject.next(false)) + ) + .subscribe((instances: PolicyInstance[]) => { + this.rowCount = instances.length; + this.policyInstanceSubject.next(instances); + }); + } + + connect(): Observable { + const dataMutations = [ + this.policyInstanceSubject.asObservable(), + this.sort.sortChange + ]; + return merge(...dataMutations).pipe(map(() => { + return this.getSortedData([...this.policyInstanceSubject.getValue()]); + })); + } + + disconnect(): void { + this.policyInstanceSubject.complete(); + this.loadingSubject.complete(); + } + + private getSortedData(data: PolicyInstance[]) { + if (!this.sort || !this.sort.active || this.sort.direction === '') { + return data; + } + + return data.sort((a, b) => { + const isAsc = this.sort.direction === 'asc'; + switch (this.sort.active) { + case 'instanceId': return compare(a.id, b.id, isAsc); + case 'ric': return compare(a.ric, b.ric, isAsc); + case 'service': return compare(a.service, b.service, isAsc); + case 'lastModified': return compare(a.lastModified, b.lastModified, isAsc) + default: return 0; + } + }); + } +} + +function compare(a: string, b: string, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} diff --git a/webapp-frontend/src/app/policy-control/policy-type.datasource.ts b/webapp-frontend/src/app/policy-control/policy-type.datasource.ts new file mode 100644 index 0000000..97d792e --- /dev/null +++ b/webapp-frontend/src/app/policy-control/policy-type.datasource.ts @@ -0,0 +1,106 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { CollectionViewer, DataSource } from '@angular/cdk/collections'; +import { HttpErrorResponse } from '@angular/common/http'; +import { MatSort } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { merge } from 'rxjs'; +import { of } from 'rxjs/observable/of'; +import { catchError, finalize, map } from 'rxjs/operators'; +import { PolicyType } from '../interfaces/policy.types'; +import { PolicyService } from '../services/policy/policy.service'; +import { NotificationService } from '../services/ui/notification.service'; + +export class PolicyTypeDataSource extends DataSource { + + private policyTypeSubject = new BehaviorSubject([]); + + private loadingSubject = new BehaviorSubject(false); + + public loading$ = this.loadingSubject.asObservable(); + + public rowCount = 1; // hide footer during intial load + + constructor(private policySvc: PolicyService, + private sort: MatSort, + private notificationService: NotificationService) { + super(); + } + + loadTable() { + this.loadingSubject.next(true); + this.policySvc.getPolicyTypes() + .pipe( + catchError((her: HttpErrorResponse) => { + this.notificationService.error('Failed to get policy types: ' + her.message); + return of([]); + }), + finalize(() => this.loadingSubject.next(false)) + ) + .subscribe((types: PolicyType[]) => { + this.rowCount = types.length; + for (let i = 0; i < types.length; i++) { + const policyType = types[i]; + try { + policyType.schemaObject = JSON.parse(policyType.schema); + } catch (jsonError) { + console.error('Could not parse schema: ' + policyType.schema); + policyType.schemaObject = { description: 'Incorrect schema: ' + jsonError }; + } + } + this.policyTypeSubject.next(types); + }); + } + + connect(collectionViewer: CollectionViewer): Observable { + const dataMutations = [ + this.policyTypeSubject.asObservable(), + this.sort.sortChange + ]; + return merge(...dataMutations).pipe(map(() => { + return this.getSortedData([...this.policyTypeSubject.getValue()]); + })); + } + + disconnect(collectionViewer: CollectionViewer): void { + this.policyTypeSubject.complete(); + this.loadingSubject.complete(); + } + + private getSortedData(data: PolicyType[]) { + if (!this.sort.active || this.sort.direction === '') { + return data; + } + + return data.sort((a, b) => { + const isAsc = this.sort.direction === 'asc'; + switch (this.sort.active) { + case 'name': return compare(a.name, b.name, isAsc); + default: return 0; + } + }); + } +} + +function compare(a: any, b: any, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} diff --git a/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.spec.ts b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.spec.ts new file mode 100644 index 0000000..6cc1be1 --- /dev/null +++ b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.spec.ts @@ -0,0 +1,31 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { TestBed } from '@angular/core/testing'; + +import { CaasIngressService } from './caas-ingress.service'; + +describe('CaasIngressService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: CaasIngressService = TestBed.get(CaasIngressService); + expect(service).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts new file mode 100644 index 0000000..9f3a03b --- /dev/null +++ b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { V1PodList } from '@kubernetes/client-node'; +import { Observable } from 'rxjs'; + +/** +* Services for calling the Controlpanel caas-ingress endpoints to get Kubernetes details. +*/ +@Injectable({ + providedIn: 'root' +}) +export class CaasIngressService { + + private basePath = 'api/caas-ingress'; + private podsPath = 'pods'; + + private buildPath(...args: any[]) { + let result = this.basePath; + args.forEach(part => { + result = result + '/' + part; + }); + return result; + } + + constructor(private httpClient: HttpClient) { + // injects to variable httpClient + } + + /** + * Gets list of pods + * @returns Observable that should yield a V1PodList + */ + getPodList(cluster: string, namespace: string): Observable { + const url = this.buildPath('pods', 'cluster', cluster, 'namespace', namespace); + return this.httpClient.get(url); + } + +} diff --git a/webapp-frontend/src/app/services/controlpanel/controlpanel.service.spec.ts b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.spec.ts new file mode 100644 index 0000000..d94a779 --- /dev/null +++ b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.spec.ts @@ -0,0 +1,32 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { TestBed } from '@angular/core/testing'; + +import { ControlpanelService } from './controlpanel.service'; + +describe('ControlpanelService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: ControlpanelService = TestBed.get(ControlpanelService); + expect(service).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts new file mode 100644 index 0000000..7391a7a --- /dev/null +++ b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts @@ -0,0 +1,65 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { ControlpanelSuccessTransport, EcompUser } from '../../interfaces/controlpanel.types'; + +@Injectable({ + providedIn: 'root' +}) + +/** + * Services to query the Controlpanel's admin endpoints. + */ +export class ControlpanelService { + + private basePath = 'api/admin/'; + + constructor(private httpClient: HttpClient) { + // injects to variable httpClient + } + + /** + * Checks app health + * @returns Observable that should yield a ControlpanelSuccessTransport + */ + getHealth(): Observable { + return this.httpClient.get(this.basePath + 'health'); + } + + /** + * Gets Controlpanel version details + * @returns Observable that should yield a ControlpanelSuccessTransport object + */ + getVersion(): Observable { + return this.httpClient.get(this.basePath + 'version'); + } + + /** + * Gets Controlpanel users + * @returns Observable that should yield a EcompUser array + */ + getUsers(): Observable { + return this.httpClient.get(this.basePath + 'user'); + } + +} diff --git a/webapp-frontend/src/app/services/policy/policy.service.spec.ts b/webapp-frontend/src/app/services/policy/policy.service.spec.ts new file mode 100644 index 0000000..de1f4e6 --- /dev/null +++ b/webapp-frontend/src/app/services/policy/policy.service.spec.ts @@ -0,0 +1,31 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { TestBed } from '@angular/core/testing'; + +import { PolicyService } from './policy.service'; + +describe('PolicyService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: PolicyService = TestBed.get(PolicyService); + expect(service).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/services/policy/policy.service.ts b/webapp-frontend/src/app/services/policy/policy.service.ts new file mode 100644 index 0000000..c5ee579 --- /dev/null +++ b/webapp-frontend/src/app/services/policy/policy.service.ts @@ -0,0 +1,110 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { PolicyType, PolicyInstance, PolicyInstanceAck } from '../../interfaces/policy.types'; +import { ControlpanelSuccessTransport } from '../../interfaces/controlpanel.types'; + +/** + * Services for calling the policy endpoints. + */ +@Injectable({ + providedIn: 'root' +}) +export class PolicyService { + + private basePath = 'api/policy'; + private policyTypePath = 'policytypes'; + private policyPath = 'policies'; + + private buildPath(...args: any[]) { + let result = this.basePath; + args.forEach(part => { + result = result + '/' + part; + }); + return result; + } + + constructor(private httpClient: HttpClient) { + // injects to variable httpClient + } + + /** + * Gets version details + * @returns Observable that should yield a String + */ + getVersion(): Observable { + const url = this.buildPath('version'); + return this.httpClient.get(url).pipe( + // Extract the string here + map(res => res['data']) + ); + } + + getPolicyTypes(): Observable { + const url = this.buildPath(this.policyTypePath); + return this.httpClient.get(url); + } + + getPolicyInstances(policyTypeId: string): Observable { + const url = this.buildPath(this.policyTypePath, policyTypeId, this.policyPath); + return this.httpClient.get(url); + } + + /** + * Gets policy parameters. + * @returns Observable that should yield a policy instance + */ + getPolicy(policyTypeId: string, policyInstanceId: string): Observable { + const url = this.buildPath(this.policyTypePath, policyTypeId, this.policyPath, policyInstanceId); + return this.httpClient.get(url); + } + + /** + * Creates or replaces policy instance. + * @param policyTypeId ID of the policy type that the instance will have + * @param policyInstanceId ID of the instance + * @param policyJson Json with the policy content + * @returns Observable that should yield a response code, no data + */ + putPolicy(policyTypeId: string, policyInstanceId: string, policyJson: string, ric: string): Observable { + const url = this.buildPath(this.policyTypePath, policyTypeId, this.policyPath, policyInstanceId) + "?ric=" + ric; + return this.httpClient.put(url, policyJson, { observe: 'response' }); + } + + /** + * Deletes a policy instance. + * @param policyTypeId + * @returns Observable that should yield a response code, no data + */ + deletePolicy(policyTypeId: string, policyInstanceId: string): Observable { + const url = this.buildPath(this.policyTypePath, policyTypeId, this.policyPath, policyInstanceId); + return this.httpClient.delete(url, { observe: 'response' }); + } + + + getRics(policyTypeId: string): Observable { + const url = this.buildPath('rics') + '?policyType=' + policyTypeId; + return this.httpClient.get(url); + } +} diff --git a/webapp-frontend/src/app/services/ui/confirm-dialog.service.spec.ts b/webapp-frontend/src/app/services/ui/confirm-dialog.service.spec.ts new file mode 100644 index 0000000..c8992eb --- /dev/null +++ b/webapp-frontend/src/app/services/ui/confirm-dialog.service.spec.ts @@ -0,0 +1,32 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { TestBed } from '@angular/core/testing'; + +import { ConfirmDialogService } from './confirm-dialog.service'; + +describe('ConfirmDialogService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: ConfirmDialogService = TestBed.get(ConfirmDialogService); + expect(service).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/services/ui/confirm-dialog.service.ts b/webapp-frontend/src/app/services/ui/confirm-dialog.service.ts new file mode 100644 index 0000000..184d64f --- /dev/null +++ b/webapp-frontend/src/app/services/ui/confirm-dialog.service.ts @@ -0,0 +1,55 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from './../../ui/confirm-dialog/confirm-dialog.component'; +import { UiService } from './ui.service'; + +@Injectable({ + providedIn: 'root' +}) +export class ConfirmDialogService { + + darkMode: boolean; + panelClass = ''; + + constructor(private dialog: MatDialog, + private ui: UiService) { } + + openConfirmDialog(msg: string) { + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + if (this.darkMode) { + this.panelClass = 'dark-theme'; + } else { + this.panelClass = ''; + } + return this.dialog.open(ConfirmDialogComponent, { + panelClass: this.panelClass, + width: '480px', + position: { top: '100px' }, + data: { + message: msg + } + }); + } +} diff --git a/webapp-frontend/src/app/services/ui/error-dialog.service.ts b/webapp-frontend/src/app/services/ui/error-dialog.service.ts new file mode 100644 index 0000000..82faeac --- /dev/null +++ b/webapp-frontend/src/app/services/ui/error-dialog.service.ts @@ -0,0 +1,52 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { ErrorDialogComponent } from '../../ui/error-dialog/error-dialog.component'; +import { MatDialog } from '@angular/material/dialog'; +import { Injectable } from '@angular/core'; +import { UiService } from './ui.service'; + +@Injectable() +export class ErrorDialogService { + + darkMode: boolean; + panelClass = ''; + public errorMessage = ''; + + constructor(private dialog: MatDialog, + private ui: UiService) { } + + public displayError(error: string) { + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + if (this.darkMode) { + this.panelClass = 'dark-theme'; + } else { + this.panelClass = ''; + } + return this.dialog.open(ErrorDialogComponent, { + panelClass: this.panelClass, + width: '400px', + position: { top: '100px' }, + disableClose: true, + data: { 'errorMessage': error } + }); + } +} diff --git a/webapp-frontend/src/app/services/ui/notification.service.spec.ts b/webapp-frontend/src/app/services/ui/notification.service.spec.ts new file mode 100644 index 0000000..61110c9 --- /dev/null +++ b/webapp-frontend/src/app/services/ui/notification.service.spec.ts @@ -0,0 +1,32 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { TestBed } from '@angular/core/testing'; + +import { NotificationService } from './notification.service'; + +describe('NotificationService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: NotificationService = TestBed.get(NotificationService); + expect(service).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/services/ui/notification.service.ts b/webapp-frontend/src/app/services/ui/notification.service.ts new file mode 100644 index 0000000..09baa38 --- /dev/null +++ b/webapp-frontend/src/app/services/ui/notification.service.ts @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { Injectable } from '@angular/core'; +import { ToastrService } from 'ngx-toastr'; + +@Injectable({ + providedIn: 'root' +}) +export class NotificationService { + + constructor(public toastr: ToastrService) { } + + successConfig = { + timeOut: 10000, + closeButton: true + }; + + warningConfig = { + disableTimeOut: true, + closeButton: true + }; + + errorConfig = { + disableTimeOut: true, + closeButton: true + }; + + success(msg: string) { + this.toastr.success(msg, '', this.successConfig); + } + + warn(msg: string) { + this.toastr.warning(msg, '', this.warningConfig); + } + + error(msg: string) { + this.toastr.error(msg, '', this.errorConfig); + } + +} diff --git a/webapp-frontend/src/app/services/ui/ui.service.spec.ts b/webapp-frontend/src/app/services/ui/ui.service.spec.ts new file mode 100644 index 0000000..492b4aa --- /dev/null +++ b/webapp-frontend/src/app/services/ui/ui.service.spec.ts @@ -0,0 +1,34 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import {inject, TestBed} from '@angular/core/testing'; + +import {UiService} from './ui.service'; + +describe('UiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [UiService] + }); + }); + + it('should be created', inject([UiService], (service: UiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/webapp-frontend/src/app/services/ui/ui.service.ts b/webapp-frontend/src/app/services/ui/ui.service.ts new file mode 100644 index 0000000..30f92d0 --- /dev/null +++ b/webapp-frontend/src/app/services/ui/ui.service.ts @@ -0,0 +1,32 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable() +export class UiService { + + darkModeState: BehaviorSubject; + + constructor() { + // TODO: if the user is signed in get the default value from Firebase + this.darkModeState = new BehaviorSubject(true); + } +} diff --git a/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.html b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.html new file mode 100644 index 0000000..c4d475a --- /dev/null +++ b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.html @@ -0,0 +1,29 @@ + + +
+
+
+ {{data.message}} +
+ \ No newline at end of file diff --git a/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.spec.ts b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.spec.ts new file mode 100644 index 0000000..266b581 --- /dev/null +++ b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.spec.ts @@ -0,0 +1,45 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmDialogComponent } from './confirm-dialog.component'; + +describe('ConfirmDialogComponent', () => { + let component: ConfirmDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfirmDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfirmDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.ts b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 0000000..1ad54b9 --- /dev/null +++ b/webapp-frontend/src/app/ui/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,39 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +import { Component, OnInit, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'rd-confirm-dialog', + templateUrl: './confirm-dialog.component.html', +}) +export class ConfirmDialogComponent implements OnInit { + + constructor(@Inject(MAT_DIALOG_DATA) public data, + public dialogRef: MatDialogRef) { } + + ngOnInit() { + } + + closeDialog() { + this.dialogRef.close(false); + } +} diff --git a/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.html b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.html new file mode 100644 index 0000000..2b44f0f --- /dev/null +++ b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.html @@ -0,0 +1,27 @@ + + +
+
{{data.errorMessage}}
+
+
+ +
+ diff --git a/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.scss b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.scss new file mode 100644 index 0000000..93c0e83 --- /dev/null +++ b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.scss @@ -0,0 +1,24 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + + .error_message_text { + overflow-y: overlay; + max-height: 150px; + } diff --git a/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.ts b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.ts new file mode 100644 index 0000000..04a0684 --- /dev/null +++ b/webapp-frontend/src/app/ui/error-dialog/error-dialog.component.ts @@ -0,0 +1,41 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; + +export interface ErrorData { + errorMessage: string; +} + +@Component({ + selector: 'rd-error-dialog', + templateUrl: './error-dialog.component.html', + styleUrls: ['./error-dialog.component.scss'] +}) + +export class ErrorDialogComponent { + + constructor(private dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ErrorData) { } + + public closeDialog = () => { + this.dialogRef.close(); + } +} diff --git a/webapp-frontend/src/app/ui/policy-card/policy-card.component.html b/webapp-frontend/src/app/ui/policy-card/policy-card.component.html new file mode 100644 index 0000000..2c82628 --- /dev/null +++ b/webapp-frontend/src/app/ui/policy-card/policy-card.component.html @@ -0,0 +1,31 @@ + +
+
+ Policy Control


+
+ buildConfig
+ + +
+
+ +
+
diff --git a/webapp-frontend/src/app/ui/policy-card/policy-card.component.scss b/webapp-frontend/src/app/ui/policy-card/policy-card.component.scss new file mode 100644 index 0000000..30a3dfa --- /dev/null +++ b/webapp-frontend/src/app/ui/policy-card/policy-card.component.scss @@ -0,0 +1,58 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +.policy__card { + background-color: #ffffff; + box-shadow: 0 0 2rem rgba(0, 0, 255, 0.1); + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr; + padding: 2rem; + margin: 2rem; + width: 19rem; + height: 30rem; + justify-items: center; + cursor: pointer; + border-radius: 1.75rem; + animation: fadein 1.25s ease-in-out 0ms 1; + color: #443282; +} + +.add__card-dark { + background: linear-gradient(to bottom, rgb(78, 78, 129), rgb(45, 44, 61)); + color: white; +} + +.card__title { + text-transform: uppercase; + letter-spacing: 0.1rem; +} + +.body__container { + align-self: end; + display: flex; + justify-content: space-between; + align-items: center; + flex-flow: column; +} + +.add__icon { + width: 10rem; + margin-bottom: 1.15rem; +} \ No newline at end of file diff --git a/webapp-frontend/src/app/ui/policy-card/policy-card.component.spec.ts b/webapp-frontend/src/app/ui/policy-card/policy-card.component.spec.ts new file mode 100644 index 0000000..eb678a9 --- /dev/null +++ b/webapp-frontend/src/app/ui/policy-card/policy-card.component.spec.ts @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {PolicyCardComponent} from './policy-card.component'; + +describe('PolicyCardComponent', () => { + let component: PolicyCardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PolicyCardComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PolicyCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/webapp-frontend/src/app/ui/policy-card/policy-card.component.ts b/webapp-frontend/src/app/ui/policy-card/policy-card.component.ts new file mode 100644 index 0000000..902e260 --- /dev/null +++ b/webapp-frontend/src/app/ui/policy-card/policy-card.component.ts @@ -0,0 +1,46 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { UiService } from '../../services/ui/ui.service'; + +@Component({ + selector: 'rd-policy-card', + templateUrl: './policy-card.component.html', + styleUrls: ['./policy-card.component.scss'] +}) +export class PolicyCardComponent implements OnInit, OnDestroy { + darkMode: boolean; + + constructor(public router: Router, private ui: UiService) { } + + ngOnInit() { + this.ui.darkModeState.subscribe((isDark) => { + this.darkMode = isDark; + }); + } + + ngOnDestroy() { } + + openDetails() { + this.router.navigateByUrl('../../policy'); + } + +} diff --git a/webapp-frontend/src/assets/ORANlogo.png b/webapp-frontend/src/assets/ORANlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3dfb1b352242809609d0d173a545a607b75d0a GIT binary patch literal 61444 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 PHL|^Cf3@n@JIVhGK5rH^ literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/at_t.png b/webapp-frontend/src/assets/at_t.png new file mode 100644 index 0000000000000000000000000000000000000000..3cced1d5ce4668fbf3b33064aaaa6920bc8130b6 GIT binary patch literal 5778 zcma)Ac{o(<`=3JD_cF3C*_nlzVInaGV-KN}j9D1lFvd0^QOZavWvM9p7Fk+kuVL(@ z$dattck!kuKYEw%`^WeCUcYl)=REgwpZjy)pXXlwI49P|%7lmW7$*P#;K7(0+3u~- z{hR&J-cwTlM%msXN<}+S?Z`xGFqT397~sin1Zj*9)}3HWz~V#wTM4=V0Lw3uy%W{R z(gKMi`)FYIZ8SoB{PxfQfUbUs9~S3Dph~+D+)2KAvMbf~veG2Ho~$Fx5^U**B6yHY zX%vDT&B`7}^TO%iW%W-=>xLlr9QY8ZSm_WSZ{Gl9h@R|kzsNm#Uk#F#{%u0_(v$s@ zl#`{6G>S|iNW(N>>NqeIB8|||fWTk~1XN8L3WjKbzz`5bQyrp%)Y3wN!P0+SvU|}e zcp}o)$oQ{VdpkW@4=U9U2?7NN2WtdtYLF@JAc&5R4hRedL80n<7U}_^zEo_8x^IBo z-yVzz0XPcDk4hr@O7DBbx{(8^da`>=|2%?^pQYtLj(r3EO4MG;Kp|K^5JUqE^6}X} z*Kg|psx9F^H2$k~fPJVR0c1-EAO})#d-Wj7{SDsB-Tw~sw;>+)kDXs2#ryX;@i-8{ zo8Uw6r3UPgg8XK*#~f)*A?+0q>up5F1@6Da80pCd29oedv?fZ^0FKf`q2O9Z1`vog z3~iuo2#2B2C@@&d5WXL5-@(6udm0V=9u}&jsSPvKF+gZ(Lm?0}+)!J~00l;%3=JV* zn1PPr-&l-q02S+tBkTv=$CCbo)%l-TB#J`7Qpps1GTHm@R>63C2L@0n`)X+v>UVQU zD>;&U@#NqD<^5{@#g{-K1rhMZ6ta)>?{XkX|AhsNK!g+VFswQeOCYM_@LCXcH!UJe z9fF5yX(1puJXT9v_AfmCU#a^$1OG2PXpa;ghoq9I-h{vU)xewjm*h>_?-`^w*4KS6 zIqG-<5gX`Dl|AWAb|+uNQmGd`$P^My7qs7#-lRRyZ|P4w=wDuctN+!+e_QTN#=iK^ zNbYU^8ES&>-Xv4@M%GY}&m8~|RKXY-*oO?&oa6AbcMQ_IJXh=dc}N7#QT8xL!1dvk z16b~)rC6R@UMg$a5R3Rpyo&!7J51_>f(+9|iY=i#*WA<$1_@=`esmf^|$nZmGFxYOQBaZpNQS)$il)G z=MB)Orwi$Vz4kD`8MepKyNN48^-V{nJ;xG#L>V3}#Q5Ssu9@rPzC%+Eku|TT7-+3u z%9bCF4pJrD=HL>?q`vEW6dJ3s$~0_*w_U}iv=A#=@K95Q4`JzpEi((t4-vtWQo=3U z&L_`jdJLIWmpBgj1Pv_02bRK~PXYW2+ynquIK{(V%5)h7Ab86t5)+Vf7t=V|noC8# z@LYa0=(VE6A7i5)e;)U0Q03YE;9OR^W{O&%^k5T_2ME{6Jkwk%Ej-Zf(l?c__odDwu5T>VVmIiB zgWQQf+T5()O;X;BQ{H00Z$sLJ4n|IKSpLjK+^fSoMjDiQ5J4Qk(zPDncFLeM{AspU z)l-$MUQg8sebDy%$$r)>mxZR_(NBWn)6WqP9;nY!E5|6+YdYP zmJ9Fm86sGF%yQe*%k1c$$7`}Diq2$tz(v>xl9C)1l zn%uaNtV`gxn{(p}2M3>rnn%X;1*-ktrII*>Fqbs6#^r zQD7lfM*Nl*H88OIp`I6U>p^SR1?Sc@Ub=XG8^Rxne<#i3k20|S*oc0gy;ZHrwRmEH zLlI?`*E3lY#4V$p*)$s|(ZfAf;ryf~NHxkCC;EH?&ri=Q(|dI4!Dv6~qglYrwv)xc zsWB_sR$dn8+TySvK3=VS=RyOIoEK~G<2e@{F{g+#2|M$h!Ja0`RSOapaKvCibLsd> zP~Zffet-d9_kWFfZT0ZQwu2I8qt^>fGl$x*$UPH=W%hT3ATKrL>cHB)g6a_H6Ys;w z2lQW-4#ZBqIKm!6o#)PWC2ErJ`I=D=^naEgNeHKUy8Lks?Rkb-nvMx>0nuAWimbZ?HQXy48!<37ML(Z-#qBVMXzhS%bb-7h3E@|i3fJ1Ij zYcwEj0lG$Vc($_{)19PS5i&ib8Yw(K)W#*sroUaz1*#0oe>nT%`KdEG=PqA1JDHy1 za1-QgH_#{Cd;19XT*5rozCxK9>-lO^D-Uuk3wf0l8cw)mEoaPL zjYsp*)e6|5QI2W;(Jvim8iexKQM&LVww8)-925QR-z=E77wna;X!wr&GPNz-ZfI{` z;nt?=+Kx9}>=Q1h`?XOefNY!bG>9vX5O63v}tOhB!Bwbw5+@y4T%7iucaYTQb(Ro z8kbn+RYB@nj=ZY|W__=c@UjYOXOftv*TYZ}ec_Vro0iR0Wm$U12N#S>SevYSEtDCz z(c^s@ckJGZeWeelw3#}A+Y~2vi6xdMaswvN5YHMuT5)&GAvjpz;Ex%GjIP!9%a5uI zLZ2MA*VU=zH_y*^M~T*4lBL7n4|Vw!uC$lmtk+HiF>l|%mm}=$;<>bK>J#z(hhZ#_Vu!cZL0EjdS@*Bs5x4#Bgw9BMM~^c`X>$Z=n)sj z{9`Tgx)h_E=PGv3+Y2_J%Trv_M~b2hE>6FAi{majYtW5wPCCEz<5jW9+RnH`hwJLj zbOxt94y#12uV~t7tz#Fi7Q!YiEj^`}gg7xzEV1Gl(Tw#~lc%Qbuj5#*C>5e#P+|h} z2ztS39+s|~A`)Axf)7hQ#2@#aarKaVC%|bSGQVY%BjVMa^RA0uneg^C^$h!AB+z#k zBe1jd9hmz?2NFMlC~CW2CVWz0{BFEuPai2*xM75;G~dl!bqKI{zgaunJKCxG=0+Hg z-kPM*r1I=`SJT^X)=J!qRVhq11$W8KMqwq_KdgF88Js757v5a1km!`0YYeG#cZd~% zp~8S?#!iW%ts|?``qMvr9tg_il0ulQDXWeEl&exCW*JQyJ069Pqj&~A2&u`IOR=R9 z(7T@bbFIB65f$uRET6U2FHH@%9q^pPobH?wKH!T~wUpV>eeia9Ql z25*;-NJ>^&_g3l_dt?UtJTH&yDAs&hV5AyWu6pg~XXW#`Yva`1mD<1vF-g&f2~`}S z6cy#9M>bIUNu&VjT|pp^ml)FPaoX8iQ>+!srhI>#ep{R&>Li~l(0Y#U(qWtRZYr|G z2?fi%pA*+|n>Bv$i1}y!0G^sgt8L{{mPaMHJd{l>)&TM49dLu|xf1Z0iGV3gAxymUbBDaAw zxqZgITB}1j@S@Dk^5DGj%+E(2Dj7e`11>ik>V^E!2##K_U#Sz>>Kw80FyRA7&;LRM zC*$x1$%H8SH+JH74l8fjBdPg-RuYC>uK_Jc0}Rc+SF4@+;>AdF>n->u8c}P$=w||r z@3J?ZZ>Pfj6Rb4E?SV}e+UAo@{DvVDTTQ@Ub#)x73bvB(d%^}~O3u|rFxvCn;$nX2 z+4%78e4jN`n-CdV`pEBVf)lUK7i%ual+YTMzs+@X+;=+uI$)g?cCuZ>&gx7HQKf`y zx>}y&w5WA%PonCuBe!_Tp|`hj8ESR1b85R^bR(R6nzw4cFjK#c)H=cWU~W@at0-{zIs>;_&1(k!{fUsN#2U?V}~K z_KRiu>yHn~_5E9*>(#30(UQSM?Nt7!Zq3675x+vb4=jt0P&l*A%r4H>Jl%F% zXrS7eQ27K0I;%QX7VcHnVZ&)LentF7bZ_~^upohES^ph1V8a(ETUuI%0xfHvu52co zdSP=i_7|)u0WErRm@SdH&ea8txVWvtI%Omh70TN|6znSe1ILa+aZj7oetgo^u5Z4+ zQFo`nCPJY7?D!Wk`^)18LS1Bo^byTJHmD--batG(iMY^~Sdo|c>2b}TzP|Wc_qRpF zkrOT1YuEbw5xk(yGj&0gVmuhOAR6Aj;rJ&PtSkM_t&QJ8Kk8Mbb*iMK3S zkA_#}Gs`3wb%%#HI=;;~@*qiJOL+WTKv3KX3Gjhf)sIi6O>GHesr?(1oTO2B4Hux$*&97~>kf=Xeq}CRh$nATW_reWl34(i+TMCo( zvg-s2lb!mmISbPfRIufBw`*7>SvSc%*Y<|uR(e)(_Q=3{FRRHS$C@>+KbqSmQ_tVL zV5wYlIW;POmJ)NMODWrV8bE?K5LAXD8CFI0h%c!bvYoJPD^VBG?>7~>VPMFZvCp-H z5oM#Z4XGz$i0g@i8t=>{{8>0+#6tl~VH&4m1#HTklS6GWF+vT6oQG5;)hBb@n@+!Y z^64pC=5gU>CSyr^P_$`6;9TVZsmr-?tS;u^$@G!EFDJjBZ~T6K%op&pojQ`{#?16T z+WxKDg>C>$nehc*BMUqnob} zfop}aN8`RqI)UrQogY_7>Cv82x_dOmf)I+)&J06g>T~&4Bu?I4eH(hUD zN`rf~q_I4SV7dB!<(l}^gV&{=-U+zTYe4v8PV5OZxrtqb$bZ!w1LH1Gx~S_rJdo>L zhaF4nTsiE~Yxa_({SU3Y(k!{?XbzU|a54J8(KzMWCu6NQcLkGq{*nE{$Vl1ws+zkmsoG%J1Dn#nA}sZ`ft2*`Whw)YmFK`%P=sh{`zEOy9u{wQzE zIdvggeD1>ic-DaD>YXElr{n_A+)9muvc12Qr78EkB8nrQD*-Cwu1)xr%tzj;Hk-B7 zj23aS0ixSFNiSItxSR8z(7(=<$m+!XG{M48%JD0U8ezr4Jt;t}#3 z_;a-^(uWx7rkIGtNl_E8+@By(>KjpJ0&p{}N-+Rz@X;u2KI76#Hn1 literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/intelligence.png b/webapp-frontend/src/assets/intelligence.png new file mode 100644 index 0000000000000000000000000000000000000000..c40693e06b5300e78b325c97870e9f4591a93d71 GIT binary patch literal 278486 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 literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/latency.png b/webapp-frontend/src/assets/latency.png new file mode 100644 index 0000000000000000000000000000000000000000..874d11b3f5330eaa9aea4c3d92ec68ae0917efec GIT binary patch literal 13966 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 literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/mockdata/config.json b/webapp-frontend/src/assets/mockdata/config.json new file mode 100644 index 0000000..255b3fe --- /dev/null +++ b/webapp-frontend/src/assets/mockdata/config.json @@ -0,0 +1,872 @@ +[ + { + "metadata": { + "name": "Automatic Neighbor Relation", + "configName": "anr-appconfig", + "namespace": "ricxapp" + }, + "descriptor": { + "$id": "http://example.com/root.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": {}, + "properties": { + "controls": { + "$id": "#/properties/controls", + "properties": { + "active": { + "$id": "#/properties/controls/properties/active", + "default": false, + "examples": [ + true + ], + "title": "The Active Schema", + "type": "boolean" + }, + "interfaceId": { + "$id": "#/properties/controls/properties/interfaceId", + "properties": { + "globalENBId": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId", + "properties": { + "bits": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/bits", + "default": 0, + "examples": [ + 28 + ], + "title": "The Bits Schema", + "maximum": 1024, + "type": "integer" + }, + "id": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/id", + "default": 0, + "examples": [ + 202251 + ], + "title": "The Id Schema", + "type": "integer" + }, + "plmnid": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/plmnid", + "default": "", + "examples": [ + "310150" + ], + "pattern": "^(.*)$", + "title": "The Plmnid Schema", + "type": "string" + } + }, + "required": [ + "plmnid", + "id", + "bits" + ], + "title": "The Globalenbid Schema", + "type": "object" + } + }, + "required": [ + "globalENBId" + ], + "title": "The Interfaceid Schema", + "type": "object" + }, + "subscription": { + "$id": "#/properties/controls/properties/subscription", + "properties": { + "retries": { + "$id": "#/properties/controls/properties/subscription/properties/retries", + "default": 0, + "examples": [ + 1 + ], + "title": "The Retries Schema", + "type": "integer" + }, + "retryto": { + "$id": "#/properties/controls/properties/subscription/properties/retryto", + "default": 0, + "examples": [ + 2 + ], + "title": "The Retryto Schema", + "type": "integer" + } + }, + "required": [ + "retries", + "retryto" + ], + "title": "The Subscription Schema", + "type": "object" + } + }, + "required": [ + "active", + "subscription", + "interfaceId" + ], + "title": "The Controls Schema", + "type": "object" + }, + "db": { + "$id": "#/properties/db", + "properties": { + "host": { + "$id": "#/properties/db/properties/host", + "default": "", + "examples": [ + "localhost" + ], + "pattern": "^(.*)$", + "title": "The Host Schema", + "type": "string" + }, + "namespaces": { + "$id": "#/properties/db/properties/namespaces", + "items": { + "$id": "#/properties/db/properties/namespaces/items", + "default": "", + "examples": [ + "sdl", + "rnib" + ], + "pattern": "^(.*)$", + "title": "The Items Schema", + "type": "string" + }, + "title": "The Namespaces Schema", + "type": "array" + }, + "port": { + "$id": "#/properties/db/properties/port", + "default": 0, + "examples": [ + 6379 + ], + "title": "The Port Schema", + "type": "integer" + } + }, + "required": [ + "host", + "port", + "namespaces" + ], + "title": "The Db Schema", + "type": "object" + }, + "local": { + "$id": "#/properties/local", + "properties": { + "host": { + "$id": "#/properties/local/properties/host", + "default": "", + "examples": [ + ":8080" + ], + "pattern": "^(.*)$", + "title": "The Host Schema", + "type": "string" + } + }, + "required": [ + "host" + ], + "title": "The Local Schema", + "type": "object" + }, + "logger": { + "$id": "#/properties/logger", + "properties": { + "level": { + "$id": "#/properties/logger/properties/level", + "default": 0, + "examples": [ + 3 + ], + "title": "The Level Schema", + "type": "integer" + } + }, + "required": [ + "level" + ], + "title": "The Logger Schema", + "type": "object" + }, + "metrics": { + "$id": "#/properties/metrics", + "items": { + "$id": "#/properties/metrics/items", + "properties": { + "description": { + "$id": "#/properties/metrics/items/properties/description", + "default": "", + "examples": [ + "The total number of UE context creation events" + ], + "pattern": "^(.*)$", + "title": "The Description Schema", + "type": "string" + }, + "enabled": { + "$id": "#/properties/metrics/items/properties/enabled", + "default": false, + "examples": [ + true + ], + "title": "The Enabled Schema", + "type": "boolean" + }, + "name": { + "$id": "#/properties/metrics/items/properties/name", + "default": "", + "examples": [ + "UEContextCreated" + ], + "pattern": "^(.*)$", + "title": "The Name Schema", + "type": "string" + }, + "type": { + "$id": "#/properties/metrics/items/properties/type", + "default": "", + "examples": [ + "counter" + ], + "pattern": "^(.*)$", + "title": "The Type Schema", + "type": "string" + } + }, + "required": [ + "name", + "type", + "enabled", + "description" + ], + "title": "The Items Schema", + "type": "object" + }, + "title": "The Metrics Schema", + "type": "array" + }, + "rmr": { + "$id": "#/properties/rmr", + "properties": { + "maxSize": { + "$id": "#/properties/rmr/properties/maxSize", + "default": 0, + "examples": [ + 2072 + ], + "title": "The Maxsize Schema", + "type": "integer" + }, + "numWorkers": { + "$id": "#/properties/rmr/properties/numWorkers", + "default": 0, + "examples": [ + 1 + ], + "title": "The Numworkers Schema", + "type": "integer" + }, + "protPort": { + "$id": "#/properties/rmr/properties/protPort", + "default": "", + "examples": [ + "tcp:4560" + ], + "pattern": "^(.*)$", + "title": "The Protport Schema", + "type": "string" + }, + "rxMessages": { + "$id": "#/properties/rmr/properties/rxMessages", + "items": { + "$id": "#/properties/rmr/properties/rxMessages/items", + "default": "", + "examples": [ + "RIC_SUB_RESP", + "RIC_SUB_FAILURE", + "RIC_SUB_DEL_RESP", + "RIC_SUB_DEL_FAILURE", + "RIC_INDICATION" + ], + "pattern": "^(.*)$", + "title": "The Items Schema", + "type": "string" + }, + "title": "The Rxmessages Schema", + "type": "array" + }, + "txMessages": { + "$id": "#/properties/rmr/properties/txMessages", + "items": { + "$id": "#/properties/rmr/properties/txMessages/items", + "default": "", + "examples": [ + "RIC_SUB_REQ", + "RIC_SUB_DEL_REQ" + ], + "pattern": "^(.*)$", + "title": "The Items Schema", + "type": "string" + }, + "title": "The Txmessages Schema", + "type": "array" + } + }, + "required": [ + "protPort", + "maxSize", + "numWorkers", + "txMessages", + "rxMessages" + ], + "title": "The Rmr Schema", + "type": "object" + } + }, + "required": [ + "local", + "logger", + "rmr", + "db", + "controls", + "metrics" + ], + "title": "The Root Schema", + "type": "object" + }, + "config": { + "controls": { + "active": true, + "interfaceId": { + "globalENBId": { + "bits": 28, + "id": 202251, + "plmnid": "310150" + } + }, + "subscription": { + "retries": 1, + "retryto": 2 + } + }, + "db": { + "host": "localhost", + "namespaces": [ + "sdl", + "rnib" + ], + "port": 6379 + }, + "local": { + "host": ":8080" + }, + "logger": { + "level": 3 + }, + "metrics": [ + { + "description": "The total number of UE context creation events", + "enabled": true, + "name": "UEContextCreated", + "type": "counter" + }, + { + "description": "The total number of UE context release events", + "enabled": true, + "name": "UEContextReleased", + "type": "counter" + } + ], + "rmr": { + "maxSize": 2072, + "numWorkers": 1, + "protPort": "tcp:4560", + "rxMessages": [ + "RIC_SUB_RESP", + "RIC_SUB_FAILURE", + "RIC_SUB_DEL_RESP", + "RIC_SUB_DEL_FAILURE", + "RIC_INDICATION" + ], + "txMessages": [ + "RIC_SUB_REQ", + "RIC_SUB_DEL_REQ" + ] + } + }, + "layout": [ + { + "key": "controls.active", + "title": "Active" + }, + { + "key": "controls.interfaceId.globalENBId", + "title": "Global ENB Id" + }, + { + "type": "flex", + "flex-flow": "row wrap", + "items": [ + { + "key": "controls.interfaceId.globalENBId.plmnid", + "title": "Plmn Id" + }, + { + "key": "controls.interfaceId.globalENBId.id", + "title": "Id" + + }, + { + "key": "controls.interfaceId.globalENBId.bits", + "title": "Bits" + } + ] + }, + { + "key": "controls.subscription", + "title": "Subscription" + }, + { + "type": "flex", + "flex-flow": "row wrap", + "items": [ + { + "key": "controls.subscription.retries", + "title": "Retries" + }, + { + "key": "controls.subscription.retryto", + "title": "Retry to" + } + ] + } + ] + }, + { + "metadata": { + "name": "UE Event Collector", + "configName": "UEEC-appconfig", + "namespace": "ricxapp" + }, + "descriptor": { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/root.json", + "type": "object", + "title": "The Root Schema", + "required": [ + "local", + "logger", + "rmr", + "db", + "controls", + "metrics" + ], + "properties": { + "local": { + "$id": "#/properties/local", + "type": "object", + "title": "The Local Schema", + "required": [ + "host" + ], + "properties": { + "host": { + "$id": "#/properties/local/properties/host", + "type": "string", + "title": "The Host Schema", + "default": "", + "examples": [ + ":8080" + ], + "pattern": "^(.*)$" + } + } + }, + "logger": { + "$id": "#/properties/logger", + "type": "object", + "title": "The Logger Schema", + "required": [ + "level" + ], + "properties": { + "level": { + "$id": "#/properties/logger/properties/level", + "type": "integer", + "title": "The Level Schema", + "default": 0, + "examples": [ + 3 + ] + } + } + }, + "rmr": { + "$id": "#/properties/rmr", + "type": "object", + "title": "The Rmr Schema", + "required": [ + "protPort", + "maxSize", + "numWorkers", + "txMessages", + "rxMessages" + ], + "properties": { + "protPort": { + "$id": "#/properties/rmr/properties/protPort", + "type": "string", + "title": "The Protport Schema", + "default": "", + "examples": [ + "tcp:4560" + ], + "pattern": "^(.*)$" + }, + "maxSize": { + "$id": "#/properties/rmr/properties/maxSize", + "type": "integer", + "title": "The Maxsize Schema", + "default": 0, + "examples": [ + 2072 + ] + }, + "numWorkers": { + "$id": "#/properties/rmr/properties/numWorkers", + "type": "integer", + "title": "The Numworkers Schema", + "default": 0, + "examples": [ + 1 + ] + }, + "txMessages": { + "$id": "#/properties/rmr/properties/txMessages", + "type": "array", + "title": "The Txmessages Schema", + "items": { + "$id": "#/properties/rmr/properties/txMessages/items", + "type": "string", + "title": "The Items Schema", + "default": "", + "examples": [ + "RIC_SUB_REQ", + "RIC_SUB_DEL_REQ" + ], + "pattern": "^(.*)$" + } + }, + "rxMessages": { + "$id": "#/properties/rmr/properties/rxMessages", + "type": "array", + "title": "The Rxmessages Schema", + "items": { + "$id": "#/properties/rmr/properties/rxMessages/items", + "type": "string", + "title": "The Items Schema", + "default": "", + "examples": [ + "RIC_SUB_RESP", + "RIC_SUB_FAILURE", + "RIC_SUB_DEL_RESP", + "RIC_SUB_DEL_FAILURE", + "RIC_INDICATION" + ], + "pattern": "^(.*)$" + } + } + } + }, + "db": { + "$id": "#/properties/db", + "type": "object", + "title": "The Db Schema", + "required": [ + "host", + "port", + "namespaces" + ], + "properties": { + "host": { + "$id": "#/properties/db/properties/host", + "type": "string", + "title": "The Host Schema", + "default": "", + "examples": [ + "localhost" + ], + "pattern": "^(.*)$" + }, + "port": { + "$id": "#/properties/db/properties/port", + "type": "integer", + "title": "The Port Schema", + "default": 0, + "examples": [ + 6379 + ] + }, + "namespaces": { + "$id": "#/properties/db/properties/namespaces", + "type": "array", + "title": "The Namespaces Schema", + "items": { + "$id": "#/properties/db/properties/namespaces/items", + "type": "string", + "title": "The Items Schema", + "default": "", + "examples": [ + "sdl", + "rnib" + ], + "pattern": "^(.*)$" + } + } + } + }, + "controls": { + "$id": "#/properties/controls", + "type": "object", + "title": "The Controls Schema", + "required": [ + "active", + "requestorId", + "ranFunctionId", + "ricActionId", + "interfaceId" + ], + "properties": { + "active": { + "$id": "#/properties/controls/properties/active", + "type": "boolean", + "title": "The Active Schema", + "default": false, + "examples": [ + true + ] + }, + "requestorId": { + "$id": "#/properties/controls/properties/requestorId", + "type": "integer", + "title": "The Requestorid Schema", + "default": 0, + "examples": [ + 66 + ] + }, + "ranFunctionId": { + "$id": "#/properties/controls/properties/ranFunctionId", + "type": "integer", + "title": "The Ranfunctionid Schema", + "default": 0, + "examples": [ + 1 + ] + }, + "ricActionId": { + "$id": "#/properties/controls/properties/ricActionId", + "type": "integer", + "title": "The Ricactionid Schema", + "default": 0, + "examples": [ + 0 + ] + }, + "interfaceId": { + "$id": "#/properties/controls/properties/interfaceId", + "type": "object", + "title": "The Interfaceid Schema", + "required": [ + "globalENBId" + ], + "properties": { + "globalENBId": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId", + "type": "object", + "title": "The Globalenbid Schema", + "required": [ + "plmnId", + "eNBId" + ], + "properties": { + "plmnId": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/plmnId", + "type": "string", + "title": "The Plmnid Schema", + "default": "", + "examples": [ + "43962" + ], + "pattern": "^(.*)$" + }, + "eNBId": { + "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/eNBId", + "type": "string", + "title": "The Enbid Schema", + "default": "", + "examples": [ + "43962" + ], + "pattern": "^(.*)$" + } + } + } + } + } + } + }, + "metrics": { + "$id": "#/properties/metrics", + "type": "array", + "title": "The Metrics Schema", + "items": { + "$id": "#/properties/metrics/items", + "type": "object", + "title": "The Items Schema", + "required": [ + "name", + "type", + "enabled", + "description" + ], + "properties": { + "name": { + "$id": "#/properties/metrics/items/properties/name", + "type": "string", + "title": "The Name Schema", + "default": "", + "examples": [ + "UEContextCreated" + ], + "pattern": "^(.*)$" + }, + "type": { + "$id": "#/properties/metrics/items/properties/type", + "type": "string", + "title": "The Type Schema", + "default": "", + "examples": [ + "counter" + ], + "pattern": "^(.*)$" + }, + "enabled": { + "$id": "#/properties/metrics/items/properties/enabled", + "type": "boolean", + "title": "The Enabled Schema", + "default": false, + "examples": [ + true + ] + }, + "description": { + "$id": "#/properties/metrics/items/properties/description", + "type": "string", + "title": "The Description Schema", + "default": "", + "examples": [ + "The total number of UE context creation events" + ], + "pattern": "^(.*)$" + } + } + } + } + } + }, + "config": { + "local": { + "host": ":8080" + }, + "logger": { + "level": 3 + }, + "rmr": { + "protPort": "tcp:4560", + "maxSize": 2072, + "numWorkers": 1, + "txMessages": [ "RIC_SUB_REQ", "RIC_SUB_DEL_REQ" ], + "rxMessages": [ "RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE", "RIC_INDICATION" ] + }, + "db": { + "host": "localhost", + "port": 6379, + "namespaces": [ "sdl", "rnib" ] + }, + "controls": { + "active": true, + "requestorId": 66, + "ranFunctionId": 1, + "ricActionId": 0, + "interfaceId": { + "globalENBId": { + "plmnId": "43962", + "eNBId": "43962" + } + } + }, + "metrics": [ + { + "name": "UEContextCreated", + "type": "counter", + "enabled": true, + "description": "The total number of UE context creation events" + }, + { + "name": "UEContextReleased", + "type": "counter", + "enabled": true, + "description": "The total number of UE context release events" + } + ] + }, + "layout": [ + { + "key": "controls.active", + "title": "Active" + }, + { + "key": "controls.requestorId", + "title": "Requestor Id" + }, + { + "key": "controls.ranFunctionId", + "title": "RAN Function Id" + }, + { + "key": "controls.ricActionId", + "title": "RIC Action Id" + }, + { + "key": "controls.interfaceId.globalENBId", + "title": "Global ENB Id" + }, + { + "type": "flex", + "flex-flow": "row wrap", + "items": [ + { + "key": "controls.interfaceId.globalENBId.plmnId", + "title": "Plmn Id" + }, + { + "key": "controls.interfaceId.globalENBId.eNBId", + "title": "ENB Id" + + } + ] + } + ] + } +] \ No newline at end of file diff --git a/webapp-frontend/src/assets/mockdata/db.json b/webapp-frontend/src/assets/mockdata/db.json new file mode 100644 index 0000000..31bd473 --- /dev/null +++ b/webapp-frontend/src/assets/mockdata/db.json @@ -0,0 +1,36 @@ +{ + "config": [ + { + "id": "jsonURL", + "value": "http://localhost:3000" + }, + { + "id": "host", + "value": "http://localhost:3000" + }, + { + "id": "metricspath", + "value": "/a1ric/metrics" + }, + { + "id": "delaypath", + "value": "/a1ric/delay" + }, + { + "id": "loadpath", + "value": "/a1ric/load" + } + ], + "metrics": { + "latency": 11, + "load": 100, + "ricload": 100, + "time": 123 + }, + "delay": { + "delay": 64877 + }, + "load": { + "load": 1 + } +} \ No newline at end of file diff --git a/webapp-frontend/src/assets/mockdata/routes.json b/webapp-frontend/src/assets/mockdata/routes.json new file mode 100644 index 0000000..0745958 --- /dev/null +++ b/webapp-frontend/src/assets/mockdata/routes.json @@ -0,0 +1,4 @@ +{ + "/a1ric/*": "/$1", + "/:resource/:id/show": "/:resource/:id" +} \ No newline at end of file diff --git a/webapp-frontend/src/assets/oran-logo.png b/webapp-frontend/src/assets/oran-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b6ce56468d87a3d9463ee75297b3895fc9a414 GIT binary patch literal 43935 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

r@f1gRWk|A*%4`3la7*fhEBO++ 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 literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/policy.png b/webapp-frontend/src/assets/policy.png new file mode 100644 index 0000000000000000000000000000000000000000..11df15d782c2b3f629830f580d9162ed7d10ff6f GIT binary patch literal 70259 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

J5X=1ff(I$8d0%>AcItJhePHY_E3 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 literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/profile_default.png b/webapp-frontend/src/assets/profile_default.png new file mode 100644 index 0000000000000000000000000000000000000000..2b90bf0515b39c61a53bbfde8309f231a6dc3395 GIT binary patch literal 6214 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 z�lvZ1pY05+AFXxlF*=tV>L2yl}2%-WH*qOb+2y)wmAp=bo+!(yPYR^;&dG#UYwy zS0_2#UzcQ#pbMFNel(cBq(%vok;cuX4H#8BZ6xVW5-GUBK%{Q@ckA+N*%(~+h kqxyP(%WL^RyuSnQKjp9z>s*WlQUCw|07*qoM6N<$g5yp|b^rhX literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/assets/xAppControl.png b/webapp-frontend/src/assets/xAppControl.png new file mode 100644 index 0000000000000000000000000000000000000000..9458a8581afe03c60ee8c3cd9b0fbdf972331bdb GIT binary patch literal 46015 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 Kye$*g_y2z$&=;`) literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/environments/environment.prod.ts b/webapp-frontend/src/environments/environment.prod.ts new file mode 100644 index 0000000..fb04b9c --- /dev/null +++ b/webapp-frontend/src/environments/environment.prod.ts @@ -0,0 +1,22 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +export const environment = { + production: true +}; diff --git a/webapp-frontend/src/environments/environment.ts b/webapp-frontend/src/environments/environment.ts new file mode 100644 index 0000000..5aca243 --- /dev/null +++ b/webapp-frontend/src/environments/environment.ts @@ -0,0 +1,35 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +// 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/webapp-frontend/src/favicon.ico b/webapp-frontend/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..00b0fd0ef0b4e78fbb8cdb413ce84561dfeb404f GIT binary patch literal 15086 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

4K$ruCE1 z6v%X$l;$A+WKj>+22)V)8Q__tsz1{oD`fctaftb@q**pw5vOB*{loVVn;33xnDNGS zD^e)*U)Ql12r)&^)(c&_BB& zheV@4UKKl!7p|eHf()`XVR72M#mKh^H8)CW(JrFw9b6XpxZfT-19>egCsE+4vB(QS zTsh*?M*TjaV&t+|kjLbY$$k8Xadb*KUL?!%?IE)$_UT1S7p!zP+-y`Aj3uoxYSwQtKqu7Ffq`$0^Fvphe+~M#Kz{`E&vzSXun0K}N!`ET9P#gMbbq$XM8y4H z)gOLuibl+q<%RGToS}3`VY)8{KC=@(XnIPbJB!FUfz$a`L+NTcP{iQaSs5YhH-G zyC8O*t+ z(h>5>sU*)F+U)kYZ83Gkp65fqlGUH-pTs|aoC_9jh8-Yx%A(8eXO@DiuDvg$jF6w% zR4GS{M5TY*_Y{=Q;^OevAjXNaP#N|ivewjF`!{jIL@UIN5qDMV|I+F(eC(H?{{;E~ z0|9@x8{AEa8-N69oMS#qyLBS z5FbX;!4f=;e ze{Bq6o`Kw}(8*#|h}W`sbC*NVe>+=#IlV-!eL@Q>FZJMy*D_+P|U`TP=frpSI}K{%yR&`mS*f$#;iX zW*O`c%8_>@1QC-{4!vh1QD`{uOGo@2aEe z6WAMz_pn$Ai}fJx&%J^;$&-4tf3Z9h`Y&v!fTBuWzeXuNL2N;wU8lCZ58(c0+N0aU zU)8=zP0SB5OT_!E__v5Jd{zeg`<3N*NUt5%jSaK7#&cC%X^vI&OP%?yH4M<%5t3k` z6F163{U4(3nQp`@go=9@e_NUUpqr-~#~j*S)eq3m;wpuRsf-h)Rkiy31HJ!*EQd7l zC$ly{%+2Zn@w+45AX4n=eKB=B^j9_04+flp$oUxJ3frrT5EGdr+Vb*^XLjf`hcKUT z4Fvj{NVh!rP@%i0qJ}S4d?UZGl@A~LUFr2B`f@s`$61wr_!O(E5YI@1KV9UISlMho zfS&guGRP%}{@8`a-;aYe^gl$bNF=|uqn-TZ+IZ6L;3L} zXW7XOPn!9Mq2KGVlEgSC3sW2QlS5KP9sC%#>|@HJ1VP0s;Fo@&sHHuPHB!T;+E zpDFWK2O(DAt;mP3*GFT=eKOazlO6hDk>u889X|@QL*|R;pfvA6@e&$EETgrUMC2Id`XoK%&3j8(`)P7g%q0m1-Q~%t{ zh?iJs>aJbNc1L#)yz}2*o8}fV7WZG^%S(a&bxrickEHg&H0Ynz;QO5l-Cs7*ADsIT z{zhMIolW0M&TRJy$a#LNvHq+LAZ#qUUV$yb_oIqsFh3Ua!?mQJ)t~7f1)smV{*MHG zbNe;br|)y%{W~uHCADXuSE=D(`FYGA<-&ZL+rY3A3j>QoX!L*Ir2ZQHWAc@Pk@;Eh z`2`646wSu1KK<+(`oIjj6Co;JG4n}cA4KjCVUNFHOdN$D4EA8Z95xtHO15Dd{qTXo zel28q)M_#sHicIuXtd#ydtUF%1Sqrt+hIK{yKdveTVVzKJ*Kqe=PKGbh%46oNiKq z!)2yCzrL8>O~RFO_s+4h(|7Aq>6;Z{|*bPXbOB zPKQkVgIK0nRr_%7I)iX;r9pU@(tx=)IAJPBgT~>|P^zC0?pfeapQ73RQkv)4kCt>Fi}Q1+>VF8LaCV*~ zNP8jbdSr7qqrFzZYJ5eC#l|zfko+_(^mFPR-j4$3`B1=D_S9z>k0$yDP=wPQoOxm( ziP-P%#6ENHC2qt2N31q7e}6*A$Q7R^exv%IhXCYy`z`P-_nv8U!+qjMhuwy?KQTD4 z$L*z#;T7??KioEz9J}r(u2K4Ks?W51RB@xKmSquu4^#%Y849ACRpb^tkiI9mi>IYB;( zial=6shMviMi}!R&Mj+MuAq#29A`%C)lCoXK`cL8c5nqrZeX8MTCemgZFyfDFI*>& zwoiTOWp)W?4ea~PGIMZ$jr3f)IuE0qiZQm>zZ>d({U}Q0g;*bWY~K}mek?c6{AwM$ zUveu;y*8B6Gt7s4y*K0H2&=QE9%lFNtM|OWV6S(V-JdOa_`B+U-vaf%P7wRD+1SK7 z%Hr|S5ae#;W1spE`?SYTu}9z1ct6`09jPr7Zmo*KdSs;GKn$6S`!+zTRq#4|)A6qSv+`X=j8I@uVyMQ%yOI5vaZAF&D^0JA1kD{-5W`#F#uae~@sAA17*f03z z6k)9n?wb(&e$e&f@&0U&%=QHj5#vioTxJc{!sTUkcHh3JvmR4Sf&rNO`eEH2fOWTD z9@gZXB)-ctmCr?bWUXPqvz$F>dnJ6_&F5 z=62Q8kCg%0*+%I9)p$mU&vVoRF?SX#wZmG#=3o{-6ihEH5{xfcjdfq=Ud?lG?}v~+ z@KJAd`;#7suPCc+_Se>0ZK`@|v7#c~JgQuVScQ(Cs0uT9Hm+o1CmxPfB=Qj^m26BZ XY+}&}KC=mD;X?Iq*l*cA?B4$ePY*3q literal 0 HcmV?d00001 diff --git a/webapp-frontend/src/index.html b/webapp-frontend/src/index.html new file mode 100644 index 0000000..56b34c9 --- /dev/null +++ b/webapp-frontend/src/index.html @@ -0,0 +1,33 @@ + + + + + + NonRT RIC Controlpanel + + + + + + + + diff --git a/webapp-frontend/src/karma.conf.js b/webapp-frontend/src/karma.conf.js new file mode 100644 index 0000000..421a75d --- /dev/null +++ b/webapp-frontend/src/karma.conf.js @@ -0,0 +1,50 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +// 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'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/webapp-frontend/src/main.ts b/webapp-frontend/src/main.ts new file mode 100644 index 0000000..8aaa09a --- /dev/null +++ b/webapp-frontend/src/main.ts @@ -0,0 +1,32 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * Modifications Copyright (C) 2020 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { ControlpanelModule } from './app/controlpanel.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(ControlpanelModule) + .catch(err => console.error(err)); diff --git a/webapp-frontend/src/polyfills.ts b/webapp-frontend/src/polyfills.ts new file mode 100644 index 0000000..56ca438 --- /dev/null +++ b/webapp-frontend/src/polyfills.ts @@ -0,0 +1,104 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +/** + * 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 + */ + +/** IE9, IE10, IE11, and Chrome <55 requires all of the following polyfills. + * This also includes Android Emulators with older versions of Chrome and Google Search/Googlebot + */ + +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + +/** + * 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__BLACK_LISTED_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/webapp-frontend/src/styles.scss b/webapp-frontend/src/styles.scss new file mode 100644 index 0000000..c37fc42 --- /dev/null +++ b/webapp-frontend/src/styles.scss @@ -0,0 +1,45 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +@import '~bootstrap/dist/css/bootstrap.min.css'; +@import '~@angular/material/prebuilt-themes/deeppurple-amber.css'; +@import './styles/dark-theme'; + +/* for sidenav to take a whole page */ +html, +body { + margin: 0; + height: 100%; + font-family: Helvetica, Arial, sans-serif; +} + +/* notification */ +.confirm-dialog-container span.content-span { + padding: 35px 16px 20px 16px; + text-align: center; + font-size: 20px; +} + +.rd-global-page-title { + margin-left: 0.5%; + color: #432c85; + font-size: 25px; + font-weight: 100; +} \ No newline at end of file diff --git a/webapp-frontend/src/styles/dark-theme.scss b/webapp-frontend/src/styles/dark-theme.scss new file mode 100644 index 0000000..6214081 --- /dev/null +++ b/webapp-frontend/src/styles/dark-theme.scss @@ -0,0 +1,37 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +@import '~@angular/material/theming'; +@include mat-core(); + +.dark-theme { + color: white; + $dark-primary: mat-palette($mat-blue-grey); + $dark-accent: mat-palette($mat-amber, A200, A100, A400); + $dark-warn: mat-palette($mat-red); + + $dark-theme: mat-dark-theme($dark-primary, $dark-accent, $dark-warn); + + @include angular-material-theme($dark-theme); +} + +.dark-theme .rd-global-page-title { + color: white; +} \ No newline at end of file diff --git a/webapp-frontend/src/test.ts b/webapp-frontend/src/test.ts new file mode 100644 index 0000000..0256e63 --- /dev/null +++ b/webapp-frontend/src/test.ts @@ -0,0 +1,39 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +// 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/webapp-frontend/src/tsconfig.app.json b/webapp-frontend/src/tsconfig.app.json new file mode 100644 index 0000000..190fd30 --- /dev/null +++ b/webapp-frontend/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/webapp-frontend/src/tsconfig.spec.json b/webapp-frontend/src/tsconfig.spec.json new file mode 100644 index 0000000..de77336 --- /dev/null +++ b/webapp-frontend/src/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/webapp-frontend/src/tslint.json b/webapp-frontend/src/tslint.json new file mode 100644 index 0000000..30581c6 --- /dev/null +++ b/webapp-frontend/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "rd", + "camelCase" + ], + "component-selector": [ + true, + "element", + "rd", + "kebab-case" + ] + } +} diff --git a/webapp-frontend/tsconfig.json b/webapp-frontend/tsconfig.json new file mode 100644 index 0000000..457bef4 --- /dev/null +++ b/webapp-frontend/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "downlevelIteration": true, + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "esnext", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + } +} diff --git a/webapp-frontend/tslint.json b/webapp-frontend/tslint.json new file mode 100644 index 0000000..a919351 --- /dev/null +++ b/webapp-frontend/tslint.json @@ -0,0 +1,131 @@ +{ + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "no-output-on-prefix": true, + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} -- 2.16.6

++U+06UW&p9PrFY3Y!&%Zj_`})0o~&1IHU*zg@`HTebrA?K@&32BaV%W z9S)^Jt${o}ZctW3Fj|43x_=`mNkWHSD?>3IA|1ci7?MCEalZjc1`31>E=OvNe9#q4cOWyJF6^w8CdIKha=4l6IJ3 z>^ytnBG>QCy>&-{WE5PDA6z0+Gmpv6R#CDxo8m%MVs|C)!i}tj-R1#;Y<&zy2*hOq z;qGSsy!Z-3W!eK2{&h=Nk_&DI+$+4l>99MR`y4v-@W;h(ab0OFAkIPn24e*!?wJy# zK)^sKq~B>(ZoPnr`|fOa`|T&;OxO3crt2;ZttXVeM|U@BcVb}gUMKh>Q2D?k?(byl z?S#)R<+?tV6(Bl_jNP`m{Ok95>;4m$mF7wFri;WUu|E6l_fSgMpPlgaYH@=e8Hk2C zAGYFI>6V8tZf6sF22FtE$3eUVZPzve#=Nik}5;< zL4~~MnTRa-H7Xq#?saPzzkAX1t0LRGOjK0R`(IaIUr8TJScakHOnP?qW_Q1ie;geA z8~uB-b-(}0JhUUOu{Iv86z*~Rdq>Cj(6gX+b6LT9{CPQcc6$12DCTn)c_x(DBt<2` zw&lNCiAgE=x%l07ZqsGr*^sYeO&lNPuGG|~o7BZ@`rV29UHMwB&ngg4xV>(EhpW}! z5tes!zpY)^S{1PG;bW3ITGy`eu(5agSzajUao%;HEV6rjtWX{k8#}lyxqmrq^qS4Q zNT_-5Ti?`d$K2G}KMqDF#&du7v_9HdZg*ywb$`!7}M z=D@n(=(5qGB*lq(m8?7HOU(NgZ&nh5sFEc;r7kfwh;a~gzaSy)m;222Li9OnKr836 z0$UvO__A(q-o%TECFz5?b-M>+|BhMO&AW+;?>nk@i;Bx$H_5+ydOQmZll8dKKtwbV z9?`mAKg=lhX&rZWjngab>kC(H#BH5$Ae^4fU>e%NJy1<;ShR=auuWYd#@A(}RfxqxGFuIx5{CVyI&D`oa6U zr9go`+Pnl+?{;Jlea+i+UMh9_*Zszjmf$1<7n}~Z;@~uv_9t2+>@0|tx;x#Hs^<3) zPu#0zczKG}LOAxj6((JHzsT$tnlWSy(R(UA1BbC1Ls`te3Z)MMD;Z&FnL{mgnQbVVJ( zEx?UNkea^?HTe(-6Oc>rUM0&lGDxel!wK)iSNu5{d|XaT4A3y_ipJ#Wf5p8#`_RVR zz}8mwf`~Ob%_Nm)B|bl2ySSfRoYD#n!O zby0Cof#`7%n3W>U5*@Ofl$Jy{ZOg6mOI%fWUlKQXGaAX8Xti)LhGw771a zc64|rI0g&$sBpVdPMv&t9)0}ixyaTkQsO?mD40J`hNmwr00QGIfTU( zKNU9oe4=SZzh=6sn5VFz=3=68Eh5DBg-%*lT3TlA5}R3q%lC*kUq`mwsw0Th3RM6v zyfQ`HkaMx2vMQHCI_v8|JS$G17=Z^@n?P%K%=xEnTl}l#6ju&ce*dZlma2r@Z=S^# z)O72!-H*)`Z3jPJJ~A~mr3FTg^Zg5@lcgu-1z0O$nO{V)9qZ@ zBfI~d;K<}k1!8l~{}mg4J}vnY7&pv|c`W7Y?d5g#JG$}eY_D{jLDmPosfuZ+3g9@q zHmuQTb@32Rt#GC*p8i%RKGzb!NB(2}I~U1Wvzw32V~}{gcU6ne*~D9%TjJE3M$_Hm z?bUrXj9p!)=#McH3)H%M z+KweR2+ePwATS8%58i_c>3lL7iX}uDv2c#`-3Z3yPgf= zUH*Csj}Kk1tH8TSp`#G|_Vbe1S2v5YlypV)4V7uGcAa^|0x&M_$Hpum== z2PGlNJAXb~n~Ikm_hewTn~E`+Nm=?}9+J~5W)X^c*egw?YSCD&ZJ-=4*ZzW*LYF=J z_Z|s4R2%FMQ876izGUi-hIDLf(}BkIc&Kppcmkn#pBddV#m8zr7`bFbVkB^V5|{DV z8qDDM_=#I_b4x{dl4?g=HRgAlZt=T&_g4z{F>l+55)phpN>yC1JB;4qSo^EzPY-gcy&GHKiUYgM@nsGUrw zAA!nrL_XEy(>7suTJ}4t-1i2uz4o?wn~%fe|NOD35; za;z$`h&|DDu*1~pJ?0K+C&%%tTS1Yu3x0RAbM+zO?yC_Y z5^HQRiT8F}c{BTK^>%IpZq2Kb@1scP{{C9C zFB%e(LLOH`n1bFI4J3VZ!(#Y^v0i8re|Uk`Uh;j^Q*IER3GwWM*bgdHD5xfyD%LaZ za*YM^a8%KX;wi-!xtCN;b5qn#zf5^aBn!_iq>f6mtp^1Ma~2xCu7+x+OQWceFfPIe z^5J-d>=-=mVD3>p>9D^_SxtT?LzI5kGt75=fKc8-O8n|n-+gUWM>|D)4tRr%TMN0>PKL;v z0Pzn*nqzo13bRRX92hq{HSe*NT}7tcugOlJK&jg7bb7N4mDpeL%r`WRJ_FzR&2 zkMG>LOhaTooi7H6#<&UBahoE4bHoUt!04cfxcx$17`T0jqaA9hf==?+_#QVXdJ2du zX?w4?r|atK+@Il6P~A!{Hcr^K!-?(jx_R%x${lofw`wCvMEMWW|{L`vc)=*;53=sNW+|M%=Cyx|}l{`Et z_eHO{CWty_+g3Py(|u-fbb&N7GD3gaZFVnz-+Hm%S!_T5-_v07PB?jI*wJA2j7@p- zw54D&jmbcBSuTfCkB~Cjy9&r!;{da$@}6O3C^1MSEPIfhvpR|1imDgMh1__rH31H2 z5pMBFf+}>0_US6 zXg>Rw`v5+=1!s>kKMO+1@?4xHiMFUUJJ zi<#0hGR|+$jFg_^xz)N~!$*+mMM~Vx&ePge8x3>_r;6EOxFTmPu)DGO_ny(sLF{I9 zZIZQ%EuiNL0_~nOw5gcSC^2RbYa%2a?|e?oT}@3poopxj7$tt5{aY#301UT`=K%@G zV*P|sJ?rF0@BGm;{(a5U5M1ABN~LM0#=xAdw(>Zc>|{me zV9J^Y)D*aAF9!C4K?E}XAOd-iB41~mo)Rk`3LHk9^g=7DVj==0?@tw{<);KrM&b*R z#7lel=DojrH&qLwey+Qx9ojv7 zh8OMq1~&0sF{bZA<6R$P1!pkw12tACf-ME6R~1dwjE-+@PT5*DVW}^pU!unb8}j7* z{QQjk?gC0GI(uV8HgS^Nf)xQ2d=*>B2&Ur;|8c6b1 zLPk%+-!SXikMfMjT|-Tl^*=*+bB86 zwl3B#rHqQ6Z+4bkcTF>)porStuFmn?ENS`lclh?2H{!yeVES<8d2oeQde#we?YGFe zU2g?szG^RWbx_tAny-3X!xA?f#GjXYit zDCHZ_F>H#c2t;&sTuY1w(ihSETV_`a)!5rTQEoitPtsFOp(|SKoBFk1H7wzJakx^q z;A!FbS$DsyQUzN*F{%BZ`gD~3GxNqd?S$1$2tj~+8aV|;QvV9heN}U&K0^tL; zJJQ`?^`1{Ftbk*Ylzh=O1IaF50ckOzhiXz0 zXWJi5`YrA4%~jo<`QA|`A;9X?7YMnM=LEA${%~RpO;0F<6vWNx>)8Jqn`tcjTtP z{(f``?-|D=_Z=LlaQWHTzcTtCMd#tq*58KV*r}@BicyPk0d8K=leYOeO){@M_iHjUP~wU_~(2{iAktK zlqxeze8Nh_@y}WGCqY38#W}abCRtec+rQXxFOq1vMBvr`t*QlMuXW>ypcea$#NWkfCgbOyS$Xg zs$2P#k;z;>EfuLToNMjn6Afyp>+d=P*Q%eCAO;ZasPa2n(YM8_Tp|jWgBJLP@S@b; z4{6^uD#@QnKekDr>0+6lnW6u?zbGblB)NF?0?A1hG5#bI5iU|8=8yF%H&QaRFU8{^ z)MtAoobPo<5Gjn$Y9B9e0s)oI@!`Kh6my~;G#hS@3ma-XIASrn%8FlxZR?&-^-z#& zu#(L&es#P*^$G&!;^sbOk-u5}8hX-&;I)LvlKaG$M1pxC1rY6gG7e76uwiXx_7@jS zsJX*X3ujyx3?_fmy6Mz;KDOU*Hj&PJeRX$y22+ChNK`vu4Oas*G&|LDBMBo$^R1Wl zPjlsxS%SA>YS#wTg?{<3)S>D!p`|m^Fesc2=!w#IG!~c^b1!GmKf*sbS2FwMcWdIH z+2>&zu*sG1Yy09!ygUG5!F5E*s7ybGKp^~dr)nBJTpN$l($mssb9|<@5zsen!aN_7 zBcIIw5O_)a^(qfwvR&ro(XUfeMc9|NadIn@X#Ep1^WUGf;kd28%erE2DKakYS9_Cl zw-l};9f!m|W9_!ek-AsEAjqZ+&l#f24ZOYB+-%^>Iyur?|L~6=_FF#iw|RB)!0V7X ziEf~XZDZ@oB;#{_no|#SuEP>_0|IP5Q3ssu$%>&kV{(JnGjV7jeTi+}zsH7XsDy!$ zz(y;n-9t2zvKLZ7h7`^y!1*|@9B(QKndR*A=`n|1AIrElXggNT?mp67Q8l}Lide2+ zyt&^rl^pKqWT(d7L=&C3kK=!mK19d+nt((5WcS3S7&sN~_{%Mx34_e-KXtmGa$%96 zjV<8+Yr4o0thhTM2t0j!+E!#ZXD`9epr{7&u(&p#-c?5Kz>Shk#{eOX0wjNr4Ifx=SkY&k02`z=PD5?deCSk;zDp4aL425WS z>I>$r7>kZ6g29*+VWNbdHHy8QUv7K9tbf2u{Wc~6cF*o&ql|n_ZLJGr-0KJERjfV% zsAxLZCV~glOc+5-*j};w=MR;Gp~c^(>lz`Th>|8(AFI*~Defr=+s{#;1r<3H1K_Ge zLyon&%*MuE*Wm3ec!89P&8eD@fWYEU_oJ=UuenoiipJsaQekew{ZsZ)PsT6(UX>&) zQb*|Wn@^d%Q@+(y=3K8=&z7ZH`a#1tYmL5(@>9-|IAvJ$mC?YbZ7JHqvi8XhO8A<`&skGmLd{G}m@xXeuF`XD7VRM-Ch{T#2)+=^C;}zNU5{1ZAj}QYA6Gy@c)muKSO2^CUcf zsaP?D{fz@>@ezUD9>HfR3jh-_GpLT`j$AUf!&a$fD5mPVGf_eBiA1pK8<+-OS9E7ZvJuR?+OZ8e8Bt=Ho7S%p7^`p|s{&3MK=Rj~q4T_b zwfMzJ5Af7=X|$ic==nF~8x8M7XJ_Y7$hEI)!^M&5(7wNE`Nk71PCsg;AP1XumOIHN z9PaHy#HX}|3fc7c5=LqFK(aC5jx=jccy|Nuud1Gu9xK4$I+WKmE-!jd)YLSab&CwzOw2Je5^=fyFYP zfV^z&7eA;lo>~e5PAWhIGVcXC@|2jg6hy3kEDz>a)$Mmf_2=eMpknUGNLHvYQFHy6 zQIolDs)s1cf1G$L8J?0xu>lLsj$IZB?YDPBGl9e^J|?!|XU0dy0ouQ-l#Il~V3JIV zVT9l?7;OU?uNDKxOBJtClrG;cY^Nz^dU|?z5Viy9Kv~-A7AD%jQpBs+UnfMm63mgC zn3(*wvcZI&&fd6--520J9rE#F#kbRWyCJrbdz3T8YGsw?UmKqHl~sTT*~tUA*Urm- z1!;Bf92C5^G6!lfQe|isrdkFN^nE@R`D-U%2`GB!p83ezNKkWMYGMoA3gEyF44^G5 z0QxgMjQCvwyGrdOA{O<$Y-wg@te7#d!EM-@92sdDNePSFW-F|zmT0<66}ma^(1UQH zM(1i4-;9kzUV+K~rHYfQV*Xny4IZI_7}@dQh5u=dI#OKPm0)O4=VK!GsLh_7h4BLN z6SWT`)L@(!N8idM!>hD=iT)vFy4e1~ex0XlW>+VRq6*Txx;1k~jg|8b&x9H;;q_x} zp!NbJ`rV12Sm8_jFlj+=CdqE?t+c*}TZDXlsz!`8TpCkD>_@0b?Vg zw5oOtzN`b!;XEAN^FjJ5sfdUe1a8HgnKgwhSpUp8W9ofxG3_ML`X@g@2vC_p!9$|C z?_rLZ+9YFAUhB_AAnQowF;2zqpJf|AT?9AuKE9Sez~}&Eh((|t?~a{tf(Url{z}0| zHbbhYuimRB*(Mct@_dhzCM5Xr%~|x{92;RlJ*DiGxMeoqThFK;+Z!h3OMdTGh)gvR zNfDzdwb^~fjTu}8l;K*W$`n_-4eRRV4GZ>VN^NB;Qk5iekDq%;zoAB^hye8~cQMrA zhZYR2wOY5Dqt4R_Jmk>*pOo9%jPdf<2P{Er_lM*znoA2m3Ypd_-rJ1g1^sqBBV*6q z_Y~yANf-Ro`LADynSt!=>50mecWmlYZYyu(gYT6U0Y^Kf1QS6no}Nbb9H^d$v9*Yq zlOqErTa}U&#ZDaufB+28{$ab~vkC@DRzpqKo!2^Re0S%zW=%eFZ>STwNaC~IOx{6Yr@TRA999krsu6 zEe;mGhu3gp;Fe{b2|ONZp+8n%d{qGn33_Cw9ro8M_a zQ4cvhlJ8@x!A<2E$ezlWUHx+@tZ-Xx#2HP2G}EjjTHJzz8%FGk>>0Y;nI0_jFdqlH zr+5W6^wF6$1_xG7xSR##ygZxFVsj0!Io;U|G!dHG_r}2>5pSeZ!wD2R$D~y1a{%|H zdSM17-)9N?r;W$kP1Rmkk2<@(AES6X6?m=3y_vd>g4kY_PYp=zpVnm=W%cAQ?(b@m zp)7e*x}~`P9_8HyrNyXKKx;o?61UUQqkq0z09tS+d7;<;5l$iKIdHn25U!}DY)u%L zfFMO={bvS3jfahl20zSSRD3px;29J+xxhi(?d~{T(T{lOtkXjuT5~c{kokRU={Vb} z6UcYHcGQk_KV+9lOm6*=4G|qyokgWA)v{5DND>}cYgvJK>{E@$XVuL501WPcc3W2X zU5@iQj~@-)0h28UtiWVB+QcC~#6Ifu@HDYw=5I7UrSZ1`N>+PnL?`5ko=C_n!GOC; z@KJ2Y5`a4qg?fev#uUn*=Y^cb-!9w*+iseGUNUu^d4LNtYa^Ho6`RRK)6GHyeg13o zu+0={hV1WpqmqExQ%v5?w5@6Ip^^#{V0Gm~X#&TbM<3tqlSfA=HVyf|zgNMEp8O>I z1&0R}#&0I1e63G_kJWlak)-z1^v`(A3efSl_r7Xl3GuP{@o)dOEpN>;3WxcM=;c)B z?aNP68qp?Cwl9pug(Q?v_4?XO|xj4?bN3iCR6#4485_K4sX_AvT z$HveR65DfFm+9kKfe4T&)l`f<^?THkxGDf0F~PnG{(L&45xUG6dNJjmfZzlAK{4bTC}Nk51xz5G0>$IlT+#qH=Fl%tLJd zBpcKII4AQJLW4z%BzX=_`{4>tl(#I%xM}U9K>fZ9q>mVMm|9;9LeirYH( z$RWsH)OfdDE7MkhELy-q+^iJ2C1cvGa93G=?NF-o50d+-geBuE#R|$Ih4co?Vxmj! zyf0yt;}e>3OtN5E@Ux~Soq}ml8x0COt`CG{233ecj*VlVJnab7$otD>>FB)Mksc~5 z)JHNVVvL`U_9^f}&vIV`t(-Cx{vO*8J)fK<9z7pTodQ3Y z#hN^PMjEx;V5?q+#m1=h3k?SEY3H5qF9KN`3?}71g^s9ir`#D8)d>}`fWPytu)98T zvu@?5;TOld-8pnVw|BL=8Sa|~^I3L%?j({@F|1@;& zHeIhTn=ae#3di=O;*vREvH|;q6ny%kBH?a3w3G&Vq->kR>P7;F535HJ6(x%o5*FK^ zYqQ*;e4b8~nZjf*I?S#w_JcR(0I>zuhOhfV0`l5%E${_&+Wm1PY7(qqR1R=OfH3N8 z-~g1j7^gg@rV^8Ic+Cn9=TuKY6c1(3IE(u-z7f*Xgz{i{h=)$zYfZb<0E3b%;4RC$ znUVB}YHe*<*==wZu)@AL0Y*IJM>}Q)u@FjJVRLt+7Gu{C$%QCB8YEMu#6tu^x%Fyu ziE_MRI;qml2!P$Uaxx)WU&E_f%}nz6bqob@ARnQl0U<#>n7Ru2HmE5PdO*2MA1H5J4 z5IZcdb-bL%pH5s&*1#hWH*H`UW5=Nz1i$m{Z+hq^w&wQ>uk$6dn>8~}wkna_4SHli z0~@!FV`67wTLuhFb{Nzoq2+C?!MpI=@qnMmx#T5gISd4#5WbKnhjXYImxob`D2sJ| z{;tRW_G!mI4vM_MjV*LX6v3LuW>fG=xmc-o0aGkqBLCjXO+5VjNI=kgc8pbm5IrXPlil_SKjuP z(9)Yb-IPalJAK&u!0G@T8!*k0hNn+anr9;k_A>le3YPsKaVR0Ouu7bP%8~U=$q0fk zwOsA877^?)()UniKp?j>XPwyMl`7`plN9=wRX;N0UNOF8BEhp`!%M(pTIDksMRK}@ zv&IpdYL-l{i)Yy8T?m)_y~s0$7iDB*Y(BW`if0bK9I3>*c&#p7N9Rd7Qfi{=Bfitw zd}Wl$+54`^|I6!Q3%mA=SIi1El7yIdu7R&HXiER}!mY<`$oZYBDR}u#2ktI2?z-fe zw=>1pxjc%hT`p4Awim@#rOhA4+79Ku@c4VMy+03u9SYse7jLhP`i36Em)hRVY)+Zh zi=&7sj$VR62@k%}N)1 zXiGkSeH413|3F~h>-`Pz90t4!qdEN{LP=P$J--xbZ)&!qUuQhi^V5T<=#b;Wydr~u zrRKxD+i?xEkd;~A#+%*R%}*OkdZzXB4&qEx03QdsdyYv>l4ZQ;vQI8ow+!P!84tCA zJ5)IR2n~%Q_CyGb7?Ef591P)zQRvU4LC#OQMb_{0wz{<0(bK9D%P3Ji4p}Uu zXgE2QNf&JTBlXI|ls_#Nf55m4np^49KTJZVgQCK}8QN)Eo7gz0Q7!kHb|GRhVU5$c44oM>@^bZj2{b zb1*M?r4TSid$Lwg=jqM|)s98ZIG16RuxYl{!>Gu)U%c~u^<}eA#N$CMOHDRcO zS&nOh2%NN3xRa0rB_L}>IT|Jmv>f~|{-qWwQ3RGvZF-@Jn>$&ZMS?-Gotv+~Y)IGw zpLw9VIVhs4_Xm$E2MjC$NVo*F+58i}=F0e%>GHx#se33n{ve?AgBu@HepuG-1Ty0r z^E|p?^*#MP29zQh(KdqJi-y2~oGmhSIc`N5p3K<+F_tF@GoH%K&J;-J<4q47z=o6; z($)YoBtu7)$BTv}NBqRSAS#7~qYr)grhGT2dQJ28xc7e)+-mFRetNA<=$Qr#fCkq3 z$ij*%M5s{}N%#sd6?+VET70AkbNdWHRh{~(O|qi)zTuJQ5ky;Fk1~AG^HLUO^#Vdvc%noTPXX~ak6rzb#B>+)yAt+B-gu91e_U(S;*X!qu~a zQ6hyX)VU~xrZpp-B;QaKYGQ@T6M7Vj%hykqRV5A%tfy*O5(X(i7?Dg<94Yo(J0hx& zZ9PuiXepMZ{+ry^u8cnY%Aqzp^kA5ctD~dFW!_-X?`-gL zPSPcGIxRt?vmWGD9)7}nWQH-$nmko05DL%R*TS2m!9GI7O>%P+dn-%8t07vAr{^PT| zQ`a*F8H;Qt8SfW6N_^YfH|ma3f8VI9U;o|@a`p*vL3(aP3_>vhZ=8LU>E8cNPNT=!{25v?>o_8Tl%o)CgkK93YS+A2Q)s|bLFVtB<5MTV75~t4s$i()LFI zE{K74XUheey)d)GebSIUoE{%v-7as+?DJ=*cgu~8_+1#^;QHCrsLs2M=W%pJLMF9r zAA65B2o9EjF-CwINJ4fZsE`y-i#Vrxl@tGot9=d;-2vy~E6nfPaqWmw(|pE2?YtCI z`d_6vl%ll2_MmNrXP+xtz_%bZN;X5r2Ppq;RCPG9eI(hhu0w_W7HJzo;`pcX88_un zkfFU=v-{5DA8P&|k0{j=QjEd=%jYqO(jQe-;*e9OXx>sXe9(h1v;=&&#_6g=Y-W*= z)rtoR)C_nrk*yFiP)m_vDI*|$JTZKTEScbDidN}JPu~ZzLtegM=^q?a(h?WZnsfC1 z%v0;X5|D5dZDHlkhViaQ&{!@S+obKA@F;CJ7K;0sss>{Fey4+gNAkMg z_pi~#u6rudJ_y~GY&-^ZoOx4I5==l$=Sl^r#6dHaG9$zXBby`9pENN$4SH}Mf{Cr7 z1OtW#XIxg$(#!GV6_)eAXH7SBDpKDmBwO_DcZH*mUh%xf&@A9)pyqdN-Nep- z+7PG3{?al#@wlB6i@f`K>xE~|t$CU0W#Qd99WEwj()4UPF=8#~d*zh8&v7>p&BILr zU3s6#r7^LOZ6T@$2iGq(j^78l+WLF0!En-V1s+oK&gC#$IQjTUlSWHFmNE^o_wP7c zFitSake_yPQ97ig`Q)wwUggu)YDyNGn5)mCj~Ah26J3AwgMa(px|Zn zZ4EH-xCTx;p^s$(QtE!s>sYT1_AcHY_&a-H5Q@YLjh;$wXfT;{pnub^LxT^o+q33Gh)Amp^1O#FHZdMpJu*J4$ctU5!blOAV5%}DDeMX`*e&NBM z?<=K~pD1HRL|~RXpf83Wsia*l5+U@QsOnY?>#8+&R;w_CO+ipZ7$Uq!nFh{d;X9%; z{4;KUY)(lpG;jX}_o)R+1O%PVIDA1%U~U=D53x=$k0N8AF332!G;wa<)Gn@448+QH z8b=;?$5MmnWjxs!!=zroI;;P6u7)!~VIGRzANqkPEQG%BYijIBj4A>>q*~gU!O7Y-P1a_Jt!X~D)~JH zfffIP5>-+y#kHnzyX${bdvV@aydS#5fySmLsy@08?pO@8TxyyU@s@doL~W0%n*aK7*u6NEV{oR1L9=A1H~ zbRW0{JksC*K}#Z<>)^sjVYZ*fS@frKxEOymW!jVCjd-!HE|3g*cPR9frs?XW{B~RZ z@{GL?j?3hK!;V*P#7CTI{K5?T<~Y!V*Q-Di0k=ng;dX!|i!<917#~}j@0*+iMs|4UBRz7K!8Ohl~Qw9uMj5yt=K^Pk}}{2m%qDGcUV zIcN9lycYw+%kzF6Y^AzhcStrK?YcG`4Zg+DZe0JlPdAt&v$*L)!6F}n`FVF6n0M8! zB(p2m%T)M=x=V$L2I@3tk8DXgIUY=1fy?AvT zu7lz9^~Kd_a1q|zpq;VKp^2A+lj4IQN!95P5>yNxS-0j8*YtFuwbO-T&OF|}qciNy zh16RIlHbuz$yqg`{6hu~*QChzx-}yo^ zK1%SzkE7a=ZchSOsjkoU6odwDP@sQc>}u)pS?B5Q&K^u_RZ2b08W(Ugi)MsxqmFpU zo)iOL>taK!t`wQCkMI53UkR<9 zn&-d1c_x2*4m>sLmXq@8=}Ni?EY#w>vhL40If%3W$ByD9US98;Ma>UaX^E-=_sCMt zxV(@(8an2y;q}fOjIW@3i@!M2#Sq92lQ2U2z2TW}?QYvN%`~eVJJ=GiI%pzPqwq>z zCQ5|iAypp|l7Ux7eu(z@rD5zlQxQJ+fsdIiMesNb%SqK%gaaM39+n zod|aC)rXPyno5T$N3=Ag=EKUm(IA>;LVD*T%r}i6Art}ZhN?n5Pcff)j%8Wcig2Tb zTAjk&5}VV8e(Z&K^aZpahOC2KzPC!!wvI#gNP};!kJw%6c<`fzg%rZi`Ymg@p6 zBYBoCgB1U?wZ#IlIU$aGu~*4sAKS};YxXrX;`>z3xhC(!_XSDwJSIG;azke~3g80V zsWA%;S;o4@^R4rV*~tCpo%w(A36#A9O1THmLOm)*<^wktoQb@?m`bqv8Z|s&madf& zbGIwlt84kwK{Vy5{#gFxR%vk0`)a|(FVMO{hu=>yaGhZPjw1BZY%$;}Aln+D(&a5V z>B2EU!D2i;@AAcdbT4YC$?IN()OSC(;6R%1$wE3G*Y0t>ZA1*EZ$s>|Uo)q6Z0Q8s zR4nM5)dfF^MRqc=9xu$P8vX~ZP|oyRZa>TckT;X>Q2e3-zS23pKAaSCbt3u*OtTM%SNcIl zJUEf}l%EMT3N;;LK*EqAPsRZlQ&%ed0@#%DrN#nZfzAvEjI4|pmX@Mz*b^|1c{4hh z^j>MmUFe9gI61poXBXS+K200rBofZuN2;x_(@985Tt+k^(qJf*;yV^j6^EGkD+*3g zVr1++dbxMLW8^LC2Jr_JYGCLzTn=6h^;8_ttdOK zq;`ZB8;|Bahk)hTrdQ_%706r;f3ZuRoTi>hDa?3CtefZg))%=cz@=Cwrd2-Wc)}>@ zdfCX*b&qS@TtW8YAUan%^lpZe>35yy)%~V}k2fKAKxch-uI6JDzB$vXrwWr8{4tD0 z_RKu(OO}xlm~BuDi$id)(IdYh{_7tY@+$-W{3_4yUyP~iu#>Oel%&kU?Z1CpIjPUo zcs-fq=_u8NZESWDB7}7j{md_JZYf>>-7g&mKIAeFGS2M3@qba*PhK4MgkHvno?N60 z{th{FXlh`j2+W`?e1R5fMw} zP-?|HaF|GEis)R-+)@C%1cSU#)KU>73SAo6P|vOv>UlN2Z+Mv&+z87(@i|toBNWLz zbAm69&ESbJ@Cpdr(3U90L{!02p1YXR?+Vi;9D2Sc%+OpW@dv?p%iatG{VlbP%d7LX z_OBiLZ4#%6{MA-2W3{Vayre~(x8Sba=3<~KRUPPX1% z^mKI0tf41aSG7Lv?sy9UZ0<2e2lJtzr9a4Ma=l_35)08C3MOKsxq$#|-S?jd!xz!` zi;IrVX8{Xv?;jHm@7r=k>Za^FwS-iliLap6v7S5Y6wJ~;>;09iRdBjW#2ACq?zWAi zi&i(`lDFFvhPWBKy&acTzT~K&XX-RtezK}O?%`100kyP9C?|px?%CEd+_@#%<;$c2 zj}h^{QLuk5SM#$07jm;+|3o7<6C)gpnpB~_cvo37)$@>4L;jHS zr9&m-YvbJq?|br_q@MK{*DTE3zg}vOSpjEeZq7JPl}i`}qO`DRN_-H&EG$Hjvb8JQ zls~f|qj4f|LMJJ7hjcmhm5SJrDb4MQG&r_dWm(U;Awgsr46G0_g)sV_hmMgV1p0jF zlv#?F3gW5`c(8@Vi$Q7y{eLLRo%x5w(YG#_LoXtT_5?*j>Eb1k@ zc$XQrB8*KzR1aH{eLxVmbEM#Rj(ayZdk)D3UfxFEUbx=O<}9?>zPRa`sU?uX?g`!e zlkfT2=(h$m-fmWd_pcPB{`$__b6#1%w2;y{uL# zNr|DQ{+7&lrS+Aj8S8Zc&FbIx$E&gcnKt|$*N<&Lg>F00E^jLTiT&-n)xx^O3QW&oaFbUU@EvL`gSp1Pth&p&cbv zQ!i;KYAD- zPq_2^FC&a(>MfYwI#yaVH60IrjU4tHc9#?Ceuzs1yD@a_`UKkg`VMcOO6M%tY}YSd z>|I{g5#`g-Q3UPTzIei=G4@SbMC94?|K|^;S*^$@)!w%?Qf3le@&`D@+=I{nhutmd zMjcWb>hq8$Nhfh5F)=ZKOnlo+ve;BtCki2FK<7}rxal8>s@-o0Qc-6j&%M65?GN5M z@JE^RNNLa8ildeRtPK#;qMjhQ=2tnZjwK?>0A?8Gx zEsjJ1zIOR?W5~(H$u|4y;wf9k-q_5Y=^y5ILcVXWL-iNCXzo4$Jm1!76vbOHV&6{p zZ}}ifE*-~(O)q@;vqTE{`no!5z=HyTn#W`zX_@ix(PS-=l%K19EO20^J>@_iLluFO zlED50xS+jz3TxPD9|sqm&eKH%<{gk{AF3Odpo}S5f0Z4vxP|2F3#5TJLS_e(>Ezh$lx}T{9Cla`F?k!$#wX2eUIZUCJ13tGu?s}e@>;~vG7v~8gD9umag!-haVuQ*v=1&Z9?#5pEY&~}8+C?^ z(G{uK27YbyY3{bDLjEfWEk3!cRpd!8=h00-19y@p*gMcW*xvsrif>Bh=9nY?v1HhL zt-2|6JWDoD>Jd$9P$27z<3^Hd-@pi-iBF8!D+{kpEF%pLF0vo8TsY*i@2!`X-sU!q z?vT7&k5cy(WAMTIu<%GU8iC?HDrwu{A?x3ikYEzZ!;EZQ=9m^cZql~h0;td3%K^r+ z?R%L{<>eO8=$nIL`P1? zp<4w6G%_vta_)HH_ZmC z`k>Qi#YrswJ1(R1CRH8c@;(ciwa^>4}J`>L@C@-NWYv!9PD{)kC6?b>wb5(x3 z8Xy1WZ8&r@IQ~VQSD-&6D#s^F`gXbHWiHG0@sEG&%WR-*=8)2+@B#239V=XpCH2g7FEhRljvkSMB zpOjfaJgVy&CA>k;y>w2*C5D9kd72_Buh$N2G%xS2ubR$ICm6H(Bu%E+Xw#qA7_YyN zs1_kcF8_Rousl|zq=aJ6iX=!W6=4=oJOfuP%jEWZ1*sl@;@P-SnO@BBx98>ce5>LX zp$fID3%`nBlqNBK*T6+>QXU^k$ z^?Ef`(#J4o(6ka)qg}3B?JKj5Rd(|}J(uPB`wuNZW>c*TEfgVL2;Ew8sifmJklINn zy_n<6s>hPIuD1UHEV%oCnWij_^d>}u!!3tZ{XMaL;+JqwwGT@Lw4w(`{hnhyWc6>J z@UTLyAT&_)vs~7nnop-}D5Baz3TK850c75v?@BS1UfZ2U0Lf#=Gq1t_X27&qHB8*M zMtqnb-H@O1>LotUgDd(W5DlkT%X8%hzttkf)h{*_K1MRL5U1m<$vt!7>)G_sldY31 z;2Dz#&0A5EDnhLA019`j$}4^$L55G5frx$%0QKBSPwbt#Cr>9?nM{LLa)6qFn-nP*2i^l(F(9G^;^;m*e|G*00@~1}_|M^?7Vw#XVtDJie6O{sX!{`hW-5w3e z=M|02&-cqIk>4$0`ba|moOz~h5e`zLWh{Qp?`R9;$!acqepWJYK7g5R2dv<`;sXv7 z()bAo8~P1;rF^`1h$K<&qO>IKUXQhVYT%*KnJDD{?J*6%98z9IPCsG>3Tn7Sjvec& z62_S!{gaa2HlW(b!{wJ|L!7V@u%N3=>Vl$TAA?(|eDedW!pdw`!a)8|bw!YJc3UEG zGW-c4GGHp{>~2cvXBJgFh^&B+BV2)F*yh#W>X%{6TIOWHvMlQaJ>gS-6{8XIFQ=yb z-k_4o((@f0kAUGB%v3iGav!WG3g~*CQQcorm3}lF-})a)Bu(+>kZbs% z$76tyibL4sO^B;2*UW2f&le@Y7#1W_eHG`H#xaGAP6L& z!YjOYh$HS{4Bh+CRI;!P=I8!&) zH}}Ra48%s3;dk-hWcQJ*d^fhd{Ar6w=Y^#rUzE7{4k5r5=w}6mKkmZ5>3`*Z*{=;K z=6r@ue9P|<<#hIzj-BN_4~eAS`T0#(P~K}%ZlJ+5`;b#LE3m;O6w(#sj8t{NRP9M* zrLYejIW5wVldQqLk&eD!XZRk$mFTvTC!i2(Y)H`1GG~F8uv%(M$Y5JoqDZMQi~m*y zvMVllr76_0Tx@>!_ht8(M*kZPS-*Wih5OMp^{F*9-#9DLzSCGwwIFpI_SBhhC_yCF zRz>!kj&1#}02Zff$k3Ky)V*OCh;I3w+((BO_B;e5QQz1w;vnJiF7Rj_Ed`IrSI#jm z2MTpm2A@;;r@myYJP#>AFLU*mh---avY?K(nFVspHEAwJob1$94uRM*#E zshXW%WJxYQe$O^Kn^Xw44lfQbe&khsx)&DH&=mO`{Ib*-m=}~8iy?A5s4tlp;e_eFWAsp3~<}Z{&Hfowo|LdpaJAn>nU?oj8 zwKVKgtPNw&NDJ5&6zy=;A^aFb{#KMZq9G@5fn3wQ>gyTw$3tB71(J#Az^d7>kr&3&HcT&fZ zNJ01uXxdI4ye#|Hm^D(^8_YHM0&;an^ew)xdPXwlT4t%d_I_21x%uj@Ft-Rkv1MTI z$Vg=O->!EaCbrJbE9j}k7Xim5D?dU)&BgJ*{shO>Jp2knP^bm%oywFdSHdU`6ls{f;(<8x!5Cfx%n?1i(KD&gX6iaiU zh{hEDpx~9gwYXhjYA+>XRNX6_5sOE!%3X0Zq~8ahFRxdbQGLZW6>T z-Qg`DO1@`0h;UuS3MYV_2V!N-kNl>=!gOr7c-KO)_xwm15^cy8(Xf!}yU27}A5zBS zPYV9G_K7w#C0jIIlN$q4@JXvd@^iP_tpu1hY97e3AlXxa>_n0j!|ABiU#XT68e5F0 ztEtJdeHzzGG^&MIm^?f@rS<6ga{Tk;@b<~&f=#D3T*ce+J%|-miRx-=L}VkY zqD1qqrpM^^?}Cfjd9Te*xFf`x#HLT_k>kK=Sh#eR zu=izqL7(eFc5caIgKU$L@`Ykb$#3gU~nWWr)PHppG>jDQX%4_R_1mdD=%1wXI{92KU6X`q* z4=Gl;XSz5Wa<-5~VdlrPGUEoZgc5ETP%~njG(Oy;_dl=*zt;hDcv>I?wAyqDf+^hp zFw34pFXo)0cYWq~;;tOa3-aFL2X5}Vhc6uvxWyzFe@`}(@>=R{ zop+ORgYc%P9(mH_U9NTkX^L|`nc~HNM2>A*C_Ly=)kUIgnqwHwyLH`2H zcGyPVWw>6cyI`)A#8oHk{=?q2o=lw*Z1lcCxY!Bm2&h8xm-y;{Y-L!2GS0ZR7-NB#>Dn zkO(gZgXp>Z7zi4?jP_-&c zFZMe{4g+@gP#iqsL6#*Uc(Fy32x^pw==fppN#@DKwhY$I*D=a(Fn?~?UfOrb%G(mg z$ia0Mk)+caN5rn0Y}Y+6+rl|;e%#OA!QD3sEm*A^ch9aYR+qh8qJQ~o;ndt2SvjX+ zlq2XFzOA|~LU;N_7!GEOdnwa!FbSA)xuG6}`6;MmFmlOY>!Ox37MIo*(sdNUkH$@E ziT`St)L(EgtH%Y~I&ZJ>O-cCFIim3pmviz#7rTr#bvFmvL$VhQbc<3xRxagZuGI`t zmNV`PQ>MZ0p1}=CXHPN9(elUdQqhkyt=*Z#y0~a%)XCWpdASeT-c90DwzmIC(gRX) z%rb2mm6a9OC*?sW%WHf$EyH^^D7CSYMMof%y$fW`pejiY&cb16LQyc$#j=}}-}Rvq zw+;FHFZUeF*Wle6-^X3_r?U{6&J2nFG{33$Gqd-LbZUlY$)Iy|H^zGc$@%*i8iS2g zIv`@*c7^w>tEug=5Kk)N!UvvAto(ZXjM&d1By6jGQB#XSd;`>6uc^r?!=4%7)>Sh! z!$nxt9#ep>p*?58T(1-Q?xXj=eVhLoasu>`ZF;qx&4=xkd+u4cotA|zR?-v?-c7D_ zMMH)5Ul(i4zohT`!4E%I8@Zc!GWgA_Z8C?e_HxoSWDQ`WoEjF70Y;O=Ub_eMLsdzW zOOr>z>%=PAPq{Ye;;R`QYY_`ap2?L*Drw-a#7m`$A2dIw>Wa2SGDMWDI0_`vw=lvT zCH34qQ!V}3_5Kqb5~7Wb2ze57d6-WVEthI-&%{uOgQF!3J?E+!k;2tg;!z^F&OES0`NOF2*^?OirGju=_bIs1s{pR3s;~CN5Qrk zjW(F2&RU9d>%2CXA%)El0*smwUjQrUgLx}cI`!wGUQyGpQ*zPkdFTAZ*)}uDUF(8n zyKkR3L~pI7q8E^_MR#!J`=^GIrlD6^p~P|9w@qFRdMJ$2r!RC=X6>%=1IfR2Z2Y^P zJ~B8in{nEIFo)Vrv>7jK5sW0#4foOAvlKctP3ObAkH=v_WcMs7KXa3L%;l3+We>Lj zf10F$fxQOvehB0G*z4=eZ|e%aQBd~y0pb0##vwkYp%a@g#nFWpxf``db?!&vtT8__@}96wG7!t{#*4@EFB3vb0d8?TKH{SaG zZNJ{fkKxbE5u9Y8|50?Ffo#5A7>`n;X3^Sv&kC`lYBVZ#s9L4=s{JQLZM8=cl-e3Q zc8aRqM(x_IO^Vv9_IjT;AM-8A{p8%|oa?%NLIgH7@END4f@lgFCN2~?=Y-|U_lWLX zn)`|UDsN7D*1H=%5`t)rmn0HX%`{ufMY8&!wiJh=?EiiAXTGmiMPlU2cl6q82eKNB zuA{$b-@j5pYPgz0HH&xrqkRl2jbDzSqy9)X?Q+`kGK5RQ!Y-|!_e0nz*B)kEUI*F! zq^_6~A+Rl05n(#+@qSr8cp4;5RG1J7x_^%fwl0v285$mu2MzdO_ku6C0I~q>cLUL; z)7C(Ydq$d72lDA!0F*frEexW(TH@4D1KL4{%bnn+*;3ReQah2Ind&+pASJ^yHG^7!EFl>}|Lze+h&+V!VX@#c8^W$sOEvFqaX z@YdeTb3skI-s5*Kf0G^exRjd>9nEq2K&Pj=^;KUa=T6SZRqtIqCaG&`TfU3tBps70 z0;x79ZMk3sfy#rBFV)Y=E|*yw=RL7#n%()97RzB=g9Op9%v*+(tR|0i4hzUuNu7iUCMs>@ndT%%W1@J#Cdx9)^v5Uh5^Ph zKS4nIO^gCFC8bLD2aXIDpZJfb9);kvgHXkVtM2=1KTdEjrzsin1^_6*J8wM+FGaOs zN80W6HIx%foH$A$$2CD&sbVq-&k%mDT%}E{WMf2|7(K7VcLYuRH2Cu`G|@hf+4hNC zf+U8IWUV;~pB~!k3^kY`N*C%qh)=r|m^$tGvRMQr_@$gxj;Q>^QO(S;Md+k-g#vR< zOu5m)>uPaqQ5jBPHu3I*NY5@0i;l;P6vMenKnCa-q`~01_*w52Tfdy=(h})3W3D|D zcZz9A>5F+6rIA%F0fw5_pJyTt7It?F8baKwKVe%ISZl50UoS3I@7+sTKcASG;LT3J z*=C{5G_y)!LaN#s>Tu!ZFHRC8QWL@hHdz{yde8IFqb8MePNq(hDDPf1xPhjaA;#N= z)c!lI$sDvf0!CLv&0q9JFm(1f6D-#(J*pAWg_5*|fFy{Yy)P)Cr-=p6sJ{Ifm45Gh zvnlqziRZa8dz^{kl}b#Z{(ja_3Brv61Y$r*);l^Eg*Dp!{nv}% zH9^PZHHkL>fmgA!Nf9^}bBuMt73DQh3ThO$a6?`*rR`on}8 z^!1cQk7a!El zzAeBKy&6BNY%}(O{N*=5@gan{8xj=5!z7*^Y8$}FK*dX$6(whaWD?PwOq2?y8TY7U zt2-8*_s-k*n!`r3r9PNJ18%m<8S>;VM-xB7Dj<1h!Fb9uu4!;|PgF0la~19L#HiB#!<$*0^F~GwtBp&AX>V ziLZ{|n&h`kGda?qApNlYVe!xbTJ%NQzb<`0MNID<;L}T=W~T|>;U9x0Bgi__r?BPc zqKT0-J;9H(e3qaiHhc}%O=9WZtTjf}ekY#?Cd=PU;FA=Yc1zO?d>vvXnIoket0jmz zSyg{}1@#^$rZ`KMJfqQZ-Lr=7O1)}4tKbL_3oTG7mPe|{byN3v&yzzRl}(f~V*_{w z#`_8gK`V6k6576VeA{JeW)~9ub^A?Tt?q{%7*2|X4)v@OGCnOLMc_hdIVU)0q^Sh& z!a)XfMT~c0V&9(2Q|&b>A}S_%TodXoYkKak&#BmQbb}<8CYf@DuFYqCu}~nNO1S~OTrjbPYA&q zMK~ZS^t{4Iyn$Cwz*G{fFbyxPGkzbTp279*la5f~#E0&PZ#x=qJDP>+<>?nr!o1qUkUOb-M^dnU@$*a(t6x>&7 znss+G?0-jxz%__gPj5NX`UXZ2hE{T;xR(2AKGOTng@VPO>n2=(A+XILduEp*=U$L* z!`W!85TC+``{gMo7qA_h4EUw%BM4>2KG_@^HWJQ)$4a9b#VARJaJ?_ zR4W0I0Hy)nL^)^hN^0Fj{>MH51C?TnIg#GdkY$${M!?)E-)V44$a)Up%({ci89Wa4XRVtPjP7TT2G zBANyl=~$?1wu-7NFv8EFJIDG8jIzdr_3+j$G6QVUjNJA%x88}y=nD!$aWurg8`PNU zpNC5`U{1uQ$~ZU?NPE)wLI?c;r{MNk-9To(5s*z5+to?^4uGz^+0)BaQ|AzZ?h3w+ z1Nm)9!3=R0%0DG#qj$+&-`||k>rq!I$8l4+h)u{mR7=tSgyL{#{jO>oKN0geOjnhX z*6oss(YAP0P-lE~75#f7%b{}BKU&7KpV2;nF0PtqMGh9BnfmzX-*}p3JZqb}#jTHk zgPFmu;@dB*MB>mOJL37JA*8Z?$C*`S`UNh+S3_>qn~BUp(_#Ik-{Kt*v8bkvYS!q? z6ou(9Az|14XtTJ8yBK|9Mj2Y{2RDc89XfSb)tXm<0~d3^{?r4@0@bX-$hTu(h6S54 zB;sN+{PdhgDZbwYXScFT&wL3WUsEiU`4L8(MH7jbh(h4xN)rrT(T7S#5o4}X9^5cB z=F2fR0ycfV!m@N?2d>Izg3K5)KA5X#_{<;z>hdVR`IoDQ&+vLujwbFJvRU+w|2K7> z{_KF0{tR9iOgcxfd}kde$m64$6*Ob!;4h=eACX=x(Dm_#I^}aMqzSP)`Le{tb(@h(dFuf7(MHUI?|ir!fES7lOiKlfED1I zZUYAE{`renwntOc06DhfZ1HxCOgL|kDV-$v|6t`d+3j6I{qQ(R3k&Gy>CO4}Ci$#y z7Qois0G{%|fyXwX=N(F(&qxFS%Z1|)0IJ)bZ&BYjpy${?`Vr)e*6u{FI!%nM#CUls zJ)-Cll^U^t9)Ej>H%uRMM@r6?LH%BTwj>*4oxT41>yX~Q%JOj6&98AP39l>dFq=Dd zV8~Fqp4pmv9oGxPJ4rG}ug=Vqm;*0r+3Aj>L=Pq3^9^_#7p2?IUXgM2md~;jm9yk< z14M@##+Ag=FKDaHl8w{MTa}Dun^8F1Z=$szb|HpMoZHOjQ*hh`g?VJQ&}_0t?TFs4cYFgBbp@*AHN=*rw)MMCIg2u5t)|h$B#>G)1E50pXAO1gQ!X zznO7q$roym8j3w}Hl_A9Y)i9TaujG^FuTB@MN)XA$m!38Jxm*t#fgA9XTYi%?oB_R zAqqCB&?`Nl8GR-sM9^U|lm_I0VEI=!jcBG;oUR6a00YyxfMFj$K6d{Ks&!R+uhSkP zg!6ru9?HoKXCx$Eazb}{xgKvU*M83}XlYG{rD1t`KlLl-ewHage7w_pEG9pXkYx&; zjBMF*L6h=i)lkag-J}^2naZ1 z@z>WU>&mz9T3XH%NmxD!5^F&G?ic%Kj0_Fq4AjHs%|rB0)Q@^(yM0F3O_c(ir64 z!#;K>gBf0gv-!rSn-{C1sp{KBJ94sKLQV)Ap zXHCaToLDbq^2x7I);Ox5^Cu&&Qy7nXb_r>wAtD>?|8-OkCKAGPMmjdulT$Vj>uzB_ zMH+-xz50(vefaJ=D|J6LR$7LWx%iN`e2Cpt-s|(INk0}y&$8)go1R@<;S}V8eT)ca zjEJ1M*V%2SNm=+;j%%F?E#t?_+Phxu*!b@X-d6YHCGvU~qubQh>eXhJpH!5RzTfPr zw8#TvA>u{R{z-ae;kkQZ`JH;8n!|fIi!@Ym)n(_`DE7#4afqj*K`^GPXh>^mB#GE}+F!m*;5sy5J1m;0+@o7#5o zqBnl?VRUjFlJg($lC*;_X4)|C%7xdrXXanpPSn)Q1#gTAt;y--$X`^Rdf+r|8kdvI zF|xpYP!<4)UV6GYmzb4XcKAzCh+sFE(ktIhjz?v-UN5wy4G8NgslZbHeNFYei+=la zMmkDvuI0_{*^oI>jsZc-t1UbvD6xe5gDc2jvY)%pE(VPoWQ4?+IYZ1G$j}pBL68~7 zo@QGTs6RyfdA|yf9YgYrw8BDUU5qvrC=KvW?Naz)?j=&&2Oul z=<|V^IPac6VD79u=V#^W_I}M?ZKtxg!<^^){pncS(%|*WMWBBOjzdup_dwW1FieCK zCE$=q+Nr&!=XoX0+($or!XY}shKbNbnZ2OD0R*8x>W#R3?CVo*4(jFgm8EI)j$eQPah zO5U%!?Pws`z2oEa#kuXagM#A|%YV}yZ!U9h4*(v(&`u+9NAM*EaL0(Jzn%8*HABF& z91)cfnG~oo=n!dk1XHbBfS9+OpMvRYUE+A#8f-M;$ei65YNyVcRC-^osYj0(gkpHj zaOuvZ#`KhzqS=V4!Tf~T?_A~Te^S>M ze7)ZpJL*KS-aV`#$YmiHDQQm+(pQy7wspzb&=c_aJHx(DFljPW;iVu9Nw1;A|l!Kn&ye=CW~B`UV8`+6Og;TIki;w zIs9O>S*Mi=xady&IAmrqxqf>KxN3e;&BHg6B{6yAd7eFp4>&wzU^q|V_@rj>o>sbC zo}ItDc6GfvoK5GVnt@g6pqU}VB3dg;mRZWWg_qSpI9-l(+9z?$nsK5+rAhWDV9!Jk zCXD)_;6jFQegnv^tk$ZTtH=1si;2>8Y{s>v2=L&R|JI}z6B|@IKl|Q^yrcJ8nnW+> zWgps4sZ=(GzWznNeCrqe+gaIarC%B#YeSeSjn`M_MwzlpCdjdauE;M+vWgt13KTU2Juv|g@au*-N@cGyK(aJY{kBSbS zF+qr#BycLE8tY@(t%B(8(+I?aST3BZTM8JKKw5e|X;^am9d%j}bj>Qe%n)XxTNq%<9s0d@EhY!R_ zQTIcs7qF$URNT62ZR_y+SWDeDPk`CJMJ5qWvU>4dAg>T*k9fW%#Tw}uaq!BjnZW+f z^2N@7V*~tdVp5oiI_%^s`W!ImU2T`%?(eqlEt&(th=b&gFC1(#nLd9&mbsZ>IX#g5DQ$F zSQ;A0D|gmPxJ)V_WnfE_r-{YEj?TwtJ|oca*E_BeW+KbY@miIJiGcEIWjJ_!xGj3R zdU1PqFCp5^jh@>Z)FHW=DQqEUDpUCF7YnV+^&I(#-k8n&QaE{6^Zsyd$k)-bJ?W3> zh{@9kUUq5?LelVhrCKT6CzMS74?)7N`;_+GQ)*Jg3AB(iGVAO2!ajff9u4m%aH@ca zDQY=2xVfBq6i%Kbs52~^biZz4wnahj{35`)FSfiC&YU(jF4mM}rBoU*7^8{nUT$;W zJ3GMlEdOLwqtWm>oUkqZcar$`+S#Osg-4 zktb3sPXCd}*Pf}$Z}JTwlEA)KkpxZMN~FDq%w%X*qGD}V9l`H53}8^Wmo7~UUXlw4 z3kye}!L47vUSLNof@^0N=eH(U$Ul3hO5Tr@-VKP9=%?w#F3HBB$Y5EV6Ce_*Zg=HK z?})!7eD~ger^`YoF-UkGilT{_Jd3@1kF^R%LWQ$5R|K;z!)BedU-TDpL}JZ$E*CE@ z3^N~5;d8*^k+MlEMk$GjLzmR-a+dn{!qKbe=Nnn8=~(o;7MC^!CTfy4;7(^z&8F-x zNqXgi^*b8gfn-gTtP2ze3kkYHh=x|i45mf=+qXy!Fq29n$d`+p7kSaBdms!YqMvlF zMJ7gggo$s4G4Nb1JPH5DH2aeQZDLRDl)Jk^^&|Vo(rpFUxZa4g?$x|TZGW=|J?j}GMF-$7m1IW{1F%E~P?oxf0*{!N#HO+DTb`S{~sZXHI<~_)5-O|jy zLuiZQ$iR>ehq?;IYl2C-*t%X~UjLUPfs4dPENOdUj0}9WKd{x#YF&1x*sgBAW=_1o2si@z6%CkrM0hRc~T zM(H@!j#-4H$a5D^m4!2E;J6L*(Oq9SUF3Mfo;X3OIt7@sS>8^`CS*{vS3BZ^^(#cO zO8d^{vc?nN@$@fkj*hPnTa`&WNc$|bd9#({GllcC7O%dK@U6TCjb0qz>>wKg_x_v) z8*WzB$Z!1nH;6TF+DvSL43mNrVF1zx;62{4g>TtO67k#7GNn-xW8|`FcugPbM9n+R zInv_~IGImL!ElH0z^J7+zgUuc%^arwJ$DB{SZmQ%j@6tZW_3$W3q%@hi zsUOW90k*s5_ICC&0_Ng$tk2&D$C2H=JrT#2(ls&y*aPq}*j*O|ws@ivF%1gZRqcBn9p_JCk~CXWOeJ zA6tX<%|e=ech=Zozh~;`q{gKL!=2`8qTKsVFWZ7qyauS!d!PN-6JRMacZB%LlB&h2 zF0MDSzWX^UlMY1Oypm()D<&vJ(Ml<`8f8@w#&}~_NTbQ4!N%niOtwG|MMXh#Ka{NN zlZL0`dR=IAeDU(O4+#FkEiKdEm3SGro;2(il_n}1avFbHk&a+3opMrSri`dH zs(hg|viIM~$H1YHj*GE3v`w=*nDq7NBduOkYBm0y^#`sEb@nJMu64#=|(3{%U(3qFKFF=uyNU+;68S|z3R5r17O1=AvZ_V3qcWJ z&xrcb7O>p5w81(t6PLr$a+FN@l7vz#tsV}$fex^R!EFVt%wJZZgsEklKA&c{b0}Dv z|?>Tw@eVdxJtd)34)4IS0JmNKJ%{UD4?< zMDr(VwsEsnC&*pvk@2astAp&}$KvZE!iQ9le}ux7lo0U840Z1htzjB#F^zxmH*$Ms zZ}h2R_9JN?K0R=P-drzUD%t*<)};IQLj^IPPfw~XJL=jG z_9Likxb1VKrhQX>;*6A%1Tvl$H_E^nsI)#MZ8!Sqc4o_t6cm# zu{=XnQ9ig&iOABkv6)NeSD@1*;a4G+=MDbxsbxq#3 zv%pEYmR#wbjnq;C4_~mq@K8Nnukq}4-^lH9O+U80?+uL}@iQip5+fVCq-TPj>JYP8 z?T1P<<3DL^8&&w4NhscSpm4V24~jeAzlXc^lXYA4cOJV;_B$$HZy5F_Q;|e?n0`MUS(9WmYFR5Fyme5sNBsO!{b%b8Y6F6{nt0QHwx?Fv1Q`cEvDvfPW_NLXjNiKJi*(Yr=V+iKtVi|c<-vp!MVyYQ_h@w&V zdI^^v#ucRtzxFP3tJ0GbM<+xGPP<&IjNcb$NE*HO1lXJw#T0%K_gp?JTz?UKbTc{0 z6TdSb-Lq^$WUuPXuGhRDYH*L@fvJT_@Wy#*&BE8&ozD%tar_Zzp5E-h*#UANtLqil z{J?{Q%)HjOo8M-ziq!R@V$Vw~->hP#de=QHT5mS=lpDPN#7tZiZz0pP$sWVb68fwVWOLIhM(P5LzJ@&eD8?4OY_?-27%AAoYy=03Z%gN9?dh*Jt2C_=-; zhF;|u-b-Qtk&3fMnDtQ@(AhGA;ac6Hw3=B2I3RSlfFlFC=t%T(k%3AU7Pgh1Fa__w zQ|l;FLkeUD*mpjrD4Y;HCKFmqBkR-nl1MFpNx1*&gx-DnExgSC--i&Is;1nhCv)a< z)uiZe^qd$cXz*=6$>POY6ACg5INb7fg$5Avu|>7?_rwpOO(hH?zAu4erXeTJM-$cc zjyxIACEJ@m&Pu?_5E;Pj^TR!fRC4*rxa(?+SaeM5K5(;#%Za6Rwrf0#Ej01Wd!M}` ztooZL%rZzKwQ;zR5WzreOV33-3L=bu(i`En7y2YL|5HOD#x+cBvs2{@2~#nAjf6By zEuBILoy6gSHV}~&RIJVyxW5h+oE9qde@GYC?YsT#_hTR1pN#1A>%6*^uqwD(ECcH0 z$m0Cl{Y{aPME>7E*B+bdY*HbFMgela;k%$>00m#{LrfoA^vzGX8TguO7yWRZVw3gI zk<|OhNY5N^^rph@%GfA&k|*Ts+JoPD(?1Nafbk2g`Mphf@uFt&_q-byt&ybQi}wb* zQRBxK1s!`N%Llds%3s=oU;8g(kPD7;cOA;WteyAY3*f!WMOjmx8eqUmO|>TFLw>Ef zwG$Ewx%pYnzJVZp@yz)GqY8-J6GjvhT{T`lX=zFeSBCe7$JRZMLY1@_F$ucPK>!eE}bQa!oLneuiRPAkdcv?#j4W+Z33emzx84atAKYSs8_sZrqbAAznK+9}4+2;W{P?tFDRzg=+gCpQq_4Wy|;wjPW z2U#qCQRzEYTRdw2hpu_Oy)DrVpA;JQ_jSP~U9T9P!tla@ z8SCfx=HDOZ;d4*=rtC`~%=7JzPyXd^^F5s*aY4*W<$nX|aO~*bXZsAcW|&}b!im_F ztXBItLX(LFbI*oE1yb?%anVE>YjeE16wYn5;9a;$YUH@@9#GVS8%Fv7*D zDa{lK#qaWMhYIz*MkYU4Bw%$NF1+jhjuxI$uq7w?g5&L(H5%a#*^KDYUmd$K6KW70 zuonloq07y>ti7M5nG(q&md@&Iy&wy73#o`T|LXJ-q9f>|XMZW=q9I!KqG$?=P43&+ z?~$F4$uDW+b@#bN1I}nkxxU@kRnbuk43>@5Z~XqAp2-uE`dC2aOAg`f|d8rucekk2XN;Mz-$MJqm6J=qFh7AK|S|ijJHK>6`Xj>;~ilj)zP~}JXL+91B78S*FRtx62~|EHus7Fw)OD;_JSvyWgL~z1)V_81c;ov) zZT{*(|7JN*n@FyyXg_}r_|s|?^wiHEfJHGX7a~4|_3W2*Jf_b62ytF(amAX_JvIs;ebl4}xR|D&w;sZ+@PH zr*dR;9JPj=Z4NxT{ms#KgB^KnC_JtF#kZ!VBN`R5X80%rzI@_7{wSTaaGgEGz(tC6 zUHN=6S}GBc3+R2Z#z+kh=lXAxEMDTu@gjK5*H3;}>_RT38jj4(br$i7Ul<}+c?UvH z#yM`6knR5X-FYAiqn~XW5LcLH6VSj_*3K7(#d$9N)JdZcMF)r&a33}Q|2^^EQ z6m-iBoU;f)T&O#YwryOnHQFj_>id|=y;pa;ih`4Ah+j31Nj7OobDx)LjVOC*u;&?* z%W~PuJohcbFa(gBeavB-(C2)YNjJ*a|9YzYXLhAt$ROjx>#OiB|Q@=%zj8YIl=e|1@5QTflv^k=Ys!&9_HfQR%JZHW>`T?KYAy< zaL`oK>t7oljg78KAd+RWX&(z}vgM?KP=?k2P)*`1S;8`(YMmI_YPm<>1R1=~?l=sfBa=*&!{jT}ViT|?IW1=K0>|ji4 z!umW6d7esZa^d8#78X=7@BO5*=dP}~Q zg{4`Sj^hEtN@oEKQ*UQe!-LR#H9;1RC^xQ|7PJjEkq_MbHd*;1ppBjD%j8U-lsqHV z3jF|<33f#1s`UtZyMkxn_?TZFsM0dK)A$9?s{>W8LUqGzM~}3K&Wzer!vd>E2)ylS z$QTMnJwe1z2<}yvi}}dHfU8B(vs7NT1OX?bJWZU5Pl&*X52U`~RG*~?xcp+1j>X<~yifLz^)Hgp}b)tf%?*o&xj{WnIW8$DY%QLYJ z^SWB3vPm#S^R4TtT~8=@f=?B+uBD-i5~l1vJKz~eI6M(NUz=_}Y#I5w{l&TkfzchZ z{Nf43VJPNyeL|EwyL~Ddu>>f$;|%$2SAWLlwgEzy2zGO(pWAb9%+^unqZkbz?&YVX zeP}NwAQUbaZD19Y_uXA_wK~JuGCT@gp78v6(&JJyyIdwPTClj~_oX=SWA5eY?qsRM z>1k`cPvYY34H7=C1t@wmGLj$P&iQ0=C@*d&E}U&Fs%xHvTu&x@%(t5#7Ri%8(k{T{pr0|~Vr=XEAHk8hdo_;J`2KIZ!Mm^Dt%SB8I5+`}5-Kq%X3_*bd zRiPG!G@}Kha2E96TfM~v0io1)XHS%OzciVwuZ%-rgLq#1QpwOSM=bas9xFx_m_I;D4=tb zbGGfnm6Dia>ZY2PiAa|apcC1rotH;VP4#Df=KHH?_mm?%}ZP;~pd zQx8ax4-}4YVDrFz@Wz6%o{jVF>B7gO1(kO0%3yH|8-3Su9RgtMb&UJ3ZPdil@&d1X z#kQoIr$wMI{(PDPm@>m|_v5YH9>0~_MEal|*I%SL(GpK~A}{CXH(Kse(IoaRDfk6z zFnQA$7cf+7Xbv}bG)o}&b}CU4@x+!Rz+(#2TQxUAn3aIp{&SeUbhE^<7@+KHO|-zc_C>{|+k#%PO)2+|13r zMk9iDRvkNTS{SSXF0T5pze^wGTA7<#n42pFU36bvt;FI5;OH^x+p|-vfSatE;PZy# ztjX__hL1YV=7wgGCCpOAz?}k;n3i1qb$+w4#gh~-FamAI9xrwEbKfc8DUv!ECK+Hf~;51ZiWHBbXRRdYl~M$TN6{_ zW$P?;RK#w<{M_8!+ttbGnfcLN#nZ*$t)c5Rhm3@=H|nEbLsr$eh}P+`{NE&&lFVHO zYY333eG<78Zk-xJ&VqmZ9cWJdP65@Qhv?vlRhz$K@T#2sa6yxvkW#=(LP-+-#oLjO z6sLey31LV&D&=?sK&j7g5kiGJi^jaxD8bxG~eBUOZy-#+R_?6x31j(`wm{NSTv^e2<49bfnmOxohh;KS6S99f= zkm(gX;`4)dPHOC??bH=j2L%;ZO|4;6(9n+6aL2)LW;z%(hT|@1;6$2XmHipS zR$S-{5+iEM@lG>K>XpTQTie>y$q8DEAv$8&2_kHRjv*G4ph`y|;BJiw_}W+!HzhMU zyTG$|OQ_VoW_?1khwnU}>NysQfxVyE$rng)P_UR7c&nH5(=*D>$S@1xK+T3AT&Ou( zea$$H&*YW-GN>1l27(%Xabw7iW9(kg#?$hlM4}8b>;H5k&5*zqbdI?q1mA z1i7+lWhOt2!bXM%|1%HNbP>iz?X|Q(fZO5M{a-DsX!&U`;)uU9ZI@etfk>H;O|sc6 zEFZJGYq9ei$L%*m9+R$yY3lr@mX*f+Xnp6+i-l31qaIDfy(?`vER0Z1^(X!J)eP+o zPhC>YG*L}Mc)3wlYK8K)OYxZKbAaV+R{@@O-f>Q+Q!n=}8tRkEeA~e)aG$X5Oa0-_ zqxSu?jY;o5^F?FBn4*$J@ zzD5cd8cGXEgJ{&znjO;%L2pDxiXhp7_J`2t3Z;=^V&Xf677c|IRUHy5ouo_hbGzIuO&walJh)>pt(e#Hh}9gmKX5yZW2b@;eJA{V!h* zx&3Qqvww`$k@0($B=3-SrkaPuRsPM2@@~`VVu!cVi&V0Z)IY?(dob6>m$GJ;I&KnW z+SebIZ`W(uudc4610zX}d>Vi)hgZp?mjQ1b-0zba^{>jgc(~7>MvVO%>@Jv<4>*Lb zb|v4e)r{mSeHU!$Xukns>zK3hA0wTiyT@jit8naNrTl@xN=V~qJ423Q&;?enA621=qCI zcc}mU+I_BLdN#xcI5li?khL9{!gLJC69H4LEEGualUqQbV`!CZTf1@MI#{du0$Gc3OZDzd0k zHU7~&zA=|LAe6ndW?)ui1U-y+td$`a$!z`I8YjmU#fjyuDmr0LzZQZIT1!q^k~D%7 z!uBo|f$?2y>wp$8rSNz3h$d+GZszopA5L00Q;=)E5|%z%Fp0=YmDDlBP})xv=~lVX zk8%ous6Gp?a%M$FN-nMJhpUpI6NUZ9txVgghZ5nxe;Y8sbD z{sirjny>$^8jw>>i-EU5hEUL=Qhohd)(fi)f2#18!H0d0`N5kvZO4L|A;(*b7S~Jg zn%U&BPc0n+IiW4=PkBP$ttvR?+=RSsn@;;Q?Z4)~fPb9%xIuW}1rm#_)d>Y@(r}Wc zL=u_C0er*a6d0JLfrUi3ab$Sv4pD8O#1fVB1Ta>-hM^fjq4>je2g=U3{~>F9e^saFMi1xjQu0K< z=jgbCmD8i(4=_44vkP-yW3$E;=F(K4jD=r0rI*Yt!keUlX;$)@)$p&-Cwn+9p^;(BC<;oImY*{H6-b(bg#A_^!?V zxr0@vk;1SD@~{y>Yy|)GvO)IC)>i5#tkXm9X66>!I@wrL->TiN`O zfXiAAdXbi&N$b>6J%Fn6Zr+yuSWZ^1m4$ARX9-xUBVcBAVera3hm1G?!k)-|9{A|y z+YW9kn-uhMyk)G%l_<7@m(vMSqzqMyc|BaH2&09_gn49&d=vU6N57K;lLV< z-qAURNeu>oTVSL@@G^RCW@P0Mx)%A#hzhXXHjV;xY42hztyx9m_|C&{?~GN=R69+V zMy98~ksa5U)mvYW)@Gl?!X_S}+6ow>BcSo`!&J*%B)&&V?8-jWd!zE3GH&kp1732v zIFfGjzgfk1E<;`-nh=`=Ave~VPuK}~OYp|k_oJ34%y@6N$AZsEyPilOm3A+dmqa!H@Bb z;-LTGR@b+}n^;!mT#h?=W2;t4;Gi1nAH*5b4u!-&WITSW$=*o-nSO1>%lT(e z6JNVvF1pEqp{)0VpnKi+0*uCVDnFd~#LDAn3I+|#G^`;hrK18%jKz}zlQlRek$T&N z?Hn4Ot0(uGPV~+DU@=NpcT|m|{6UV>W_S1#=L` zcPO(nAB2`$r!n<&5WP8$355G*W66Y+z>#JFD>s=?3StzQ?|Geuv7XY^QD(>)L&(3& zVgoB-ASgKF;hL-rG8NL{g`ZOH_~)J4Czn`!K-#P)H%)7>V&@!5mTNBeFp>D=@N`r=IuE5c+6D)G_7k?`eb%V-# z+H(DxPO*-ULx2Y{KLV>Ow1M@jhm;SB=gHriv`j5UCawHgX&JXVUn#!J@Ipi-yZ`uFyyWkK@%kTx zZBU1y*oB^jNx&X%&8FdMH~q3{cMswSH*d|gjX$1#+?%rQ=|BrqQdwEx?lKAF`>7>8;BT9hp=TR}cpC6qEk^)AQ&p2_g>*sRC* z9KW8NdB^V;(^E}vWKf5J$PR0xP^WgAMP)|ZcbimR(kw_?%X@mf#Sd#<)?Jrk$~$mC z^Et9ZEt?=Rxh?9k1r_s zBtJ=Vb_#ZdmT$#D@kz?^qrZ!M2SaT@-&jNDJOI$QkZr>ujBxdb$y>TCQ|RQ@@&D=N z5^*ycJKmTi@NinK@x7B1znYiVAG~|1<4(S&qYd)ZiGV}#JP+6cWc&~$f~`4AZf0)j z;N}*VGk$P`B+TNWU5p7bp#CEfI6vavS}hFQ*w9jKr%Nhr#57p)1#*IqQ z_fI41Di-5rimx4fxN){1+o~Cg{21konmbP17QZS%);}zH-p_L+7@G;{Fin~@nQM?A zkuRS2D8D_%PSdC|MtoLnlQBd#bLSY6Psj)+6^V}Ym1@RiI7AVEc#2bkLB^vQ;fl^3 zQ&UAY+n2o`ekncEvVUDC&HeC^`<4=hHWB>v$!mtntd+^v;SUI8()1ag34v8{C7o_o z(Vxe)C4VCuv%~jQL}K4}p>*c|8nM{DzGRbxJFAi+gL)5=PMVT1>{@rf1h2Mfu5;Kr8Q)r%W;&q*8Ws(ND5Ds zAAUJ4!p8R6U&V{{_ecrTH zV+Uxj7thxAuICr8hDci{*E^CS-DaCm0s+#sjItNL{glNtV?xdE-fl#SXKpM6V2nkG zbQu8{!Q!fQ>Uj>WYNQdYSWp-9PE!b-GKwHClz^FL?C!d+B5qet+x;)j4zK5VF#kro zhMj(C;w7}Y1)2E{&gRteA5DK$70zs3MJ!Xd-+Vt`(=PrqGJ@LO`LFA}p9ek6AHzB~ z^NS;?xRk@RwLREGjMy60e$bU@mJ;&jdKm5FcuGZe8DY(sxV{byPp3%su5J8}>ARpw z-4J%olt2DajSso$RC&}vJewJhL(Wy{`J#8+mjFVQT(#qaZm5>x&Na;EJ|QhUWJfF0 z(b2^}LrmKB6xm9Gx%o|}wPoIlARW#fm0Ka2b?fv}f_vsw@{Y{3c?s<+L!>E*HjWP@hIA;SL%K^Ef&IwQ1Cf&M?v#)ah0%?G;FyRo5NVNy z(cK6lEg&GBgZFv2vp;wCoUIN&$C1CKoAA6OGjm+fawO z6;em<@4gl-(l!*qDF)MF6g*O?=vX^qO^67%sx{q1dz@o%=r})-u^>A1wGkElUo-1i&-h=GBnRF0_-JD26g?=(vb;aoUm|`D58&K58gneNF2UQ z{$}ruHwU)s6If$f(5n?gC=3P4kk0_Kxs+6zmAQP$k_00jU(6jQcbCjA1{CC2hFLj3 z=M7c7ztTdEMldGXXX}s3TT_v6R435hp|D9<$&7S{k4MjDDjO(r4j-(vU zRzwI*^LwrQlRuwE85-n24iEaocsruldNy9(Yc}B5y#0OjOzwR_jldA$GP1L{us5Vx zk{Dnd@MeFhdZD6(wS5UjXDMUsUBsBlL-c`~pY-ney0j|aMRc?vIR(4kWSvQ+HE6WC z+ccZEyx!=_x`6rbp@eI_YqR&}Rw3#tWccl#v`hZ$39P{%=^vKWWqI0N8y~FN*|QP= zE#!&B5Mndi8TE8BP&#%PJEBv5dOQeg5&uK}#BH3hps4+Wy6`-2NUs zd#~0#V8?Ho{e%?|k3vpciiU_BJZsL^q}mr*xJ^G1D{HPZ`m^YWtAp^slV&(LoSb4*VC&&=BmJ)aj?DDWg5@K> ziT0`fsm$Prsp?1Lkb-U2KvC&=szYW*QTSITPcgq5NH9vDCnj}^h&VHA{Y}zr&|l(@3mT;X zFe-rVgU*yTzX5v0(G)k9C#$!+?M0<`-#Xc05IGSr1LMB$VU1vF{4IUpJ$_=5)546@ zO-I2T@Y|>N&*+n`2kPsCtnO_7Ed?#j#5Y+TW$VdC81NLr^Ic0VKJhraGD_kw;zId8 zUn1|m`WaOlx3r3?CBUh;Ly*SWemgD6lVT*)=%)lw-d{f#7~`HKQ82Hpt3TIHwI#xybrp(UacPg=R|w4*eyNwlB^{@Mp}yyIlXy$ zM(!DTxB7G}VDy89SuQUr=BN;jRBImpOc04p5zcuSk^Y54hapL=eG2!{{$Cb6Wlcbu z98y#YkC{xcX6|GA)WcJlXaZZkQ9XF^;nnS0M8(|U*;rwFaXlr}7J=%I@7A?*w1nAw zP%YYSAymJ=T+bo9Fh6X=4jzeb^KDY$ehUgVshB?WJoq52*-;F#<4!`81WyKUE)uzh5* zmFKIypDXXpb5|A?q?gPO8v>=v;9DRb@Iy3mb=iE*tmUT`e_wozXIZ@=dW0PhAR)m@ zhcnY*g9Cy~k|v;ffAc3k@zdOS6XRCxPN!>N6&;(#~h{@b^Y2_z#l3FeW$@IyC z_lDR}mWaK}$+hJ(!8}gu86yvn9>!5gX%oN-f0_W>RA%*0nQXaGB~1YX28^WxJj`e7 zK6-;o!ZY?%PwXD3Ejo*%hFzf)tbg$x4rJjPN|f78V|NIo8E%7*%j%-eWMAL=ADyX zmuRZK!J6Q)m8Rh$SwsSf9A}}^3?ziugLl+!6@A8DD{T*=P(b;gH_m|iSxZ({y>T{; zb>w4Flu{FR67BZup$SY!7T{Kk_}Pd%E6 z`+g8Jd!RP;k9&Tc3)j6)P0g+aWuw*{140Bia_6Y%>H2=;G^vn`Rjj!Ji4TogUe*h+heY(J@^{I6*Yo8p*#8 zmmq$hEh7VkZ+E9?QRBH^VFL{616|r#w(d&d-r?)SDMjJfWw)Y3pMyH`hQp;+WAq3a z0oF1sg(^M-AC;5|bJJf8EYUzFt6EA)P3v*3y~0B7KTziHr2KbuyZffi&eK$7(V%seE>O zUAnH(4+CP$CoZYahHDQ`xqQh?XCL||k+XJ()fruohEYI)IU4Efl>4K|?>;BG70V~L ztXgVsq%GOJ%Wrz@Xmhe3&jy+0eWQQfgGYxJEW)AtFK?RwADz{|Ce66zlF79$!B~0( zNlgp+^1KSg9-HN=Bg~Vmt^m>|l2rRSYpX<{#Ezu9IF`?VYSTK(9yRC~lbaV1nrYe+ zKOc!bbzq|X)4o`Ay(e5yFwH%eU(R0r)Z{B^K9^M|G-4w5%Ue-sE*0U|8f6U;@Pq$~ z1^|z_^cabrn3?ZD!5t?y5c4O~`%!;9&ot@{rL!y^j3iV5xP*le|=P z_48hn(6&k_d zh%{b(`Me4~NsKGS_1&~9&sHlNjvuCbL?1uJsnt%{(ApHc_zR&Bx8BjnY@g0smVzc5cOHt>>v;4ev!U|}2ys(^=cxYI z*1X3N)h|Doro#Eq$$<^BHy4Dj!V< z8sDEysy7B9)KDE^S0gDI5_6bWR|9>B+03rdUnSeJfa!q4Iu-U1l?tcHut>n7cI!XPT@oef+cy^oyDwew6p9`npXv2V4XF zya?#sLi3bOG|TN15YsS*41R}FiVR2^L9D3QC(DXw*Z)w!RzUm>WtSLj4ol?eEc&PV zvQXI%eIZ(i=47SO`;e2Q#zkz?PX+owa!UB-;*WIbM)UR!-rr6HUmn|oToKmuShpze zE=FyNpjU{zZ9;J^ZiM8tO%<)ZfqO;FK9<37_xm&QhgoLbKCiYyBT9w~qqk{)6!$E5 z96hYsmW!A;OHAHtv9#_M$Y?^;3*g@7zhJsk96SD3KD@gj=pjnamhFxoHDMoJ!ey$1 zAnF9sQy81E+dZWa_3*$}+Wms;anuAUyl+y*fKV9QA6(u-L(5-5mi}jhGsLvQnOeOO zk*uY4Xo%9=kl%id$=bu?G)nGuVrC36U`!9y;rO&qEMj)h@|FABjzOE)=3FtPpq`H2 z2b>}jzY+h>?qTmi{0`OPi*N2cnjf)EM>A83LBJOe30@mhQFlO=ia(`ghr9u~A$f!7 zw#{Jnt^Z{Rrm!O2ja=abrFE%q3@pG2V-Z(cR@lY4l;mW_gtqg)Kv`!u=m1R~iUmSr zgIR8KOSX25ecivDBd#txf2sK$1(%pG`jgSE4xb?n^!VR_i@v9bK=rG}B(`1zNgZnB z?a6n?>d!rI29Z>)vy-T~*df*lW5>PcX`%WEx}fJ=53?}EwR${h=S#VqYWy+!MX{QX z-AEC%1X#(<0{zAnMMwa7Tz@8vCyNl)Y^P}!@Eo^MTK-lu7zP6^ zAs8L!mUX08P!RT?^_;5(Kq*LS-cyV5l=#E3qvTq+y|A>DVD`Z^+B10OV_3)(?`ILXz%xbLrJ`+x{cwdea-(BIzvg-gHcQk90Z`j`2PA}3@ zI=N>Tx*jjw8X6SdP48-jy&8+v&YIS$*bWMumAODnZZ1~R(%`Nf`jbsbWSNqHLW=q( zSjW}`m|XwUHJ- zy0S7)7e7$EA``g^kDS+n`|M2n^qt7I8f1R%SXakRtkVKBzl;_U&LcLb-EMn}xk10$ zeUFxodL7sQ4%8R6##lyn$l$ZmlT3aJnx2$R>|6aDVGl7o7QZXDom)GsIMcY~|p&Cf%UbA|c5minAsB9z%M8MRr0!`ELn9rjRUT)4+ zrjq{^ZNF>3>~x+X5JWSKnLYc&N)H-`KVZu=uygM+)O*DWidwM$`nr;@s}tl%LKh<{ zj)8dO$bYP#h0SYza@eIuC)M-@5Ik@|ShNNfiaR+t$h^xq3jQlyH8M*L^?3ahldHW= z>NxqFREeicgWp98XAe;@?Ez5%chgW0CK<%~y502T!Uxf#Cv>6tGk+$y!8j<=H=0j) zK=}5pDFk+`N||B=B#zU>uzm`p1Y0Hi18vBc(vH}shykAmym9GQ(^;`e$|2b{gCeX@ zml7i(n&_DsyA|yD;fsnafsw6k$JgH&8V|_gV_rnu?fyJ$^#YZdIwB;2kzU=Ruu_xq z8|8AihuG-s;j6#W$xPRF!*x^;5ugzFC=*_v*W8R+H^1=O((G@F7a>6BuDg2hASH8% zA>aUqB0F4DdX%O~l~nV3@-^CfyjeyyVv#w-a5Iyn{N9qqE~kvB~* zf;6j0d*9lzMu`;nx&5t?ZPj;F^h(sG6Zt&5;BEAVf-b&hQ}*z%Qhn7q$SK|$Ci4_v zXt?L}ew~wlcnl_tB-|E&2Tc`r_GT#r=(!8uCD@{Vpl6 zj3N0tB%Mps;(fW?@ILt)m;B-BA)p^m=HymU+y3hCyf$YHeaIYVpdxegdk~$3ZtcCo z9N8sqj}-g*Bp{N!r8?RH6O<>nuHYMc4f z@bdSdCz|PjZZ8r}H;y)Yn?t!qwnj^a6_ZmH3bKGaMP z_g(g=<2{(Iv|klKe*7mwFG54iIlgcJIL4^tvgbL0tZk}d^-&|o$HxoQ zeZVX{%GdPC$9lL~xa@CoYxAg5Wz0tskN1)w_E?ciy!M;CfLE}5)%MBXw|nZBnk?sa zcB8nx!y9i-lrr*s@hBRCwLNH}lra=t+^j(ebn~lYHemhFpd#=)PCpt!5EB(*=7tLv z`SWhVY3;JXQZ+8M8*5ozn0UIhaIy(^adLa__o-ebSDO?aRi5Op`&XWxPN_JnAy*=X zVw3Sfkv1;4Ue}+~5A7jgVuQ%aRAMnPt<1NVdf-CR6-CJk{VGb3q3J_78CALEd4<;> z&BBA~aqeCQgefB@DsB>u-#*oAcNx@+T2)GP*+`8|$`5@D*5=txHWbX#Es{Qvb&v48 z)4RL8sW+>iW6(eW+dAMa+xiO_9;sewLLvsg3GigaKq;x$uJKs`juS?cYrOqB;}Cmv z817L0$kTmEIfL>Y4ubMqfn^eJUnZb>Pe<80M4WBRUh4?r7uhF?qR4Q^F_)G&V4s&( z?~E9s$F+4Nx89Qu6IYEXjv=Z+lOjg| zIE9^!FT^GlTU5+CWgF`eqmsHZr+9|i?^~=c!Y?MYwnwW3IZeNKOu%`V(7S3h;Sej@c1yo z`|Gj$A5xFky|sBq(wpXFq$7@@hkr!K;$aN9UmIK85X$sS4S`JU-|Br@<`%Y-#bFz9 zhWtn#x_C;Ed2XId{mo`{U?59-HXiRY~Dy@~80fa2ocRcGEPz#?W;@gB{cW(UA~Z z-A&R8E8hKa^ZG$~`MTe*>*M@Oie4zsiq&!t4c+> ze@I_6tz*Yo%gR$W0T@$WH=htElE3_6QZbVvI9e?rI5Ij))|Zw^2NG4Igw;=Wud)u= zZF!4mXsA*^Vlt`vS?x;UFn*V@K7t*+n-wCAKP)t4{3G56&XK#hnR6@Cg|arSy`+gK z_qq2qx8*J=v4y1%Fa*@ZWraqEHnH`R8Irsr1e%}@@XxF{*0|RYG-VfXjJ`J^t{$(! z`T8)(6ioCW`soLtw#?xp21&mEbF(6xl_=%4?AIhmnf4Wpt$hM!U=o{JOVlI#9qSF~ zjtJ}|b`m%k=~N({QCaC`u67FRpje8Q{KzkFUHA&DZM`HKa8&q-8tfTfpMgyeDY$5G z3}G~b^?7kwJdBe0{HwtfnXWTiYg>g3A+luA#R~;tM~zl^pfMl40{Nq|$ZKw?!=*iP zwZqo?)sgp7-8}Sh6E+nJ%qjIoMTc@ijpk*Avy1bOgKhz0=}Y;eO{ccotN1Z*HS*+8 z!hO#gi>Kf^V;~zroRxllQb)+dT4zyMSZD>r^if$HvD64rE|?}-tVAW7BU7|IGac$y z@{I;3;Z315BWa5uNss4p)e8hNjW#ojCeF2+Co6WHgD$5c$+xwr*C3m7DS$r7^Z^Ye z3{qjt0PUB5=USiFaUsq&g!(3_<`TX(zdK+jK@h$yktiW~;Gawe zu^VWzs+4r3orPtY6`>YWrFHn~n=|-_0BC-($u!KnZ|9W2DP^SfymR?ZM2PlQ1h&%b zTWxV%6n@+_+NtFFlCNp*;Nb7y##(uE^CClnRD*53N)k27&fUfRR*8W%4$aBZ6|e0O zSYB=2H_1Qsa%cdUV^t~bX`Ol=L$yxEX2ick%a18`28<$a;rYF680kc0vHpIbc^*_x zAtb~uj2y(D7r*|j%l+n#l+$-Ch}R(*Fh#_CRAeS`pdS-v32L$<(e3gHqYxS%<912k z{Af@e?tcc0oWGY^xgVKZY4zJR@v~{W8zr1ubC##~pZXf){k6TZ_GA*!ntu0R)v^k9 z4U7=dIYIAxtXz}@g~#B4#?cIOE5ZAl(!+s42m2mN@*%eS!{yXMy~6F+#*vKNnzHVP zXE*AFy8L4q9Q5P_%hJr-E*!o-7w03`?ij3bnZel`JD z7q-OOk>*vr;s8Ycvdc# zO95sb)@EGcIM)lVr zZ7Yw;#WYGXrE3{pIN$s_%ILESI~lohobp+c7^9nIr&X>=FCF;0!bF-Z0X@r8)n2$g zE|=C3fm)V)`~Ktf=a^!Ph!m2tDkqU_yB?TInd zDM+c?&Y^Egb#J;!`YpOuB>*;|tBKH{H_oxVU{j8NmWsB4)g4n;{9QI}O00+|MNK zV>w3Fg601*Js*5tngOk`5YE|4IzBQi%SkR|WMLW|mS7~?^!0FYkzuMARZhy=+M(vY z?oR7>$ghAmOEC84esf&DzxmL1LO2!~L9qpN5fL>Un)$>-x+OHK>lJgJZTFphA0pRk zHa9ncUeHYAuLxQkILvfN7^4IxP{N)wp_Mb@0 zyB;1KE-6aSyRx`9oJ;*AGl=FB>55Ow%rlWM#!|hP!H1Gx zG(_Gd&Q-r`;aW?h8Q{pU&BVb418pp~Bnk-LTZlQS>+}Ox_U%_9e-zKA4dHM1(E)wL zpt{LWH@lY`bhx;=^rf9$_FRIli#%~e&YW~7hzS_@AUGC|;_wR>^c`dZjbkbc<=<bJu6V++? zic3$&twNnb1gykB8dYcf7-Eemnm%5LnBWcgjYCDuX7ADuln*Q8R81x3OPS3ymBGkN zGjhXh)Zvel^R+GufG&Y}qsbU%S)9~mNL7mSAQz+-#p^K2A({xJHa|WV1$7l?)ineX z_cwM)5!ez(PvAvq60L&Nc%RmM)cf}RVaIt79QqPL$%fEZ15bdXC`u4kmBvnv`6v8t z++&o3MUe-2?Ux5qV?_#nd$WZc%-k-4_jjRs>t+!)}3cIAJS%jD{I8{{R;UJ_- znikh3&ZCA!U%N(`{*%x+Z;MHeYi$wBzv9rHr6Z%aIT7cz!AsS%+ut~JGkA2Kuu&mQ zi#U_1HPYDZn;3X_0gxrSrl~z_#d-hwHBNtREF~d08$PpJtK9q};EoN*GA5q) z#K=|iD^}}7Vqog>vRQr1GWdsn-r1`a{!DPdZawUApG$$ndp{@)snaTI$U_5JkENR1 z1X7t`+0d>9VL&kFgq^nF*YfZS< zO-J(2c%-y$?DTrvSy=}7 zLI5bQ#Dal&pO_Q$bv-!7a>yB|iP!5d`Ai8k_`H+XyS1Hp)2!Y-F}zl@-G13WRNZRG zOG}rXgsI$LIDzD6QhuGP}7 z!Dscfy#0PcOE2;uy}N(t@YnU0c#fCHUmI=Sbxo>}INK6^^m8YN>>sz2L+d;=(7T}f z^LCqpi!khjGXjXKb83poiH89#i1w=_ueR&mz4z}Kx;s2!p{U2Vyve zs1rhs*PlPdcpxM^>VC*Xl;;2pjR~>Z)*-s}-)6FEi;U|H{iW`8e2Do*oI7*L%@HV3 z{ycR2gDWR3YZUjJ$GJ2R(*vB)uhjF|s$o2RQ)bW1Q7${X#t-`pKM-|AWlcIy+LhML zMuD{rk&oAHTeoLZWJHf2V>_;eYgFeS zSR*sBd^j=iF1714Nl+B;Q!~04$OY)ZW^%W}gSTQienDm}$|5$BRxqBLtk36UxM~YS z`Ns4j$r%zlREpr;B+TYe3N11I*oj`DN!U@Gm&DfNqR>+nX)-VL;mh_`Hk!7uNIwyJ z=Omu>h!TXTK8E5G{2{TEx+Kw;rw(KwICS3YHU152$0bez6&uQ-e3p?sCAxT)i3{*T z^mXeNIb|M61L=J*o29Gy`hw<(6Gu>1ub(uGT;1ePyBU9=|$5110jGqqL2wf3OE;Ss6i zp8VnizI=^DjrOe;&y20yDF^P;rpRAS*Sj@_?#I}cu%htnONYHIL(I!9T&66ZbvAu? zXTf7wkx4IpA{?;^Y*-5hPi}Wd_J_!sDjvloVMojBQSh3tE6nbUr^fj+K~+m$L4+jl zSEbuR-NM7FGc*H&POKTZ)(x71=09dK1*lgLXAR}(-U&zE3|-}!u}??dEwmKs3Tqm& z8T}@NZ}~8~qEHkkTKvni5$!9w>!O@>Muih_cH}n>_Sk;;7ckM$DG9N~4NVQ{i|8)r z@m?UwX#fk>Urnx+ULolgNqQ68VgupwdFiuLN*nfQ8O9rYeKh428Qfwl_(Tb1E6QU$ zwD|?+i_tSi#H^I$v+F;uEZ7oM13gk$@%oY_{LuVG^{>kTy$D(QBo79ZVDbz2 zTM2w5kl^7*b2RW(%tA<_RLoq^l^sdS>IVKd=lfo-u+4oeVSmr&tQy@tVi85sN16HK z*<9HU2wo^ye9Y$of^Lwywj^Iqu1j>&nxQ6UfZ>(tF$hTa-QO3D| zWy3zb19x;wL?^T6emUed&Rz`$V)s?xMXUsyL=w`ntTyti6ytff&6tnEVAD$(^yUW< zU9h7e4LU@LIErxR$&i@nTQPMv%|9DF3T)^3WBwvGZl#1VI0#84cdCD{QNEMT_8r&y z2+;%zP;P2BbEXq=hs@US4*Xhq@Ufqc^d9{}RMk^3y+_AjPppDSt=L)It|W%1M~JdClS zkgXp=G`pOv#1Kb0Yesz|?xe(<$Kg{>Bb|IQEN&HicePE}I{NqT@Op|u;Izv=@cQe1 zf5KlqIwqWhdmnihdB>}}F}l^d$I_bJ+buxkkj;iJ)lO4}m1|;UaBXjFOGVV&cDWvd`U9AVrfoE3##$WEk7?(jm7j-@(V&PPm;E%a6@mG*7>=G zg{lfGMug78m{2r9t*qeC*5pI{+FHK?xj5*A4EJ{RW8It%^)Ps_4in1v@5@5F=bPkFI86l$x=atCBx%FYLED8KWg1b>%kWe zD5(!}p2E6Z-<_(W`jtw)eG^Lw`L%tekf}eKB}O||`0nHH4|nSTO`}~wd#btIm*RSp z2dwb;+P^~dhtExCTJuiIGpqI!>x*~mC*m11W1i1Qa3e)D5Dh((96C7ejZ^QsqCj+H zlV)h&t&PbUhQ0eg7goSGC(vQ{2u{(qs1%8%(Cv+ zIK_ClDS9JgD@_4%O#U(#ADdJ_r2-H;tnS|BJHxP+mX0pVNR7&eG1j5qLhWsi_Q|WL zII0!=4%8Lze=lg2Wk3~{mR_2gJ&U}9)-K40ZPgv#U;~kJZU(q<(+uV<_nUo+5hrI- zLRLTit-LyH8T=f1K6YOg*s{(iSSUCTK|7QrGJ=}8m*f!$&vqqVUtNlqr4xdX#qW1P zxL)npyF}q<_s2uR5vLRCW(>IC^CJXhUyOuKDx0s8&@I&k-eyF(q#daMx+pLAuJq@UT7>p!YtKgko= zYkPcGyPbc>Bhu4q3q+Kle?BKpo1wF8NgPUyjkEb@-brZDJ+iLnC&F#q(%-PspYIFz zwL16&vZW+?^bBP&w03wsj%K=QVG4QmN=+;ff#26o>l#ps@i80371iJYG38X|8{odx z2iaEAOKDJmJ|?l_fkjGt=viawE6`6hcyOW-0ALcs{?TobStp?HH|@#=^RwW8&g&D4 zi|;(kavbSUzz`x4)oz5CM`^v8d2tlRq|Z@;Kn;~P3#kB?SPPaoCrKK|XnC=#!aAK3 zx^UV0jf!aD*UJ4eDcvH7E@?8$;MHEmn_m}_je&GefHF|_idAIYigWAPtk-$qMHW2s zUGHXwW_5`B<~-pCi=V;X`~oksGGiisy6$tezh@37@z?i$#+3Jm9_ z^H-tR3Q33^7An+^Z~fTsw4EJgvO=tUG(4YSQsAdDB zgSz~z!Hu4t>7EUHik{g;xP>Fa4M`UiPy4Z+OM^!hlgmjF{7iW_qzGTmRFK~zUEVJ9 zy3IL&8pGotvA80kT#(JJzEwH#yMSa5Jvw{v@2lI}GS55M%I(?2%u}^ffVLvl?djwa z;1Ri}+*l*tBC^*jp0(>w^CDf~NcC&oS7|BntLf&9MDeNiyMK$PD!|$Si_ywaz@Vc9*0yovZN*ro(PP#TDyRmsX3n#ogo0O`_oT_l#na45vCe*pSo2S6aq|%7{oNU*ICv?zovgA>FuazDaq*FrAYS3|i`jF7k9l66FQgU)qGBOK*1K>w- z0sVdg^|*-+hzW?Ssp>;ea!LE_IsgIJ6-}a)Pjc-3=j%4V+cp{p=na;tZ#ji(cFJ4f z6tw)?IE+|#Q@rdX|L=oa7Rz52XF)=2wlThg1uYc?mX)jv^6n@`Lu8GR4V1>mJ&oeR zV;AESfDA%taZHvEC12~$b^K=`%o)%a{vVhEZ|sE54k7xL^c5l#WcioYPMkMKOq(Srhda!S0_J zkCyuG;Np{;f{2)F&jb(j6KZFbMg_U@9@Ah!c>+2U(vBA?ikLU57$u@r+m4;ruJq$uEM8i-w`8m<~| zd@vyh1|rH*Eh=@%Cc}H!r(nZX)A%a$Wyx)w3}Gf_a40DdNHd;j`#OU>-%l z9)mFD=9#{OGOVhwq;%+Ite9<5J$)L$4Tq}_m1LTVZ2HC-q>+W0@k7DLB78yVAf|N# zi;vFTtl(SVsMvxT`(_q1hu?U1u=6AhqTc0QNoWcwV0TadMk^bC(Pdi?vBWcwVLE>w z-?C(jBa@)e~M&%=0>Gq~~&TdXS{b}U`&EjRcKtnV1Y?K+L!vFKn zfL~d53pSQDvHMbr<=6GZ*e|_@3jG`Q=mL`K_@r6Ps4{Y)HSFS9iM;UfkN&vdX8fZN zHhuK0S>dP(+TYV-X9Zif^6DnYG8>LvD;&dJ5yx=2P+i)jb7GaraY_XcqK37^`xr|x zcR%6LH_PmLKsa|>T%Q4ns63!#G6yDJ@B zeVP!XFQwhd2I+saADL#8qWK8+Lu=bOZ&Qg=^o6EgE3@{%4cLq2mLm-MMaZ1EK7EwF z`*VHGF!mvAFJ>=e^WTiqhwGV}51yWi7VUnuD>AQE^R^o<7+RH|{S6X+Dc>0C?qK7& zb=MtF&Z2OAdws@{gN?Y?yRT5BvJg=NDBnCNgb(4jz&ksbTG>-IB4pt7xg8px)EXzZ z_6;II2Cdqo_w3FD9C5JJ{IP%U?9(=p-6<`BGPH6ALyvi&$Y<)72FKu2-xbf%Sf)Ca zr^gw`0fOa5(Z79XOlJ2 z9c0{c^xy$p}r(=Qe^kdLpK!5hlkm{aAf7&DD?|GkXNcOr)wN z-9U{Oq;%q~_t@7n@C%&pCHButJ(1PkMf%Rwi^#ns$Jzx~ZW^M<;V;*?0(L%?0~Da* z0+|xnfGrI@uEHDX@1-qt#L`uAMCcYh8I=xao@>t61Z@D65^JmO6U5`D{!f(^gI<3U z(yO`mL=>$4PjpWs8$lsqEQ4n5QwadYXi$#tKg6r7nO%p%W)3g3HYfeYp4Ha3<~Z;w zPpc)j7qH=!_L$gJNR+y3Z=K?IeF1@On=(E`LO&D-=DD z{Yyj)>jnaMQY5)Rn3MuXH2D>JxlLy7Z1~opEcNTo^zfhz zU0Apk?^UxJwb{K|rZ}K@Ymgh1ZJeFLWO_L;7LixhTE4Th(7RcFg{q=Ezq2SG}clk%-u8a z+k&&lp%jFQ*fDoABO@a-l|%EJzqCQcQ+kilkbFnA_b)!QXKwbkuq+3!#}VIO<$SOY zA&ccfqcWl3uN`@R{LR1hcRF+Z@I2`lAYRP%4f&=q#Xbh6;3Q_{Kxn;nMyCM^Qp4}5 z@NAe5+V}x6!DkkgZqM2&w~zvhw%~&kb1D2@c81tC(754LZFEgU`&jcfev!4mjZZIx z2xMtANC-#{u41q;FNz`^{VuFUAS4;?n}60s=zg{OmBI6*+ayjZQszF$w^kxN8scXb zH~58H8|rJtMMXPhEZe-#*RI6n!p^J!W$?%T*I(hyi~Ih-!Xfg!*6RQL$kQD|E%oF& zxk9ztPC7qJ1zIc!bl|fpj+vK!1zlDmU-d!N*3Sl83fz9Rc)xp=p^0_Ilm9LK1H|p!;ayo#-1;e@`a=4A){%CgN6xppyEcPg*TVs|G2OS0PYu zXOKkUEr6+Mj0gEVQ(;sPeBlE#;5AkJJT^9V-|ZE-S36eqDC9NrKUvYoQIivqq;E4R zaji2Y2VD*Or$=9i>Btr+lBBQDln*$w9>1yaSVvf%V@>+%~i2FNygSh7xFGNv_J}gy4EkTD<#KR58p>MxYK%`TPdA`H%rR^;`ZF=OMP4~ zsv`yF!x(E&Zsb#}f@z+B@h$B5^Ex2?0JzgM{Sbs2+G7x_5&MtFp=uFdKx9-w2zPAA z&!yAVqxJ_+ymE;)8}arqT51=*z?1L=H90uAbfbu+bhpfDxrja>TWF=D3_0j(Hha3b zvVuMP$?}Jt{DGIPYn52d{DFjCr9i;F;Px$c2^@vJM! zNBWRc{4E^@sh!`bl2P}tl{U*{l@+n!+v(L2A!%38(xk6Mo8@fMX5CV<(Bwh?5FEY@}j{@IYctRl(igYb*!9g`&Lypi>$(EnDV@Tv)lUK*Pxnqv{1CO4jr&)xSz^P`p1eW~FHgg; zj!r!FADzkGFH2cA8F|%vt^B;*pR4+D)_E4_S8ewGa@FeIIpX^UaXJ_Fe$VRuMy*1J z$i%JrAFspUW>wm&;|Xpl&n0PJ`=jQv4-s2=PE}UzHfRGgIOb&(SAyN#iggmZb-TpQ zlgA{jgMxZHnUlfXmp zgk7(mPx?u;VV&9lBVu%_WcUQ&5f3{$l{GXpe6zPk*j**korxy8SW!sOpbCMlgipW}gc!z;AHNJ@DIkzJa`wsX?X7=3v z!Tj?p zvXqj^?Qq_TKIy4?&yI_OF2%4UVq`(v0dR|gf0hywar_RH(1q0)cMh?R|sK0p7&RrV2XlCai(nRvfC ze_XS?{J`OKb_;nHwnunFm?9~uc(vi0PkJJc%)C;T{{FM6jojXhcQ7wT!*Hw9`9=kn zC-Bg8<8gcq4~+Uc|jn7l|QCT2@cq=S3X(+S|88ci*np_n8-m-DB4t{sCr+Ju{neL0{P5$;SDrH#E?j;Ak)(s67X{sJzf!Hqe1McjVSHqE z=AhA1QZ6n`FV0T2yGfR%d!ZZDyDPr6Hi%2c>d&uTZ?sySPUpY>@BRrADDte=>vNyiYBk~cgbL0*#(nOE z+z*8xc|pkw0>*vn`P>V+=R2%-miA3{oA{!~kK>*h^Hxh!%i<>*dt ztkKFDe2FD)DGz)P30SSPE{s-1o*8Y7wUja`l`&?1VSfMMAj`5h-~8(A%*-dBeC&DL zv7;z5NBSd3D0g--hrthTD?cIsN&Uboq3b$i{eRw_@D*|~*g zeLv5Ki0-IIxbT(IU^OzD7iR6m!ra_cr<(%U;h>*osa6?fbhJ}4j)>Jtb$MZadb0dz zV~--CV9~i)+-aM9xuJ*vfEAvPloEnU=Hqeg7b%@l=iC?>Y(Npf$L5#uS(|*p`5KEq zBNcv}b;2(kI>b@SUFZNup;n3n-705|1)xAI5@L)ZfDXDnZtpgZ6FJ7wFc)cXr(;6g zc~`j<66b7V<59QUKYsiq5@>aLj0pnveEl$S>L+7Q9pBhX_%?G$?BWWo^AH} zz2V^bizj~a-reiBAEbGfX2sLzSI(|1{ODI#SB}hHK6mWrZ-3rux6&llT56?akq?Ib zC@%GTy~(M$BpJ+1&w9dZcl&?(?XSK2;jKs82hU$Qv%Pn?d(ae|0T54ctu+_kpx^QR zNcfQfQmRz4beImhN^4bQV6D~00(f4)glEADKMcZ>wMI!*$jtY`qeqvmwP{{RSy-jH z9}q;DXJHsrs}mdB`!kbe-}CnN>c^IsjvZY>Boh;r`GvWKnJK|VquqMth3BfZ>i&Mc zTAd7nVDr&KMnxQji}Q1x-cYJ+nB?8081x3UaelLdsmX4nfpfgVDxVA^arGl4Q8BIJ>rXvNs$C zeq5_o|LBjuy|#9u(P+d`_{7=s?QUmt^WppNzW33`p9}}XLBHo*T&~wih=3py$D42dJ{AR<*tT2NXk#+XtHC|aWc6tPZ| zBm{s9E`msAITxNbN^k*$8DkL1;>u}j3HQ9oskwf?J-2wYT&d-Q4j5G^xpw-AuvFdH z+%PH|^m<@GNoj#(!$CS299cfTymrwG<6|ezaW8Bf?jvDJ$x5Z-9Jtlm1f^6e<@^ z03puxC^*wv<+&OOdd6_hIip$|V~ho2v@u5KMNS!?sg-xO*6-fELm4B;1Y?2EvZO!k zwbFiL*l7qaBu388%^yE`))JQGxh!ND2FH#pl;VhUPg|-i`Ra@3fB3VHm9@Y3#?!y~ z;MRpR%YX33r5o$p>pPvxr;q%bAHIG6(LpKnnw`N*SI*4MRQ{L$=SR<-Up;qv^9y7Sk9OLv2BBEwIan~pQqCEp0E7$S`B9n<^R%y}L`1E0 zDUK;6S(*>~9nJ*h6bvv%y}&cZP)d_zaPs)->dJE9i!hA1;9EP}+uOU>Zmr+nI^5gc zj!U&X8?>9dXHK1}R?1sDyPRXAalkk$)n@vGez)5t$d(r8Jdd^79nQ$H<>li?r-zw5 zb7HwSNPhnIN5+C5)xPn@i@){yb6WIGGml7ak#&Ku(!Fqe0=%X%A<$t&BlS}hcZu$ zR@O*Q@H`t12fe|tN2%@9HwmT2SiyY&lP7(nG=K&plSCf22JPm7R(f)Jjxizpm=L10 z6kcR>4#b{6b1Lxs(C5pGvlI#aJ2)_BP$XnjK}P@pml7@xuP)W)5dq z{}P^H4DfX+PJ&>KHAWMpjveMAs}!kIax54imH-`jCqO#^2ayv*g646NG^L)g(v36_ zIRP+QQI}}702Zh#c*1d{bktpK00>Y@kvd40GWKA<{>qzg{MUc>=bwJ?9suN7zO%Ex zy|vkBG~Ryao$amdqL9cKr_{+l&LBvsAYir1ky1u|*K%ja9!;gCH42e3&$rfc?r|w7m{PXCyLIEU4~ByQr7TT{#*FsZD=)k;y}07V)wopE zTDO~Zqh%1qQ!}$!n#HA3wKBoD0BeQt7-L0|GbY?Uso(EEd~mnZYVPlC_j>IhDpzXL zrE0BGn{ac*Lgh$^5Il+k!5AUv`@Yhe5aNe{YgCwDzF*3#w5yk}r1VCw{wE_!9 zE3GBtf+2nXouA&hdn-$a%SYy{fnK*g==XOw?)JOQeAuO~7M&16>CBOnC_>6m2(h#{ zS1p%}H5bmV-MYW|?3L52M;89o5B@eSia+`08$WsL)7janbEj5X-Tw6l2TOC4KYi!g z)?S+<3^V!i(`P2i!N2*zZ=SlewtQsn$G`m8^Ejn+cXx+zuh(rI>}+}5H((g$p6BIx z9>*olxqIgwUtYX>f9J^j)W!2_zxnWHQAl*L%e+8>#;R_oTPl@)>y^vZO8m3me2`~3 zrC2W4q*B%zFj^}GNUbsHpv!&VDxGJEHad>OO0}$&DU_lFk#a-?Vm-kf0-iAWA-r@WJ|n2YwipOJyN^LTQmF*`Ry%)2n;+CS|P1v)5mJadTs<$n#^XXXfT- ztEKp$-t2Zet1C;4iS3=eY9+2zD^HzUyZ2z{t@o}zbN={eHy=KE?$r1G_;+79HS85w>E610RMqA`jxp9c}8lvvPO10euN04SodN~;0@DCGpKwZ;u81ZNfuWt>t$ z2q9pY@Rcl(Qmv$eE>L6uXiNbB6cHIGlo6m|Tot|_m8+fzC#Pn<{d-@3`PnCddJpd1 zQA$!F+)N*U6jI~3>%{lt>BXfdEM<0)w{~)+e$a0Ax-UI*<-M!7zw*+Rm8Hdh`EUO-W#YU4 z;Prp^qj%SiFFkkV)We-dvon~Vtlqr8yL-^&oHl!dE9Z|-m7{<8{hxg0h4V*e%HRLd zTT>G?t+n7@rCenf-&0j0zx40143Y!=C3|`UK#S<)mvvzES2K; z!)tdb0wM-Mkfy_;$dxvOZqow0aewcFt2fgmJ3QD)2Hiowo2LV7tt>JEsAQ&%0%H*Y zk*32gfUQ<41R*P=&NB;ORH2GI2m&Y22fir9@yhbCK_(yW>@OZ!OeM_BEqOsHtkw<> zyLheB{Ir7_AFWvu2* zP%gk^6bk^#8PD^)UO(L0+EzvJ;tS6p5YOX#2L}`hXTCAofJLx`SRm9$sq$3H#93;b zW!@MUc*It--R<`N?9acqySulwxml`CBjZ6B_(2HPY6Ap0B16iU7f>!3_Zas$4;dHS z3%nq*7SEkOAC=0j?l6qv`T6-_l4-4xGR6cKA>+O${2(rAV~?$#{@t&=?4i1KXMJ*N zx+n?)B+v7~ps(^Y8FZ8^9Ek9-OcKRDrCcjXtN}oVj4%X3HDDGALWh4QGR!Ff4p`x&YAFyF$9Q` z`IkxVUq%6sA2F12M@)3bXD7#_v&aAeB$k*F3V7sqa_J{yVccLe3Z*$@4U7+NXszqv zGiJQ+kP%Rr5XxNyRvQJ@x#Q7c?=7*05F}`{c4!13)LIQ-h^4Mu#Ev?cNKxdC!@4`x z3(j04sH4PbYbY{zIwWATq6`A4H6CPAMR~*aC|vgck&Xdo{GNf^&jYN@cZmrv!=w3}~$lSgDk|auq74lo~_U?_B@v z<9CwbFbLx?ESIYlKPo4gw9GHX;q>%OKI}*3()85C+|1muljo|FGhx65BZIU!?DV4noP6yfu`nH$%0AsXqT|x!`1K*EBzbI6ZWq_!qG)6{IOssaJX|VdGm%qAGKfHVU zhRn04t~|ZCc;ti6Zuwz!Z29O5&t5rwV&$-YaM)}eHo78+Y7x5MR7<>enCLLV_ob%{%ba z2r5cITJaCR@%rucyF0r(1WZw+Mk%e7EHVVeI8{m-=a@jEvLxyEwzeL9{LzPT?5~|z zdH$Jawl_Bh!wi{g^hAOTk*Xp$T3XQK?oXnPvDV$Ofik+exmmB*|Hps+&+gs5xAEw~ z?A&4yRR|&whLj;vN-0tXU>Ri&aON1Vlp$xH;H=m0W=WD~NvqxZ>YJ}`@9fpN?xT3n&1wi1?*d+j@S4lp8Ib%j)mLe#w{nvdI_p$Wi&8 z9r4gdM8uKk?ppD1L;-VQeYD0HYY+jESYn8^)@kK9lJ%(&MoVXbdVEzt!p2LD1sply z2>?=}l{D6jkc0pPtkMdRx?P4KBbHcVMk@TMD~b^6b`f+>c{GDXgb^s-^-M7&L`mr` z96*RMdJM@yhdKa2V-)2c6T<2*IPaYE$Eeyd*vSj!%0v*yoQrhWw?Mog2*U^gxZubb=gbcR*K?w@GS-qYrXfv} zd)Gfo(&S)&OG_n$S1wmel}SH{v{IaL0z_Nw2cho;fgdtT8DmmOYe8$nI0jLyjin4r zahVVxloV3C?l%HJC~B#+F#w>nR!VBEWKn2qkg}c4hqtbOy1&2e`#wdcRZ-u$AH|g@ zuE?Sw2oLVwxP9YVrleAGc5x-F&PZ*OG~L_V>n9my++$v?Ho1S;{LUY~u`oCDzy9BU z#X0}u-+T4@fBoy1E}wq#%*wU98?QWd{L&LE>yP$-^}+Qt%MKfzm!CZ|Q4at0fB5Bd zmrkBJapVU-{!kUElto;s^as5(N$ZDuQ#13ucKyajZ$0_c%TZhrf^)_ZsnQCJO|xuu zc_GV+&7H<8&z%nf|K7uWBvvV1sA4!AB00%;d+l~7O_SH2ztZX@!%St_aAk2W z&C=5+j{o#m?__zNXDI<(TU~9n+Z)?^FJ3u2Op9N=clDL0&-uQPQaKV9qx^$U?_4~) zniukyzkYk7I>CM47-Nj)+=cLfGNxpvm62JZiku)2FqHDWz1_{NEzcA4^NUYkxzz1- zlO$2v5&|;o>mnu01530noXyYWJ>22a7~=>2qemMzZruFlAO8Mun6%q1t&2R%@+`GR zj|YQGUg=5|SbeL!vXv zaH2Ljv$$HVl**C!=;5O<4DZ~!&N&aGQkJH}UfX@r$H!yp4#Y|+!8sxZK@5cCS*nc! zr!-ibS%w%?DphS&k`-x^mdjN_dArj=P?iWOVQaTB9Avdx6)A1Bd!3NO$(#^$4FHc1^<(fC{M}~0QFVrke?J~2yYVy<=92mj`|cuUBUk!J z2trCJd0crl64SvL1IAJ+j5dfsz;*92C$<@@2vRMTLt?t=iZK=}K_td%9NqBA$Xh*r zZjbj5Yb_zvZ5*z}dxW7UBh42PtwqOBQ!=BB2T{!rOWco&Z0H=N+GvUlC>^t*E#=Xmb=KmOIHuRnj`==5CQ^ zd6xH+zBSIpVyr4|e*Bv-jF#8V5yGrBjB%&7OJ$BN&Ao8t+~5BClXC2TaW1;;!+y5~#(F_K9QIV6W$BP0G0IruB5MT!luA-$NU$g}CqPfss%e_I z4ZsPPq3>H`gy0tJn{T|%D7pIa)rsku{r!Dyp;Rva!B<~x4&>GKoqlQZ^YYo7N!Ysc zacar^8`o#6(QB{0{LZ@{8VmCaa~qpmd%N3DUB1kOSFKfg-NC(w+fm@>Qn#Be-w%?a zn4YZ7%}%`i@y(-)^Ocf+?biCkjqMk%JQ?_2n&oj6T7ZW;_2tE>n|JQrx_dteJtt6b zK_~)2RI&hKi!1|6jLN_gV>JPyjpdwarEcB6-D))(jl;DQ$IqQRo2E&#e$elAgdZ5A zTxS*lT5FBAqv#7kL~5)F1Ak{{cVlDg;>8P5R63|PjFAM1k_8u@+Xo0CO6J`613%=9 zF~+hq1&dncvoo{RTBX-%8*7ZUy=Jyz|(b)O=kF1AW3b+eDrKSr=_8789&J%|2vVuj$L zD^0c5B6X|+G{#u46gfe();(u1#xTZ}DvZ%is}fe2SRox##&5sgzPG{u0 zoqM-FD_1AEA26iN{mu5_t}LWXhP9c6s8maaU29324!IxCA3b3Vp^W8eBBd6d-|qH; zD8BsU#m()l?|k!X$BxeYi~s%KH=6yIp1zPuJ4mu;FP(n>)7!_6%=G%nok#Uwy!%;} z6~@>&iq9OM|Nf7Dt&Mv2;@W4ow~}Ny91gTLPM}NE!EiWWl-;}eNtzEYzwos%u1Z-@ zO0_o5@01tC!fb7Ew(`sOuTR%1m(Hx_+N>^3-+i!`WT}$M^FyhMgZ-^uyWxtkWRWVF z8?Cj>DHlp+NC=_a7|9r?NR^R-c}1Qfl2WOxmCDi~AyjyQ(K$zwrKz!cZf?F5$M1gd zQ5Zy>PBSZtm1D=!Zu{-eH`oh*h?l>f&7IPIDV&^&)~-}9z1$mSTN|4q?R@PU-}vOy zYf`J(>FMJuN0*N+Rjbu|>ziAjW>SuS>ANrmri=2SgDg~p9JjsT=A{|(3 zt-NRr6V&l)A#S+vu5nIGp-_H%qtvyj*Zs3 zREo7$ySuwbjx5d1&aU6R#oX1I31`@LJvMP|D)jwmVlEl>8Ko0b)3u2SYaz|@xrO=N z{YL1Aaa`h_KV6%gnVp}SnXXi8g*JI!Fv^3t0+hvZ?EC(~?nX9fPs|=6h*>g3GU8&w z7g%**oP!0VNI3<9lwzSY=K%p@j3mg9EicD$34k%irzT6DM>(aFleKECQjWw_b+THj zPE6K@Nik6glO)jwlA@sF;)wAq)3u2bhj6isd*#}!Eb=k7O?|nE$&Nq*kDFIV6qj)v z_X|f2B6FkxN1(Mv8DrgP7bzR9+2|<7+FC0-PAK7wj~K%Q#@88l-Zxx$qqZZY2v%z~ zCgh+su4vFWwy^WUyG_d|i9ocL0A@t5AMyGh=cz1MFs?AqYM0@1)gOcqS!7{cn^`&@ zmM1#R-TjR_{q_Nlil2xDi-ZCgM{)zCjC*dn;Fe;>Ts0yk#6^%s?bwc?W9{g{u|L!Z zKeQIJLC;uC2xujvQcX!oDFH;rxt3aM8<%TZ<;GercpyA$Ok65UmFIZ^G_D^u+U>(~ zd7@M*`(8XbJ$Jaj-S4%_m0Db`1%AZ1h@uh!QYux9Hk48z0FJqDwcBy4m8#b2&aLYQ zyN`lW+4ln9^SI}gD--trXX-s;EzPboy}j2CUpo2RSaomZuCA(1?8wl~&>}^(IFv|{ z#*7SmMnegbU>jo_5Nz1<$FKpzfNa=+0Sg%T&%k31WF3b$_E z98Uhy4r}?xKDWi+g(~3Oy65}$Uh93IhiEz(d2|AR14t=5-EI^m-A*?ga6WWVHJeQ- z)ohk?&YR7q_gGc6^^Oq&50M0vQgEWGtY-Ptdta4RRaVy8vMlr2bbt5Z(ZNom*^V2n zU0vdO98uaP(d&X|2;bo(v9bUDj3J>MS%`Jw$7aX*OHN z)I{W*Z)9<|-Ff@{yJt?XoL=tztH1oaN6s$)^o<+i$!s>8Fh;Z4>}ct{?c+d3Zizw*x-=N}b7RaI*hp+h?zxapvA>B+@sUw-=s-;w#@`uTHbPp!Q4 z;)|OPHbzs!m^?ZjPA6k;jc1~)YGY~+oO2;{^z7r84-SX7??3$2Pd>A|ceH;zc<1dm zzWLoB?C#zTR?_a-O%qBPQ?OwleYcM=cvy}M?T~+2&Yin<6a*h!aIz%5h6O0pt zOplPMb3%yy{e9<{_ap?&FXf!`fHh=HN)^YE(%RJ3 z{^9Y;>gpfFAZ~4K>si0sYBrLC-K~5&I@sBam56jy7PHR63J6(Dhe{~`;l1aa z0WcBzn0zjWk|3m1LPQ>!cUFLC^_D*M@sF(Zo0ajE!RfSQ3?nT$daXsT)9ZEmXVzBx z?X1y=m5}X5rj%S>?1a-I`_QI0KaR6GjYle_qQsceJ1e9Nzi_`alov!qg#4G#zCn|O zi2OvRdcyZ&bJnAuKPw4+0D^}zK6+0?JfN?n5Fm&cdKUohA;6A^0HCzwAUG2t9q7CT z#)S}!z&j(Qj-`==2I^5QAB0v!$5ecb8h^x=(m^_YS zJc-$#Y-toRLY&`egpf!Sgmx!uG5T;gMuaMgIPfx`ga;pR!9jRJsS~ZEF#0D#9VO*# z5+{iQu5?VCIcKdkh%^|D%BqOswAJZqrAEW!Jf8xHZhs|^>KF&9ln`1eMTCLL#gHi} z!t_%B2+r=`y_IDhW2(t?+-mpYEUBux-R@aahC-~?QIaM^n5K<(yDI>~RV@79ODRL( z4AEz43PL#Nt+mcO=R6CgGsYWfW{t7NSZjokRaxfwObX%2k4MLc`&)y9y;i#$CE4ND z-TlqmrYd!kCar#>)sK>7Z|j~Z%Q$P^zx_@=9d~-GoHOSvdardLVyq)L^&IeN5|gP-QM!4vyawQDWzgWaTGgm z!&|%AY)UD%caPUkFI_sn`j>zElaD=p@%F}kWsI>EAt|kGT}&s#(7>?HF!V&|ydxq` z+<7ZFCkoy%&l$JY5c+1LVXUp|QmTlM(77Z@g;Z&yrKEiMGoO0%t?OFJgTv!~zkBhK zM{jLzo&N3rI$c~F9UZ2Ni^3CV>5=<zHLppzJBhJM=sZuan=k6BOR&Gh2$rElq5;QP1-rGr{B?{L^mqiI=rq*w=P z%AB8$oCEO?8WjMXF+s$M5WOSvM3ONUB@Jt9hBXmm%m>{GF-F`oVqx|Y2!$UiSWlvs zz&JyX^SmS%pa9V`Mo69qI1L9OB|~xsNwUE81`gcw5A%{BBocXN=RXv}K$fw_1c#qT z)H-t3d+&?sP$&f;XX8P$yKwsa)i`UipwD33RAn)n#AyaXYONV#LTag$;DU3G-iB4r z;o(lNzmld+#+j5-N*%@^0ck9R2ufDMV8-w&Y9Ntw-lGkF6k>~^l;x~tjN&Bo-iLi` zIPw!P&KVL)u84E*4P)TZaK@F2s1PLM9$PT!=$dO zy2{a+R(C;3eYCf8`pg9>A<3GI@g!*>x+F=$8OJ#*WyHAz&d7UIf)Jx97QjEa`A$(3 zzx9=WXpCQ8dEsDxrLgou+^fSgRH zTI)`yUDma!jrX32q!0qYSW67h~lLMM{V+1A!n=nOhHE2bTE=-v92ry7m6sb=M@jI%~vOv{>{e&X7nedEH-bQB{}Euho{m^~1M& zz2=KgUwZAGyILzL!8wkI=p6t^C9AR+9PCM@EaS0`TJ3H=8!M%wD7MaU&Ji(+^sl`1 z3C3;vnbB$szC1oM~@MrN8pSzUezV% zJc%>G0SSRKV@+L`oC_{gySp%(j=?MRuG?So-g9Pu_KP>T6xI|)F>ZCTw|?^7r7!+L zbM+jnOC@A}u(hYxAo8*58#=S;iP z!*t1 z=wS0sq}IxO?9qj^1$sAUN&Qj;j}a&4=Y^ViOgcPJ&?D!J1mjZ65AJQ=xwFw|G=Kfq zzc8JR%A)$-4}MrxWu$c={VE+cALyJzL;$G-|I?w|KczHvM35~Yg?Bd zDT$+2Bde;iuIts+)o!;_6xGJY#$+-*ckb-d&p!Rlzy0>-fAy7bee=7)1r#21M9h1? zv%Rg7WL8>^_T2f4)|$=D2b0O9*Xu4XE^cpc#c>LPDWy3u^d{t|gSCipW=y43B$SGD zglLGfe0qHA*6p)r&MBRGUoZC?WnI;ExqEO##Ir0KjA|+1;Aj9KE}uJn^SwKbEbd-D zF9awyZ%pzzl#7d#sS8RKrHxKL9Wr7zJR4&HkyG~*~hhO#hv zk7z+K#u<8Y)=8~FNOZQnu%e`J4vCPwW1M;Cga9d3xSBXyA8v1qj}NMRrn5|N?mSM% zqa@3sBozWcNZ?{TJeZ9RK}2&S%t`T69B+C_tpalBE~3;JGir!a|U7_69SN7 zZ5!@ra|a;+XXJdXqcn#8V@3DH|4r39@3I1#UksSu*sY6~f>t;*R<>L@(c zJH3@wrwc;NrXwL>dHECsO&1ed>om;}NhzU~bk1n41PA0S&`Tn%hr^?Ty@$iWVYA&e z)=s9QyEm`zZ9R}G^2Fmfsfs*F8*!ZKC=yaE^p>JXTWc8SQYk5A6h(2IATp0GZKP7j z+FEOBQ`ZcM19(J4Op+A6FN!?$yuGv2=~N2AfsaPRql2A;y)C75quDL%+5W>j)8l;r zkf5Z}NuvQw2p!jTMdaf+>o1*dw7Z?|lG3U!i%xH;Dhp%$=RWh&%{zDY4v$YQFP%BP z^yAlVx6?tc>V#XK>oisa(0c~WhX*8O2vSAO5?#4?{^ss*`T5Ut zoz~7*&br!m64hxncLpOf9V~Zxo#oa2((~ECbe69Fhkv_q>-|=5*_o=>?aQb!osN?@ znaw7X=}hZrG#G*qQp&;c@udsr2BTsyo*0{HR%Mll-+ zA!pN(5Q;NKKJ?GSY~2R%UqFI?xX=m@bfS|aaVWI_0O!O&>V~y;Hk-cn=38Z1zWmwG ztgM_)<78vwK}cA%nysKcK=h#?&IKe%a_|1e(c$2wmtLytDr@%7Kl;?l+L=@97m9M` z5!cV0ZDftTy}iA?ow_!Nw7!1knP;B8dGltPCdbFeL_CUOtyLVyNs=g~giyeksjI3g zj|az5oUE>_ByoIjc-U@t(li+i20{uUgcQLkH~*OE9n3X$o-@)>Z?g+94KhtstPWcB$( z8W>20#xM-@8Ls2RnaWuUp{RM%W;%J#0{bPyY7ps!*KjBh&1<8K5dGZfBvn{(qO;yR z^iBxj(E~`vd?=f7E*KIB>7C)g5xtOrK3v(@FY}7SAwr6X0}GHKA!JqNah%3!GfrEf z&l%R4j2K8AUc5vUMM+(i+jrj2r$=>NF07s*Vu*e+ILMlvMypFmoO1!PEGEOFZ21|T#@b#!=e>)l@@X?FU|#a6o)MT&#aQNp+=s-oTQ zHnWx#!XYXd2_Xh`gg%_T`aDMIj?FSdntzS5MCW@208yiQX*+2ZkOZRt&k6k%m*L9l3WsT2WJNMJK z@4xl_J;9kZw$(_koL~FvZ~y$lnUznz@Yvt}@Qr38L&UNyoO9^CP)h4q3Mh-&bUa{; zwc6c_mmf#(m5Q8mN=4pd*vCu3PcJXsxU<1H|MW*6zkP4pSes>yqrs@IYeFW37>$pH zN4rSK0g@zT3_uDH5XGrCWr%ylNfXf%l8{1ajo!ymnx-*2SDTt48fOG!Qb$EuYNelf z=Bd5C-6AiK_V>E|g{QAx*o@DtKL2Sn`Lkyh|H*Ub-hFr^1cTPXFs~Z1KE2R-VL86i z!k^vViKLvq_3G-7di=xBE-vjYGD(y~9^E{VQa?TJ>TonLBTxl_# z&5C?>;lkNCN_Tg68fhBLe^(y4Fd7dZKHSP@xs)PF;zqMMoz8}%ac!#2&CS_tdjJ0Y z$z(E_Oh==^WHM0~lKckaBDVt;?H*=(h0G8_!062N(o=P|~R z`7~=dV>yTu)?#RaQrc*Ei%5*f9_$~2h_<$OxZvKA(y4PEKt27$Wg(-yC=QMWm(HwJ z#*U}C6iQ+3h%gY_DacJIpjv>4ytgO#MLzo@hh99Pb{P+G@nJ{<`u0YJ!*6{&;Q$vex4 zgp%QHB!u+dq4QNa@!kk8Ig{iW02f+&YpXH`&Sew{AqW{)zz9rLNmWQ4pISR-y{oD+ zic+PN)@fDE(neDYA+IXfB+lv2(cLaOS5ka5Xp)6sM?YPY*})vS%Ji^=YTo56&YW}U3vx2~>Dm8MNZ zYs#E4brmUhPAfaUtH*A!|~{NG)t2-jxt@0dyTBD zs^ejKYN-=z@nH8@E8#2(5RX54=G#AdbFtrMYVo3^?E2KdQ>IC<-A2GvKWS&cm=i zpqzwMy`^!>wV~*pI__udcA|=(PUOealE>ErkoCTHg89< z=8UY#8RNtey$|;u#yAM=$)PvFav6-sh#o+3hCvv~xd4!!BQOs0W;-I1wHUPY=shuH z2ttTvqw(JL_qEd7+gmTa^hreA-`{)p-RnC$TfJU?9>R8xxIo5}INIIc&GXq)PkrQ* zAAkBA-}qJ(N6$b1u?G+CZ$I1u005R{4MeJ{a(8Fv!i6)6@WRCl;=#ix($;!w z+~Ltdp63A2@AuO*Nz`|Z^{pLq|aoNBFhb~cUo-eR7YAQD^KcBi*{Fkl{U-MDe) z?Af2ZdA*g!Nt%f8ROK8vaE~saW`tBiYV=O2NXLn-OCsU|&|{~+Z0f>UGmkcM5JGWa zQIc^GQs|H?53?3T0x5-@lWCnbb1ZNG*D%I;_}W*2*^7h>!>EUZkcf=D(@`R&a^5l| z4jd7IhlMW-&%}VvncFs{5JGt8h*O-k5FH|N;2>03F6l5U=UkqYMFUohh?Lfx=xFZ& zBc@ceuzD64cH>U8uS$kN3Ccm@Et&;t&tzLMg@w{ah%MHhV#Fe1#ZjW7L}{(HZZujtO1R)Mh`c0(oDc{QQX&x&Pt(+yV(Y;N zg1d!stk0o>^>rD=0-`)-hR z)KzY(QYs~+a@K$VQ&+84Pe&Sw(EDJS2Vjy*=Nuz<^~&W34>o7B+_+jt`r4&S4}JQ% zmtXw$^-c81fT4(v^YWQ<%OXj7taxM0F0U-^nMkCqg~i^NuJpTUzaXW+??QiQW+-00lzVWfjs`7;5Dl=IIbNm&FeTgIl*h zm`*33{oJoCFE2m#*kfjTpLn8`Qk-)s6z8lcs?WUq^2a{@31iIm_QQ>h4IxAn zC2^coRW%$Aj*pHRV@j!~o_hL`%a>ny<&|5vZY?jbbi18SxBJzv{zul@;cz&c<>T>$ zh>|2~HX6nlYwiC2-ud$vgn+}tgKoE@q{wH5kTOi{aL#PRI-j|^;#_b}QYs~*-R%u$ zN>k0yTWjit#g)~y^JQ(EVlpcNT|N|lm<;LWIj|6; zI0XI6D2h3H zPR#r8ln<)`1`v#=GCZC`Ib=E+Pbb6h(Ku(o83-l-l-6OE#DRkloHGf)SO~^QDHU+e zkbr>zAnSpQ!tl|pG1l8oyCJxnjSiOj3o440ju@l+x8G+nS~-8sIGh!EZCntC=Xrq)yk|vO z&+@u9c3!I$YIS+B-)&1FTFva>;AlLaNf4$s&O64r5S%ee;z$4&AV#BsF*OJvqUm%@ zgr+XX<3W+nth1xRL6)^f$NM|?-s9fa05L(%zID-ET8YwjIUCn?E|jkF@nmp_$c-_x z>3BRk==4{Ld^Vj7lO#1|DLLnyzx>iOKYi;)tCi&jIm5Fn{f(_XrF1iu|K!V`sEm91 z%35vQ{$O_X{Oa8Y`&!9Rj(+aRM_+sUgW8y~sz3j!XBWF2Yh7K}LZ}e-NgJ&w&Xf?u zDKGNn<+a|zl2WSCXr@Wl$eLV$N0dT<0PFn6pSirdzgJcEiK`bTGwVEZ#yH0~ikx?d zm?lZ9-IqEg^nyzvRg`4TJ7X&VV4N9S2WtvrT&YMXg-9xjg;F4;2u58Y81uHSj4cTr zXRy7!L!5))RZ&DruAN%WCxi8djwJJh262)bi3ox4XEoc<#)y0KvR-)}pr?oA<}#v8$^x zpB8!fKmK3)z3!L4{H6Q%?@OuEtQkdmG#cz5?3ZP=yuAA9Pk-k8#Y@h) zd@?pg@!;Ow`ybriym#klcYAMlx7q4^>QkS&_Sn@piTC#px3;!svuU&06u{zU@5ZfL zmmYom)Y_@T!^1d9g%r+v9SIPOD6r-wfB*sL9U>z_;FM+=BFu^DoHp*=+}Yghw3j*B z#pTnjPQTe~WsOFbrXF2U=0xaijot|%6`Lb8!_pIpJSUFMIbSQKb(~biEF}EGkP*p~ zCy;{kFp3Y3c_i=Vw8i?!Cuu+}5^<@dmXb3hV#Fc5?GQ0bqh=$K0Q)-| zNQ`q!vQFC^ojX*5~76>kT@ibXw-)uzs+%93StmoVn0nJzEwfa9{w%Y?7quLchJUe=r