diff --git a/borestop/.editorconfig b/borestop/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..0439866388e5e324dfd589ebbd8e594377dd6b08
--- /dev/null
+++ b/borestop/.editorconfig
@@ -0,0 +1,23 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+# Change these settings to your own preference
+indent_style = space
+indent_size = 4
+
+[*.{ts,tsx,js,jsx,json,css,scss,yml}]
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/borestop/.eslintignore b/borestop/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..c8d1f55775fb14da4fe1674ec1d7e7fc1d02f528
--- /dev/null
+++ b/borestop/.eslintignore
@@ -0,0 +1,9 @@
+node_modules/
+src/main/docker/
+src/test/javascript/protractor.conf.js
+src/test/javascript/jest.conf.js
+webpack/
+target/
+build/
+node/
+postcss.config.js
diff --git a/borestop/.eslintrc.json b/borestop/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..43c1cf27258c05a548dbb17d85b84cc8ca1e3e12
--- /dev/null
+++ b/borestop/.eslintrc.json
@@ -0,0 +1,24 @@
+{
+  "plugins": ["@typescript-eslint/tslint"],
+  "extends": ["jhipster"],
+  "parserOptions": {
+    "project": "./tsconfig.base.json"
+  },
+  "rules": {
+    "@typescript-eslint/tslint/config": [
+      "error",
+      {
+        "lintFile": "./tslint.json"
+      }
+    ],
+    "@typescript-eslint/no-unused-vars": [
+      "warn",
+      {
+        "vars": "all",
+        "args": "after-used",
+        "ignoreRestSiblings": false
+      }
+    ],
+    "@typescript-eslint/no-non-null-assertion": "off"
+  }
+}
diff --git a/borestop/.gitattributes b/borestop/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..ca61722de2dea1a75268fb31316dffbeb055b2cf
--- /dev/null
+++ b/borestop/.gitattributes
@@ -0,0 +1,150 @@
+# This file is inspired by https://github.com/alexkaratarakis/gitattributes
+#
+# Auto detect text files and perform LF normalization
+# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/
+* text=auto
+
+# The above will handle all files NOT found below
+# These files are text and should be normalized (Convert crlf => lf)
+
+*.bat           text eol=crlf
+*.cmd           text eol=crlf
+*.ps1           text eol=crlf
+*.coffee        text
+*.css           text
+*.cql           text
+*.df            text
+*.ejs           text
+*.html          text
+*.java          text
+*.js            text
+*.json          text
+*.less          text
+*.properties    text
+*.sass          text
+*.scss          text
+*.sh            text eol=lf
+*.sql           text
+*.txt           text
+*.ts            text
+*.xml           text
+*.yaml          text
+*.yml           text
+
+# Documents
+*.doc           diff=astextplain
+*.DOC           diff=astextplain
+*.docx          diff=astextplain
+*.DOCX          diff=astextplain
+*.dot           diff=astextplain
+*.DOT           diff=astextplain
+*.pdf           diff=astextplain
+*.PDF           diff=astextplain
+*.rtf           diff=astextplain
+*.RTF           diff=astextplain
+*.markdown      text
+*.md            text
+*.adoc          text
+*.textile       text
+*.mustache      text
+*.csv           text
+*.tab           text
+*.tsv           text
+*.txt           text
+AUTHORS         text
+CHANGELOG       text
+CHANGES         text
+CONTRIBUTING    text
+COPYING         text
+copyright       text
+*COPYRIGHT*     text
+INSTALL         text
+license         text
+LICENSE         text
+NEWS            text
+readme          text
+*README*        text
+TODO            text
+
+# Graphics
+*.png           binary
+*.jpg           binary
+*.jpeg          binary
+*.gif           binary
+*.tif           binary
+*.tiff          binary
+*.ico           binary
+# SVG treated as an asset (binary) by default. If you want to treat it as text,
+# comment-out the following line and uncomment the line after.
+*.svg           binary
+#*.svg          text
+*.eps           binary
+
+# These files are binary and should be left untouched
+# (binary is a macro for -text -diff)
+*.class         binary
+*.jar           binary
+*.war           binary
+
+## LINTERS
+.csslintrc      text
+.eslintrc       text
+.jscsrc         text
+.jshintrc       text
+.jshintignore   text
+.stylelintrc    text
+
+## CONFIGS
+*.conf          text
+*.config        text
+.editorconfig   text
+.gitattributes  text
+.gitconfig      text
+.gitignore      text
+.htaccess       text
+*.npmignore     text
+
+## HEROKU
+Procfile        text
+.slugignore     text
+
+## AUDIO
+*.kar           binary
+*.m4a           binary
+*.mid           binary
+*.midi          binary
+*.mp3           binary
+*.ogg           binary
+*.ra            binary
+
+## VIDEO
+*.3gpp          binary
+*.3gp           binary
+*.as            binary
+*.asf           binary
+*.asx           binary
+*.fla           binary
+*.flv           binary
+*.m4v           binary
+*.mng           binary
+*.mov           binary
+*.mp4           binary
+*.mpeg          binary
+*.mpg           binary
+*.swc           binary
+*.swf           binary
+*.webm          binary
+
+## ARCHIVES
+*.7z            binary
+*.gz            binary
+*.rar           binary
+*.tar           binary
+*.zip           binary
+
+## FONTS
+*.ttf           binary
+*.eot           binary
+*.otf           binary
+*.woff          binary
+*.woff2         binary
diff --git a/borestop/.gitignore b/borestop/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..520491fa3c3a9ab8b0583422b7ffb0b78e0fb0ce
--- /dev/null
+++ b/borestop/.gitignore
@@ -0,0 +1,148 @@
+######################
+# Project Specific
+######################
+/src/main/webapp/content/css/main.css
+/target/classes/static/**
+/src/test/javascript/coverage/
+
+######################
+# Node
+######################
+/node/
+node_tmp/
+node_modules/
+npm-debug.log.*
+/.awcache/*
+/.cache-loader/*
+
+######################
+# SASS
+######################
+.sass-cache/
+
+######################
+# Eclipse
+######################
+*.pydevproject
+.project
+.metadata
+tmp/
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+.factorypath
+/src/main/resources/rebel.xml
+
+# External tool builders
+.externalToolBuilders/**
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+# STS-specific
+/.sts4-cache/*
+
+######################
+# IntelliJ
+######################
+.idea/
+*.iml
+*.iws
+*.ipr
+*.ids
+*.orig
+classes/
+out/
+
+######################
+# Visual Studio Code
+######################
+.vscode/
+
+######################
+# Maven
+######################
+/log/
+/target/
+
+######################
+# Gradle
+######################
+.gradle/
+/build/
+
+######################
+# Package Files
+######################
+*.jar
+*.war
+*.ear
+*.db
+
+######################
+# Windows
+######################
+# Windows image file caches
+Thumbs.db
+
+# Folder config file
+Desktop.ini
+
+######################
+# Mac OSX
+######################
+.DS_Store
+.svn
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+######################
+# Directories
+######################
+/bin/
+/deploy/
+
+######################
+# Logs
+######################
+*.log*
+
+######################
+# Others
+######################
+*.class
+*.*~
+*~
+.merge_file*
+
+######################
+# Gradle Wrapper
+######################
+!gradle/wrapper/gradle-wrapper.jar
+
+######################
+# Maven Wrapper
+######################
+!.mvn/wrapper/maven-wrapper.jar
+
+######################
+# ESLint
+######################
+.eslintcache
diff --git a/borestop/.huskyrc b/borestop/.huskyrc
new file mode 100644
index 0000000000000000000000000000000000000000..4d077c82927b1ec0bbf270b20da2f4c16e31d329
--- /dev/null
+++ b/borestop/.huskyrc
@@ -0,0 +1,5 @@
+{
+  "hooks": {
+    "pre-commit": "lint-staged"
+  }
+}
diff --git a/borestop/.lintstagedrc.js b/borestop/.lintstagedrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..00c792a5ec0083d1db268cb806b7b4d0a9390cf7
--- /dev/null
+++ b/borestop/.lintstagedrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+  '{,src/**/}*.{json,md,yml,ts,css,scss}': ['prettier --write', 'git add']
+};
diff --git a/borestop/.mvn/wrapper/MavenWrapperDownloader.java b/borestop/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a155e2dc595beb7ae62f896bb83d2452cf209b9
--- /dev/null
+++ b/borestop/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * 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.
+ */
+import java.io.*;
+import java.net.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+  private static final String WRAPPER_VERSION = "0.5.6";
+
+  /**
+   * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+   */
+  private static final String DEFAULT_DOWNLOAD_URL =
+    "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+  /**
+   * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+   * use instead of the default one.
+   */
+  private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties";
+
+  /**
+   * Path where the maven-wrapper.jar will be saved to.
+   */
+  private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar";
+
+  /**
+   * Name of the property which should be used to override the default download url for the wrapper.
+   */
+  private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+  public static void main(String args[]) {
+    System.out.println("- Downloader started");
+    File baseDirectory = new File(args[0]);
+    System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+    // If the maven-wrapper.properties exists, read it and check if it contains a custom
+    // wrapperUrl parameter.
+    File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+    String url = DEFAULT_DOWNLOAD_URL;
+    if (mavenWrapperPropertyFile.exists()) {
+      FileInputStream mavenWrapperPropertyFileInputStream = null;
+      try {
+        mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+        Properties mavenWrapperProperties = new Properties();
+        mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+        url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+      } catch (IOException e) {
+        System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+      } finally {
+        try {
+          if (mavenWrapperPropertyFileInputStream != null) {
+            mavenWrapperPropertyFileInputStream.close();
+          }
+        } catch (IOException e) {
+          // Ignore ...
+        }
+      }
+    }
+    System.out.println("- Downloading from: " + url);
+
+    File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+    if (!outputFile.getParentFile().exists()) {
+      if (!outputFile.getParentFile().mkdirs()) {
+        System.out.println("- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+      }
+    }
+    System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+    try {
+      downloadFileFromURL(url, outputFile);
+      System.out.println("Done");
+      System.exit(0);
+    } catch (Throwable e) {
+      System.out.println("- Error downloading");
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+
+  private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+    if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+      String username = System.getenv("MVNW_USERNAME");
+      char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+      Authenticator.setDefault(
+        new Authenticator() {
+
+          @Override
+          protected PasswordAuthentication getPasswordAuthentication() {
+            return new PasswordAuthentication(username, password);
+          }
+        }
+      );
+    }
+    URL website = new URL(urlString);
+    ReadableByteChannel rbc;
+    rbc = Channels.newChannel(website.openStream());
+    FileOutputStream fos = new FileOutputStream(destination);
+    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+    fos.close();
+    rbc.close();
+  }
+}
diff --git a/borestop/.mvn/wrapper/maven-wrapper.jar b/borestop/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054
Binary files /dev/null and b/borestop/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/borestop/.mvn/wrapper/maven-wrapper.properties b/borestop/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..642d572ce90e5085986bdd9c9204b9404f028084
--- /dev/null
+++ b/borestop/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/borestop/.prettierignore b/borestop/.prettierignore
new file mode 100644
index 0000000000000000000000000000000000000000..ab0567f5c3736365c716df2c699de96d336cc100
--- /dev/null
+++ b/borestop/.prettierignore
@@ -0,0 +1,8 @@
+node_modules
+target
+build
+package-lock.json
+.git
+.mvn
+gradle
+.gradle
diff --git a/borestop/.prettierrc b/borestop/.prettierrc
new file mode 100644
index 0000000000000000000000000000000000000000..b74928645d78aeaff469e1f3907079d501ade926
--- /dev/null
+++ b/borestop/.prettierrc
@@ -0,0 +1,12 @@
+# Prettier configuration
+
+printWidth: 140
+singleQuote: true
+tabWidth: 2
+useTabs: false
+
+# js and ts rules:
+arrowParens: avoid
+
+# jsx and tsx rules:
+jsxBracketSameLine: false
diff --git a/borestop/.yo-rc.json b/borestop/.yo-rc.json
new file mode 100644
index 0000000000000000000000000000000000000000..27775c66cfe8ea4c6a01310cf856d3afb28937f6
--- /dev/null
+++ b/borestop/.yo-rc.json
@@ -0,0 +1,42 @@
+{
+  "generator-jhipster": {
+    "promptValues": {
+      "packageName": "com.ippon.borestop",
+      "nativeLanguage": "en"
+    },
+    "jhipsterVersion": "6.10.1",
+    "applicationType": "monolith",
+    "baseName": "borestop",
+    "packageName": "com.ippon.borestop",
+    "packageFolder": "com/ippon/borestop",
+    "serverPort": "8080",
+    "authenticationType": "jwt",
+    "cacheProvider": "no",
+    "websocket": false,
+    "databaseType": "sql",
+    "devDatabaseType": "h2Disk",
+    "prodDatabaseType": "postgresql",
+    "searchEngine": false,
+    "messageBroker": false,
+    "serviceDiscoveryType": false,
+    "buildTool": "maven",
+    "enableSwaggerCodegen": false,
+    "jwtSecretKey": "NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=",
+    "embeddableLaunchScript": false,
+    "useSass": true,
+    "clientPackageManager": "npm",
+    "clientFramework": "angularX",
+    "clientTheme": "none",
+    "clientThemeVariant": "",
+    "creationTimestamp": 1598119629721,
+    "testFrameworks": [],
+    "jhiPrefix": "jhi",
+    "entitySuffix": "",
+    "dtoSuffix": "DTO",
+    "otherModules": [],
+    "enableTranslation": true,
+    "nativeLanguage": "en",
+    "languages": ["en"],
+    "blueprints": []
+  }
+}
diff --git a/borestop/README.md b/borestop/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..884572bdb12243efaab10f8d2004d7bcd9f3e8ab
--- /dev/null
+++ b/borestop/README.md
@@ -0,0 +1,237 @@
+# borestop
+
+This application was generated using JHipster 6.10.1, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v6.10.1](https://www.jhipster.tech/documentation-archive/v6.10.1).
+
+## Development
+
+Before you can build this project, you must install and configure the following dependencies on your machine:
+
+1. [Node.js][]: We use Node to run a development web server and build the project.
+   Depending on your system, you can install Node either from source or as a pre-packaged bundle.
+
+After installing Node, you should be able to run the following command to install development tools.
+You will only need to run this command when dependencies change in [package.json](package.json).
+
+```
+npm install
+```
+
+We use npm scripts and [Webpack][] as our build system.
+
+Run the following commands in two separate terminals to create a blissful development experience where your browser
+auto-refreshes when files change on your hard drive.
+
+```
+
+./mvnw
+
+
+npm start
+```
+
+Npm is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by
+specifying a newer version in [package.json](package.json). You can also run `npm update` and `npm install` to manage dependencies.
+Add the `help` flag on any command to see how you can use it. For example, `npm help update`.
+
+The `npm run` command will list all of the scripts available to run for this project.
+
+### PWA Support
+
+JHipster ships with PWA (Progressive Web App) support, and it's turned off by default. One of the main components of a PWA is a service worker.
+
+The service worker initialization code is commented out by default. To enable it, uncomment the following code in `src/main/webapp/index.html`:
+
+```html
+<script>
+  if ('serviceWorker' in navigator) {
+    navigator.serviceWorker.register('./service-worker.js').then(function() {
+      console.log('Service Worker Registered');
+    });
+  }
+</script>
+```
+
+Note: [Workbox](https://developers.google.com/web/tools/workbox/) powers JHipster's service worker. It dynamically generates the `service-worker.js` file.
+
+### Managing dependencies
+
+For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command:
+
+```
+npm install --save --save-exact leaflet
+```
+
+To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command:
+
+```
+npm install --save-dev --save-exact @types/leaflet
+```
+
+Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them:
+Edit [src/main/webapp/app/vendor.ts](src/main/webapp/app/vendor.ts) file:
+
+```
+import 'leaflet/dist/leaflet.js';
+```
+
+Edit [src/main/webapp/content/scss/vendor.scss](src/main/webapp/content/scss/vendor.scss) file:
+
+```
+@import '~leaflet/dist/leaflet.css';
+```
+
+Note: There are still a few other things remaining to do for Leaflet that we won't detail here.
+
+For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][].
+
+### Using Angular CLI
+
+You can also use [Angular CLI][] to generate some custom client code.
+
+For example, the following command:
+
+```
+ng generate component my-component
+```
+
+will generate few files:
+
+```
+create src/main/webapp/app/my-component/my-component.component.html
+create src/main/webapp/app/my-component/my-component.component.ts
+update src/main/webapp/app/app.module.ts
+```
+
+## Building for production
+
+### Packaging as jar
+
+To build the final jar and optimize the borestop application for production, run:
+
+```
+
+./mvnw -Pprod clean verify
+
+
+```
+
+This will concatenate and minify the client CSS and JavaScript files. It will also modify `index.html` so it references these new files.
+To ensure everything worked, run:
+
+```
+
+java -jar target/*.jar
+
+
+```
+
+Then navigate to [http://localhost:8080](http://localhost:8080) in your browser.
+
+Refer to [Using JHipster in production][] for more details.
+
+### Packaging as war
+
+To package your application as a war in order to deploy it to an application server, run:
+
+```
+
+./mvnw -Pprod,war clean verify
+
+
+```
+
+## Testing
+
+To launch your application's tests, run:
+
+```
+./mvnw verify
+```
+
+### Client tests
+
+Unit tests are run by [Jest][] and written with [Jasmine][]. They're located in [src/test/javascript/](src/test/javascript/) and can be run with:
+
+```
+npm test
+```
+
+For more information, refer to the [Running tests page][].
+
+### Code quality
+
+Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with:
+
+```
+docker-compose -f src/main/docker/sonar.yml up -d
+```
+
+You can run a Sonar analysis with using the [sonar-scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner) or by using the maven plugin.
+
+Then, run a Sonar analysis:
+
+```
+./mvnw -Pprod clean verify sonar:sonar
+```
+
+If you need to re-run the Sonar phase, please be sure to specify at least the `initialize` phase since Sonar properties are loaded from the sonar-project.properties file.
+
+```
+./mvnw initialize sonar:sonar
+```
+
+For more information, refer to the [Code quality page][].
+
+## Using Docker to simplify development (optional)
+
+You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services.
+
+For example, to start a postgresql database in a docker container, run:
+
+```
+docker-compose -f src/main/docker/postgresql.yml up -d
+```
+
+To stop it and remove the container, run:
+
+```
+docker-compose -f src/main/docker/postgresql.yml down
+```
+
+You can also fully dockerize your application and all the services that it depends on.
+To achieve this, first build a docker image of your app by running:
+
+```
+./mvnw -Pprod verify jib:dockerBuild
+```
+
+Then run:
+
+```
+docker-compose -f src/main/docker/app.yml up -d
+```
+
+For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications.
+
+## Continuous Integration (optional)
+
+To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information.
+
+[jhipster homepage and latest documentation]: https://www.jhipster.tech
+[jhipster 6.10.1 archive]: https://www.jhipster.tech/documentation-archive/v6.10.1
+[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v6.10.1/development/
+[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v6.10.1/docker-compose
+[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v6.10.1/production/
+[running tests page]: https://www.jhipster.tech/documentation-archive/v6.10.1/running-tests/
+[code quality page]: https://www.jhipster.tech/documentation-archive/v6.10.1/code-quality/
+[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v6.10.1/setting-up-ci/
+[node.js]: https://nodejs.org/
+[yarn]: https://yarnpkg.org/
+[webpack]: https://webpack.github.io/
+[angular cli]: https://cli.angular.io/
+[browsersync]: https://www.browsersync.io/
+[jest]: https://facebook.github.io/jest/
+[jasmine]: https://jasmine.github.io/2.0/introduction.html
+[protractor]: https://angular.github.io/protractor/
+[leaflet]: https://leafletjs.com/
+[definitelytyped]: https://definitelytyped.org/
diff --git a/borestop/angular.json b/borestop/angular.json
new file mode 100644
index 0000000000000000000000000000000000000000..fe07964515f4f1281f7698fec0c6bc5a28ccec86
--- /dev/null
+++ b/borestop/angular.json
@@ -0,0 +1,36 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "borestop": {
+      "root": "",
+      "sourceRoot": "src/main/webapp",
+      "projectType": "application",
+      "schematics": {
+        "@schematics/angular:component": {
+          "skipTests": true,
+          "style": "scss"
+        },
+        "@schematics/angular:directive": {
+          "skipTests": true
+        },
+        "@schematics/angular:guard": {
+          "skipTests": true
+        },
+        "@schematics/angular:pipe": {
+          "skipTests": true
+        },
+        "@schematics/angular:service": {
+          "skipTests": true
+        }
+      },
+      "prefix": "jhi",
+      "architect": {}
+    }
+  },
+  "defaultProject": "borestop",
+  "cli": {
+    "packageManager": "npm"
+  }
+}
diff --git a/borestop/checkstyle.xml b/borestop/checkstyle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e3dbafef82b229bf5903b076c25c5b3a985b961
--- /dev/null
+++ b/borestop/checkstyle.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+        "https://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+<module name="Checker">
+
+    <!-- Configure checker to use UTF-8 encoding -->
+    <property name="charset" value="UTF-8"/>
+    <!-- Configure checker to run on files with these extensions -->
+    <property name="fileExtensions" value=""/>
+    <!-- For detailed checkstyle configuration, see https://github.com/spring-io/nohttp/tree/master/nohttp-checkstyle -->
+    <module name="io.spring.nohttp.checkstyle.check.NoHttpCheck">
+        <property name="whitelist" value="http://maven.apache.org/POM/4.0.0&#10;
+            http://www.w3.org/2001/XMLSchema-instance&#10;http://maven.apache.org/maven-v4_0_0.xsd"/>
+    </module>
+    <!-- Allow suppression with comments
+       // CHECKSTYLE:OFF
+       ... ignored content ...
+       // CHECKSTYLE:ON
+    -->
+    <module name="SuppressWithPlainTextCommentFilter"/>
+</module>
diff --git a/borestop/mvnw b/borestop/mvnw
new file mode 100755
index 0000000000000000000000000000000000000000..41c0f0c23db5dca836d3db1a17a7a28444d17d74
--- /dev/null
+++ b/borestop/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/borestop/mvnw.cmd b/borestop/mvnw.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..86115719e5383e94597f918bf18c5ecbb7cfe492
--- /dev/null
+++ b/borestop/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/borestop/package-lock.json b/borestop/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..a9e29e4a3660d15ec3c47655250ec25a42b3a8fe
--- /dev/null
+++ b/borestop/package-lock.json
@@ -0,0 +1,23954 @@
+{
+  "name": "borestop",
+  "version": "0.0.1-SNAPSHOT",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@angular-devkit/architect": {
+      "version": "0.1000.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.0.tgz",
+      "integrity": "sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.0.0",
+        "rxjs": "6.5.5"
+      }
+    },
+    "@angular-devkit/core": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.0.tgz",
+      "integrity": "sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw==",
+      "dev": true,
+      "requires": {
+        "ajv": "6.12.2",
+        "fast-json-stable-stringify": "2.1.0",
+        "magic-string": "0.25.7",
+        "rxjs": "6.5.5",
+        "source-map": "0.7.3"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "@angular-devkit/schematics": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz",
+      "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.0.0",
+        "ora": "4.0.4",
+        "rxjs": "6.5.5"
+      }
+    },
+    "@angular/cli": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.0.tgz",
+      "integrity": "sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.1000.0",
+        "@angular-devkit/core": "10.0.0",
+        "@angular-devkit/schematics": "10.0.0",
+        "@schematics/angular": "10.0.0",
+        "@schematics/update": "0.1000.0",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ansi-colors": "4.1.1",
+        "debug": "4.1.1",
+        "ini": "1.3.5",
+        "inquirer": "7.1.0",
+        "npm-package-arg": "8.0.1",
+        "npm-pick-manifest": "6.1.0",
+        "open": "7.0.4",
+        "pacote": "9.5.12",
+        "read-package-tree": "5.3.1",
+        "rimraf": "3.0.2",
+        "semver": "7.3.2",
+        "symbol-observable": "1.2.0",
+        "universal-analytics": "0.4.20",
+        "uuid": "8.1.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "@angular/common": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.0.tgz",
+      "integrity": "sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/compiler": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.0.tgz",
+      "integrity": "sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/compiler-cli": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz",
+      "integrity": "sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g==",
+      "dev": true,
+      "requires": {
+        "canonical-path": "1.0.0",
+        "chokidar": "^3.0.0",
+        "convert-source-map": "^1.5.1",
+        "dependency-graph": "^0.7.2",
+        "fs-extra": "4.0.2",
+        "magic-string": "^0.25.0",
+        "minimist": "^1.2.0",
+        "reflect-metadata": "^0.1.2",
+        "semver": "^6.3.0",
+        "source-map": "^0.6.1",
+        "sourcemap-codec": "^1.4.8",
+        "tslib": "^2.0.0",
+        "yargs": "15.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
+        },
+        "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/core": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.0.tgz",
+      "integrity": "sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/forms": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.0.tgz",
+      "integrity": "sha512-Jaqs6WmF3fcaL1mKmeZt8pcFHkMuFvgLjbgGFqiOKcdz4UdGTcYkI3mE+UqHpqqXGXYTHLusup8A4TqD7s0rxg==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/localize": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.0.0.tgz",
+      "integrity": "sha512-UWuuJYVYDwMGKu8wQuyKH2v0Qbb9HW5n/3tIuw5s0O9yDlhyreueWqCYk42u51p8YDQ7FY7ToZhbMq73G7A8tA==",
+      "requires": {
+        "@babel/core": "7.8.3",
+        "glob": "7.1.2",
+        "yargs": "15.3.0"
+      }
+    },
+    "@angular/platform-browser": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.0.tgz",
+      "integrity": "sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/platform-browser-dynamic": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz",
+      "integrity": "sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@angular/router": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.0.tgz",
+      "integrity": "sha512-rx9e0eOwXypV/oWLrGsug3wx9lPnD6NUU3i20/VG9O1uMHgXfpnP8RJLcUHqmEMBZEYTLMo59fDE5LEgM1sIFg==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
+      "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "invariant": "^2.2.4",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/core": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
+      "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
+      "requires": {
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.8.3",
+        "@babel/helpers": "^7.8.3",
+        "@babel/parser": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.0",
+        "lodash": "^4.17.13",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz",
+      "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==",
+      "requires": {
+        "@babel/types": "^7.11.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+      "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
+      "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.10.4",
+        "browserslist": "^4.12.0",
+        "invariant": "^2.2.4",
+        "levenary": "^1.1.1",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+      "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.10.5",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
+      "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4",
+        "regexpu-core": "^4.7.0"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/types": "^7.10.5",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz",
+      "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.11.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+      "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-wrap-function": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
+      "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.11.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz",
+      "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA=="
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+      "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
+      "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
+      "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+      "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
+      "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-transform-parameters": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
+      "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
+      "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
+      "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
+      "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@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-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+      "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@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-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
+    "@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@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-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
+      "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
+      "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
+      "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
+      "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz",
+      "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
+      "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-define-map": "^7.10.4",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
+      "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
+      "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
+      "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
+      "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
+      "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
+      "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
+      "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
+      "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+      "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+      "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+      "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
+      "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.10.4",
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
+      "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
+      "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
+      "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
+      "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
+      "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
+      "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
+      "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.14.2"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
+      "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
+      "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
+      "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
+      "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
+      "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
+      "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
+      "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
+      "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
+      "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.10.4",
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+        "@babel/plugin-proposal-class-properties": "^7.10.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+        "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+        "@babel/plugin-proposal-json-strings": "^7.10.4",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+        "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+        "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+        "@babel/plugin-proposal-private-methods": "^7.10.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0",
+        "@babel/plugin-syntax-class-properties": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+        "@babel/plugin-syntax-top-level-await": "^7.10.4",
+        "@babel/plugin-transform-arrow-functions": "^7.10.4",
+        "@babel/plugin-transform-async-to-generator": "^7.10.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+        "@babel/plugin-transform-block-scoping": "^7.10.4",
+        "@babel/plugin-transform-classes": "^7.10.4",
+        "@babel/plugin-transform-computed-properties": "^7.10.4",
+        "@babel/plugin-transform-destructuring": "^7.10.4",
+        "@babel/plugin-transform-dotall-regex": "^7.10.4",
+        "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+        "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+        "@babel/plugin-transform-for-of": "^7.10.4",
+        "@babel/plugin-transform-function-name": "^7.10.4",
+        "@babel/plugin-transform-literals": "^7.10.4",
+        "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+        "@babel/plugin-transform-modules-amd": "^7.10.4",
+        "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+        "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+        "@babel/plugin-transform-modules-umd": "^7.10.4",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+        "@babel/plugin-transform-new-target": "^7.10.4",
+        "@babel/plugin-transform-object-super": "^7.10.4",
+        "@babel/plugin-transform-parameters": "^7.10.4",
+        "@babel/plugin-transform-property-literals": "^7.10.4",
+        "@babel/plugin-transform-regenerator": "^7.10.4",
+        "@babel/plugin-transform-reserved-words": "^7.10.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+        "@babel/plugin-transform-spread": "^7.11.0",
+        "@babel/plugin-transform-sticky-regex": "^7.10.4",
+        "@babel/plugin-transform-template-literals": "^7.10.4",
+        "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+        "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+        "@babel/plugin-transform-unicode-regex": "^7.10.4",
+        "@babel/preset-modules": "^0.1.3",
+        "@babel/types": "^7.11.0",
+        "browserslist": "^4.12.0",
+        "core-js-compat": "^3.6.2",
+        "invariant": "^2.2.2",
+        "levenary": "^1.1.1",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
+      "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.11.2",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+      "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/template": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/parser": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
+      "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.11.0",
+        "@babel/types": "^7.11.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/types": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
+      "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+      "dev": true
+    },
+    "@cnakazawa/watch": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+      "dev": true,
+      "requires": {
+        "exec-sh": "^0.3.2",
+        "minimist": "^1.2.0"
+      }
+    },
+    "@fortawesome/angular-fontawesome": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.6.1.tgz",
+      "integrity": "sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ=="
+    },
+    "@fortawesome/fontawesome-common-types": {
+      "version": "0.2.30",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz",
+      "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg=="
+    },
+    "@fortawesome/fontawesome-svg-core": {
+      "version": "1.2.29",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz",
+      "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.29"
+      }
+    },
+    "@fortawesome/free-solid-svg-icons": {
+      "version": "5.13.1",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz",
+      "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.29"
+      }
+    },
+    "@hapi/address": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
+      "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
+      "dev": true
+    },
+    "@hapi/bourne": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
+      "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
+      "dev": true
+    },
+    "@hapi/hoek": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
+      "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+      "dev": true
+    },
+    "@hapi/joi": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
+      "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/bourne": "1.x.x",
+        "@hapi/hoek": "8.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
+      "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "^8.3.0"
+      }
+    },
+    "@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@jest/console": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz",
+      "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "jest-message-util": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/core": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz",
+      "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/reporters": "^26.4.1",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-changed-files": "^26.3.0",
+        "jest-config": "^26.4.2",
+        "jest-haste-map": "^26.3.0",
+        "jest-message-util": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-resolve-dependencies": "^26.4.2",
+        "jest-runner": "^26.4.2",
+        "jest-runtime": "^26.4.2",
+        "jest-snapshot": "^26.4.2",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.2",
+        "jest-watcher": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "p-each-series": "^2.1.0",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/environment": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz",
+      "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==",
+      "dev": true,
+      "requires": {
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/fake-timers": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz",
+      "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@sinonjs/fake-timers": "^6.0.1",
+        "@types/node": "*",
+        "jest-message-util": "^26.3.0",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/globals": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz",
+      "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "expect": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/reporters": {
+      "version": "26.4.1",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz",
+      "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==",
+      "dev": true,
+      "requires": {
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.2.4",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^4.0.3",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.0.2",
+        "jest-haste-map": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "node-notifier": "^8.0.0",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.0",
+        "string-length": "^4.0.1",
+        "terminal-link": "^2.0.0",
+        "v8-to-istanbul": "^5.0.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/source-map": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz",
+      "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "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
+        }
+      }
+    },
+    "@jest/test-result": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz",
+      "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/test-sequencer": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz",
+      "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^26.3.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^26.3.0",
+        "jest-runner": "^26.4.2",
+        "jest-runtime": "^26.4.2"
+      }
+    },
+    "@jest/transform": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz",
+      "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/types": "^26.3.0",
+        "babel-plugin-istanbul": "^6.0.0",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-util": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "pirates": "^4.0.1",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.1",
+        "write-file-atomic": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/types": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+      "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^1.1.1",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@ng-bootstrap/ng-bootstrap": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.1.0.tgz",
+      "integrity": "sha512-2GzkNJBKdeHkaUqaCAqSILPft0IzzHjMfAlAuGY6/ZLlVQ0glt5MTbIXtIhSbjR+OvlrljoXFLrvzs1LGdmE+A=="
+    },
+    "@ngtools/webpack": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.0.tgz",
+      "integrity": "sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.0.0",
+        "enhanced-resolve": "4.1.1",
+        "rxjs": "6.5.5",
+        "webpack-sources": "1.4.3"
+      }
+    },
+    "@ngx-translate/core": {
+      "version": "12.1.2",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-12.1.2.tgz",
+      "integrity": "sha512-ZudJsqIxTKlLmPoqK8gJY3UpMGujR0Xm7HfXL6AR79yGRS23QqpjAhMfx4v5qUCcHMmQ9/78bW8QJLfp31c7vQ=="
+    },
+    "@ngx-translate/http-loader": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-5.0.0.tgz",
+      "integrity": "sha512-8+aV7N52qed+6t4LIu4Yru/PkeBX4TR2ioXGwXzQE5syqSLTj/8TgKQIi3i2Z61ZhPxQG1qrGbapUoGQzUDVeg=="
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
+      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        }
+      }
+    },
+    "@openapitools/openapi-generator-cli": {
+      "version": "1.0.13-4.3.1",
+      "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.13-4.3.1.tgz",
+      "integrity": "sha512-hUbSHCXak8vujMpTgH5dDACq0mynya37xgPFD3JbmnwRrPrgrZ4mr3+w7QZJ5aLMCIfb2j3s96d1sWaOZYZzxA==",
+      "dev": true
+    },
+    "@rollup/plugin-node-resolve": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz",
+      "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==",
+      "dev": true,
+      "requires": {
+        "@rollup/pluginutils": "^3.0.8",
+        "@types/resolve": "0.0.8",
+        "builtin-modules": "^3.1.0",
+        "is-module": "^1.0.0",
+        "resolve": "^1.14.2"
+      },
+      "dependencies": {
+        "builtin-modules": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
+          "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
+          "dev": true
+        }
+      }
+    },
+    "@rollup/plugin-replace": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz",
+      "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==",
+      "dev": true,
+      "requires": {
+        "@rollup/pluginutils": "^3.0.8",
+        "magic-string": "^0.25.5"
+      }
+    },
+    "@rollup/pluginutils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "0.0.39",
+        "estree-walker": "^1.0.1",
+        "picomatch": "^2.2.2"
+      }
+    },
+    "@samverschueren/stream-to-observable": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz",
+      "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==",
+      "dev": true,
+      "requires": {
+        "any-observable": "^0.3.0"
+      }
+    },
+    "@scarf/scarf": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz",
+      "integrity": "sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg=="
+    },
+    "@schematics/angular": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.0.tgz",
+      "integrity": "sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.0.0",
+        "@angular-devkit/schematics": "10.0.0"
+      }
+    },
+    "@schematics/update": {
+      "version": "0.1000.0",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.0.tgz",
+      "integrity": "sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.0.0",
+        "@angular-devkit/schematics": "10.0.0",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ini": "1.3.5",
+        "npm-package-arg": "^8.0.0",
+        "pacote": "9.5.12",
+        "rxjs": "6.5.5",
+        "semver": "7.3.2",
+        "semver-intersect": "1.4.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "@sinonjs/commons": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
+      "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
+      "dev": true,
+      "requires": {
+        "type-detect": "4.0.8"
+      }
+    },
+    "@sinonjs/fake-timers": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
+      "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+      "dev": true,
+      "requires": {
+        "@sinonjs/commons": "^1.7.0"
+      }
+    },
+    "@surma/rollup-plugin-off-main-thread": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz",
+      "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==",
+      "dev": true,
+      "requires": {
+        "ejs": "^2.6.1",
+        "magic-string": "^0.25.0"
+      },
+      "dependencies": {
+        "ejs": {
+          "version": "2.7.4",
+          "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+          "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+          "dev": true
+        }
+      }
+    },
+    "@types/anymatch": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
+      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
+      "dev": true
+    },
+    "@types/babel__core": {
+      "version": "7.1.9",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
+      "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "@types/babel__generator": {
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
+      "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__template": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
+      "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__traverse": {
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
+      "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.3.0"
+      }
+    },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    },
+    "@types/concat-stream": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
+      "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+      "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
+      "dev": true
+    },
+    "@types/estree": {
+      "version": "0.0.39",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+      "dev": true
+    },
+    "@types/form-data": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+      "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/graceful-fs": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz",
+      "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/html-minifier-terser": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz",
+      "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==",
+      "dev": true
+    },
+    "@types/istanbul-lib-coverage": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+      "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+      "dev": true
+    },
+    "@types/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "@types/istanbul-reports": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*",
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "@types/jest": {
+      "version": "26.0.3",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.3.tgz",
+      "integrity": "sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg==",
+      "dev": true,
+      "requires": {
+        "jest-diff": "^25.2.1",
+        "pretty-format": "^25.2.1"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
+      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "dev": true
+    },
+    "@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/minimist": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
+      "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "13.13.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz",
+      "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+      "dev": true
+    },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "dev": true
+    },
+    "@types/prettier": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz",
+      "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
+      "dev": true
+    },
+    "@types/qs": {
+      "version": "6.9.4",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz",
+      "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==",
+      "dev": true
+    },
+    "@types/resolve": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
+      "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@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/stack-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
+      "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
+      "dev": true
+    },
+    "@types/tapable": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz",
+      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
+      "dev": true
+    },
+    "@types/uglify-js": {
+      "version": "3.9.3",
+      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz",
+      "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==",
+      "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
+        }
+      }
+    },
+    "@types/webpack": {
+      "version": "4.41.21",
+      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz",
+      "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==",
+      "dev": true,
+      "requires": {
+        "@types/anymatch": "*",
+        "@types/node": "*",
+        "@types/tapable": "*",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "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
+        }
+      }
+    },
+    "@types/webpack-sources": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz",
+      "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "@types/yargs": {
+      "version": "15.0.5",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
+      "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
+      "dev": true,
+      "requires": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "@types/yargs-parser": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
+      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
+      "dev": true
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz",
+      "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/experimental-utils": "2.30.0",
+        "functional-red-black-tree": "^1.0.1",
+        "regexpp": "^3.0.0",
+        "tsutils": "^3.17.1"
+      }
+    },
+    "@typescript-eslint/eslint-plugin-tslint": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.30.0.tgz",
+      "integrity": "sha512-phARGRY1SyAkG9uVhF7o0yjK1eqmGYCwM7JpNkOo/50d68ZG0V/P9VyYMSKAj+IbRlZ/k2rKFibKZvfLJPcFGw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/experimental-utils": "2.30.0",
+        "lodash": "^4.17.15"
+      }
+    },
+    "@typescript-eslint/experimental-utils": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz",
+      "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.3",
+        "@typescript-eslint/typescript-estree": "2.30.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^2.0.0"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz",
+      "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==",
+      "dev": true,
+      "requires": {
+        "@types/eslint-visitor-keys": "^1.0.0",
+        "@typescript-eslint/experimental-utils": "2.30.0",
+        "@typescript-eslint/typescript-estree": "2.30.0",
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz",
+      "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "eslint-visitor-keys": "^1.1.0",
+        "glob": "^7.1.6",
+        "is-glob": "^4.0.1",
+        "lodash": "^4.17.15",
+        "semver": "^6.3.0",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@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"
+      }
+    },
+    "abab": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz",
+      "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+      "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+      "dev": true
+    },
+    "acorn-globals": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1"
+      }
+    },
+    "acorn-jsx": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+      "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+      "dev": true
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "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": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
+      "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.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.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "ansi": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
+      "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=",
+      "dev": true
+    },
+    "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
+    },
+    "ansi-escapes": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.11.0"
+      }
+    },
+    "ansi-font": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz",
+      "integrity": "sha1-iQMBvVhBRi/TnAt3Ca/R9SUUMzE=",
+      "dev": true
+    },
+    "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": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+    },
+    "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==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
+    "any-observable": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
+      "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "dev": true,
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "app-root-path": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz",
+      "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==",
+      "dev": true
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      },
+      "dependencies": {
+        "sprintf-js": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+          "dev": true
+        }
+      }
+    },
+    "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-differ": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+      "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
+    "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": "2.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+      "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "ast-types-flow": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+      "dev": true
+    },
+    "async-each-series": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
+      "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.8.4",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz",
+      "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001087",
+        "colorette": "^1.2.0",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      }
+    },
+    "aws-sdk": {
+      "version": "2.706.0",
+      "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.706.0.tgz",
+      "integrity": "sha512-7GT+yrB5Wb/zOReRdv/Pzkb2Qt+hz6B/8FGMVaoysX3NryHvQUdz7EQWi5yhg9CxOjKxdw5lFwYSs69YlSp1KA==",
+      "dev": true,
+      "requires": {
+        "buffer": "4.9.2",
+        "events": "1.1.1",
+        "ieee754": "1.1.13",
+        "jmespath": "0.15.0",
+        "querystring": "0.2.0",
+        "sax": "1.2.1",
+        "url": "0.10.3",
+        "uuid": "3.3.2",
+        "xml2js": "0.4.19"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
+        }
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+      "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
+      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
+      "dev": true,
+      "requires": {
+        "follow-redirects": "1.5.10",
+        "is-buffer": "^2.0.2"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "dev": true
+        }
+      }
+    },
+    "axobject-query": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz",
+      "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==",
+      "dev": true,
+      "requires": {
+        "ast-types-flow": "0.0.7"
+      }
+    },
+    "babel-extract-comments": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
+      "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
+      "dev": true,
+      "requires": {
+        "babylon": "^6.18.0"
+      }
+    },
+    "babel-jest": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz",
+      "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==",
+      "dev": true,
+      "requires": {
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/babel__core": "^7.1.7",
+        "babel-plugin-istanbul": "^6.0.0",
+        "babel-preset-jest": "^26.3.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-istanbul": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+      "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^4.0.0",
+        "test-exclude": "^6.0.0"
+      }
+    },
+    "babel-plugin-jest-hoist": {
+      "version": "26.2.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz",
+      "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__core": "^7.0.0",
+        "@types/babel__traverse": "^7.0.6"
+      }
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+      "dev": true
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "^6.8.0",
+        "babel-runtime": "^6.26.0"
+      }
+    },
+    "babel-preset-current-node-syntax": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz",
+      "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "babel-preset-jest": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz",
+      "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-jest-hoist": "^26.2.0",
+        "babel-preset-current-node-syntax": "^0.1.3"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+          "dev": true
+        }
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "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
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "dev": true,
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "bfj": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+      "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^8.0.3",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+      "dev": true
+    },
+    "binaryextensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz",
+      "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==",
+      "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
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+      "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.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"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "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"
+          }
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "bootstrap": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz",
+      "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA=="
+    },
+    "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": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+      "dev": true
+    },
+    "browser-sync": {
+      "version": "2.26.7",
+      "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz",
+      "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==",
+      "dev": true,
+      "requires": {
+        "browser-sync-client": "^2.26.6",
+        "browser-sync-ui": "^2.26.4",
+        "bs-recipes": "1.3.4",
+        "bs-snippet-injector": "^2.0.1",
+        "chokidar": "^2.0.4",
+        "connect": "3.6.6",
+        "connect-history-api-fallback": "^1",
+        "dev-ip": "^1.0.1",
+        "easy-extender": "^2.3.4",
+        "eazy-logger": "^3",
+        "etag": "^1.8.1",
+        "fresh": "^0.5.2",
+        "fs-extra": "3.0.1",
+        "http-proxy": "1.15.2",
+        "immutable": "^3",
+        "localtunnel": "1.9.2",
+        "micromatch": "^3.1.10",
+        "opn": "5.3.0",
+        "portscanner": "2.1.1",
+        "qs": "6.2.3",
+        "raw-body": "^2.3.2",
+        "resp-modifier": "6.0.2",
+        "rx": "4.1.0",
+        "send": "0.16.2",
+        "serve-index": "1.9.1",
+        "serve-static": "1.13.2",
+        "server-destroy": "1.0.1",
+        "socket.io": "2.1.1",
+        "ua-parser-js": "0.7.17",
+        "yargs": "6.4.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "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"
+          }
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+          "dev": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wrap-ansi": "^2.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"
+          }
+        },
+        "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"
+          }
+        },
+        "fs-extra": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
+          "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "jsonfile": "^3.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": 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
+        },
+        "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"
+              }
+            }
+          }
+        },
+        "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-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"
+          }
+        },
+        "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"
+          }
+        },
+        "jsonfile": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
+          "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6"
+          }
+        },
+        "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"
+          }
+        },
+        "qs": {
+          "version": "6.2.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
+          "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "which-module": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz",
+          "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^1.4.0",
+            "read-pkg-up": "^1.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^1.0.2",
+            "which-module": "^1.0.0",
+            "window-size": "^0.2.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^4.1.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0"
+          }
+        }
+      }
+    },
+    "browser-sync-client": {
+      "version": "2.26.12",
+      "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.12.tgz",
+      "integrity": "sha512-bEBDRkufKxrIfjOsIB1FN9itUEXr2oLtz1AySgSSr80K2AWzmtoYnxtVASx/i40qFrSdeI31pNvdCjHivihLVA==",
+      "dev": true,
+      "requires": {
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "mitt": "^1.1.3",
+        "rxjs": "^5.5.6"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "5.5.12",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+          "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        },
+        "symbol-observable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+          "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
+          "dev": true
+        }
+      }
+    },
+    "browser-sync-ui": {
+      "version": "2.26.12",
+      "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.12.tgz",
+      "integrity": "sha512-PkAJNf/TfCFTCkQUfXplR2Kp/+/lbCWFO9lrgLZsmxIhvMLx2pYZFBbTBIaem8qjXhld9ZcESUC8EdU5VWFJgQ==",
+      "dev": true,
+      "requires": {
+        "async-each-series": "0.1.1",
+        "connect-history-api-fallback": "^1",
+        "immutable": "^3",
+        "server-destroy": "1.0.1",
+        "socket.io-client": "^2.0.4",
+        "stream-throttle": "^0.1.3"
+      }
+    },
+    "browser-sync-webpack-plugin": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.2.2.tgz",
+      "integrity": "sha512-x92kl8LdBi4dp6YVXYqrSoDkOCOLCeBOrYSY0h9Sk1VcCDSoZC1Vc62eae6TfC2ljN4/L+aYlkzE46kirHzbgA==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4"
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "browserify-sign": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
+      }
+    },
+    "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.14.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz",
+      "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001111",
+        "electron-to-chromium": "^1.3.523",
+        "escalade": "^3.0.2",
+        "node-releases": "^1.1.60"
+      }
+    },
+    "bs-logger": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+      "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+      "dev": true,
+      "requires": {
+        "fast-json-stable-stringify": "2.x"
+      }
+    },
+    "bs-recipes": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
+      "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=",
+      "dev": true
+    },
+    "bs-snippet-injector": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz",
+      "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=",
+      "dev": true
+    },
+    "bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "requires": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "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-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "builtins": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true
+    },
+    "cacache": {
+      "version": "12.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+      "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": {
+        "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"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "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"
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "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"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+          "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+          "dev": true
+        }
+      }
+    },
+    "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": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
+      "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
+      "dev": true,
+      "requires": {
+        "pascal-case": "^3.1.1",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
+    "camelcase-keys": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "map-obj": "^4.0.0",
+        "quick-lru": "^4.0.1"
+      }
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001117",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz",
+      "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==",
+      "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
+    },
+    "capture-exit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+      "dev": true,
+      "requires": {
+        "rsvp": "^4.8.4"
+      }
+    },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "char-regex": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+      "dev": true
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "check-types": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+      "dev": true
+    },
+    "chevrotain": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz",
+      "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==",
+      "dev": true,
+      "requires": {
+        "regexp-to-ast": "0.5.0"
+      }
+    },
+    "chokidar": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+      "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+      "dev": true,
+      "requires": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.2",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.4.0"
+      }
+    },
+    "chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "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.3",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+      "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": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
+    },
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^3.1.0"
+      }
+    },
+    "cli-spinners": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
+      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
+      "dev": true
+    },
+    "cli-table": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
+      "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+      "dev": true,
+      "requires": {
+        "colors": "1.0.3"
+      },
+      "dependencies": {
+        "colors": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+          "dev": true
+        }
+      }
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "slice-ansi": {
+          "version": "0.0.4",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+          "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "cli-width": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+      "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+      "dev": true
+    },
+    "cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+      "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-stats": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+      "dev": true
+    },
+    "cloneable-readable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "process-nextick-args": "^2.0.0",
+        "readable-stream": "^2.3.5"
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "dev": true,
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      }
+    },
+    "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.2",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz",
+      "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==",
+      "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"
+      }
+    },
+    "collect-v8-coverage": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
+      "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.2"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "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="
+    },
+    "color-string": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+      "dev": true
+    },
+    "colornames": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz",
+      "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=",
+      "dev": true
+    },
+    "colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+      "dev": true
+    },
+    "colorspace": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
+      "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
+      "dev": true,
+      "requires": {
+        "color": "3.0.x",
+        "text-hex": "1.0.x"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true
+    },
+    "common-tags": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+      "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "compare-versions": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+      "dev": true
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.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"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "conf": {
+      "version": "6.2.4",
+      "resolved": "https://registry.npmjs.org/conf/-/conf-6.2.4.tgz",
+      "integrity": "sha512-GjgyPRLo1qK1LR9RWAdUagqo+DP18f5HWCFk4va7GS+wpxQTOzfuKTwKOvGW2c01/YXNicAyyoyuSddmdkBzZQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.10.2",
+        "debounce-fn": "^3.0.1",
+        "dot-prop": "^5.0.0",
+        "env-paths": "^2.2.0",
+        "json-schema-typed": "^7.0.1",
+        "make-dir": "^3.0.0",
+        "onetime": "^5.1.0",
+        "pkg-up": "^3.0.1",
+        "semver": "^6.2.0",
+        "write-file-atomic": "^3.0.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
+        }
+      }
+    },
+    "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": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "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"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "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": "6.0.2",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz",
+      "integrity": "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==",
+      "dev": true,
+      "requires": {
+        "cacache": "^15.0.4",
+        "fast-glob": "^3.2.2",
+        "find-cache-dir": "^3.3.1",
+        "glob-parent": "^5.1.1",
+        "globby": "^11.0.1",
+        "loader-utils": "^2.0.0",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^2.3.0",
+        "schema-utils": "^2.7.0",
+        "serialize-javascript": "^3.1.0",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "15.0.5",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
+          "dev": true,
+          "requires": {
+            "@npmcli/move-file": "^1.0.1",
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^6.0.0",
+            "minipass": "^3.1.1",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^1.0.3",
+            "p-map": "^4.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^3.0.2",
+            "ssri": "^8.0.0",
+            "tar": "^6.0.2",
+            "unique-filename": "^1.1.1"
+          }
+        },
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
+        "fs-minipass": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+          "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+          "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+          "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
+          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.1.1"
+          }
+        },
+        "tar": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
+          "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
+          "dev": true,
+          "requires": {
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "minipass": "^3.0.0",
+            "minizlib": "^2.1.1",
+            "mkdirp": "^1.0.3",
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "core-js": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+      "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+      "dev": true
+    },
+    "core-js-compat": {
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+      "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.8.5",
+        "semver": "7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+          "dev": true
+        }
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+      "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+      "dev": true,
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.1.0",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.7.2"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+      "dev": true,
+      "requires": {
+        "capture-stack-trace": "^1.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"
+      }
+    },
+    "crypto-random-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+      "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+      "dev": true
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-loader": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
+      "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^4.1.1",
+        "loader-utils": "^1.2.3",
+        "normalize-path": "^3.0.0",
+        "postcss": "^7.0.32",
+        "postcss-modules-extract-imports": "^2.0.0",
+        "postcss-modules-local-by-default": "^3.0.2",
+        "postcss-modules-scope": "^2.2.0",
+        "postcss-modules-values": "^3.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
+        "domutils": "1.5.1",
+        "nth-check": "~1.0.1"
+      },
+      "dependencies": {
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          },
+          "dependencies": {
+            "domelementtype": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+              "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+              "dev": true
+            }
+          }
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+          "dev": true
+        },
+        "domutils": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+          "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        }
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+      "dev": true
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+      "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "fastparse": "^1.1.2"
+      }
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "css-what": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "dev": true
+    },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "X.X.X"
+      }
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "dev": true,
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
+    },
+    "csso": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
+      "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+      "dev": true,
+      "requires": {
+        "css-tree": "1.0.0-alpha.39"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.0.0-alpha.39",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
+          "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.6",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
+          "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+          "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
+        }
+      }
+    },
+    "cssom": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+      "dev": true
+    },
+    "cssstyle": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "dev": true,
+      "requires": {
+        "cssom": "~0.3.6"
+      },
+      "dependencies": {
+        "cssom": {
+          "version": "0.3.8",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+          "dev": true
+        }
+      }
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
+    },
+    "damerau-levenshtein": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+      "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==",
+      "dev": true
+    },
+    "dargs": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz",
+      "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==",
+      "dev": true
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "data-urls": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.3",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0"
+      }
+    },
+    "date-fns": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
+      "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
+      "dev": true
+    },
+    "dateformat": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+      "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+      "dev": true
+    },
+    "debounce-fn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz",
+      "integrity": "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "debug": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+      "requires": {
+        "ms": "^2.1.1"
+      }
+    },
+    "debuglog": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
+      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
+      "dev": true
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "decamelize-keys": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+      "dev": true,
+      "requires": {
+        "decamelize": "^1.1.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "map-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
+        }
+      }
+    },
+    "decimal.js": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
+      "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "dev": true,
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "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": "3.0.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "^6.1.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "p-map": "^1.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "p-map": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+          "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+          "dev": true
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          },
+          "dependencies": {
+            "glob": {
+              "version": "7.1.6",
+              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+              "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+              "dev": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "dependency-graph": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz",
+      "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-file": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+      "dev": true
+    },
+    "detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+      "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
+    },
+    "dev-ip": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
+      "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=",
+      "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"
+      }
+    },
+    "diagnostics": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
+      "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==",
+      "dev": true,
+      "requires": {
+        "colorspace": "1.1.x",
+        "enabled": "1.0.x",
+        "kuler": "1.0.x"
+      }
+    },
+    "didyoumean": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz",
+      "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=",
+      "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
+    },
+    "diff-sequences": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+      "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+      "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"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
+        }
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "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"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz",
+      "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.0.0",
+        "entities": "^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
+    },
+    "domelementtype": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+      "dev": true
+    },
+    "domexception": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+      "dev": true,
+      "requires": {
+        "webidl-conversions": "^5.0.0"
+      },
+      "dependencies": {
+        "webidl-conversions": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+          "dev": true
+        }
+      }
+    },
+    "domhandler": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz",
+      "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1"
+      }
+    },
+    "domutils": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz",
+      "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.0.0"
+      }
+    },
+    "dot-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
+      "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "dot-prop": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+      "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+      "dev": true,
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "download-stats": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/download-stats/-/download-stats-0.3.4.tgz",
+      "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==",
+      "dev": true,
+      "requires": {
+        "JSONStream": "^1.2.1",
+        "lazy-cache": "^2.0.1",
+        "moment": "^2.15.1"
+      }
+    },
+    "drange": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz",
+      "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==",
+      "dev": true
+    },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "dev": true
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "easy-extender": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
+      "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.10"
+      }
+    },
+    "eazy-logger": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz",
+      "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=",
+      "dev": true,
+      "requires": {
+        "tfunk": "^3.0.1"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "editions": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz",
+      "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==",
+      "dev": true,
+      "requires": {
+        "errlop": "^2.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
+        }
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "ejs": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz",
+      "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==",
+      "dev": true,
+      "requires": {
+        "jake": "^10.6.1"
+      }
+    },
+    "electron-to-chromium": {
+      "version": "1.3.542",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.542.tgz",
+      "integrity": "sha512-9Wm4o9h2CE/h4PDBkE5Ff2ha4frgltV/BgVCwFK8Tc9DKF19xJK85zA82JFah0/+oe8SU3rYRWtlYZH58pC6Ng==",
+      "dev": true
+    },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+      "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"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "emittery": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz",
+      "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==",
+      "dev": true
+    },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
+    },
+    "enabled": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
+      "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
+      "dev": true,
+      "requires": {
+        "env-variable": "0.0.x"
+      }
+    },
+    "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.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "^0.6.2"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "engine.io": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
+      "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "base64id": "1.0.0",
+        "cookie": "0.3.1",
+        "debug": "~3.1.0",
+        "engine.io-parser": "~2.1.0",
+        "ws": "~3.3.1"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "ws": {
+          "version": "3.3.3",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+          "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+          "dev": true,
+          "requires": {
+            "async-limiter": "~1.0.0",
+            "safe-buffer": "~5.1.0",
+            "ultron": "~1.1.0"
+          }
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz",
+      "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "~1.3.0",
+        "component-inherit": "0.0.3",
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "ws": "~6.1.0",
+        "xmlhttprequest-ssl": "~1.5.4",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "component-emitter": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+          "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+          "dev": true
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
+      "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
+      "dev": true,
+      "requires": {
+        "after": "0.8.2",
+        "arraybuffer.slice": "~0.0.7",
+        "base64-arraybuffer": "0.1.5",
+        "blob": "0.0.5",
+        "has-binary2": "~1.0.2"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+      "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      }
+    },
+    "entities": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+      "dev": true
+    },
+    "env-paths": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+      "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==",
+      "dev": true
+    },
+    "env-variable": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz",
+      "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==",
+      "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
+    },
+    "errlop": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz",
+      "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==",
+      "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": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz",
+      "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
+      "dev": true,
+      "requires": {
+        "string-template": "~0.2.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"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
+      "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
+      "dev": true,
+      "requires": {
+        "stackframe": "^1.1.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.17.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "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.2.0",
+        "is-regex": "^1.1.0",
+        "object-inspect": "^1.7.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.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"
+      }
+    },
+    "escalade": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
+      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+      "dev": true
+    },
+    "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="
+    },
+    "escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "dev": true,
+      "requires": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "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,
+          "optional": true
+        }
+      }
+    },
+    "eslint": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.5",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^1.4.3",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.1.2",
+        "esquery": "^1.0.1",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^7.0.0",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.3.0",
+        "lodash": "^4.17.14",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.3",
+        "progress": "^2.0.0",
+        "regexpp": "^2.0.1",
+        "semver": "^6.1.2",
+        "strip-ansi": "^5.2.0",
+        "strip-json-comments": "^3.0.1",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "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
+        },
+        "eslint-utils": {
+          "version": "1.4.3",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+          "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "regexpp": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+          "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "eslint-config-jhipster": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-jhipster/-/eslint-config-jhipster-0.0.1.tgz",
+      "integrity": "sha512-E9/05t3+6V2K9YrJwsLmrblGgYnYfw62o/ja+Hr9wz3+AX2nG6gtycMW7LrS4alFuar1SGhbAyT3orTR5ur9MQ==",
+      "dev": true
+    },
+    "eslint-config-prettier": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz",
+      "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^6.0.0"
+      }
+    },
+    "eslint-loader": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz",
+      "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^3.3.1",
+        "fs-extra": "^8.1.0",
+        "loader-utils": "^2.0.0",
+        "object-hash": "^2.0.3",
+        "schema-utils": "^2.6.5"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        }
+      }
+    },
+    "eslint-scope": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+      "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "espree": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "estree-walker": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "eventemitter3": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "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"
+      }
+    },
+    "exec-sh": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
+      "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
+      "dev": true
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "exit-hook": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+      "dev": true
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "expect": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz",
+      "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "ansi-styles": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "jest-matcher-utils": "^26.4.2",
+        "jest-message-util": "^26.3.0",
+        "jest-regex-util": "^26.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "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": {
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        },
+        "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": {
+            "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
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      },
+      "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=",
+      "dev": true
+    },
+    "faker": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz",
+      "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2",
+        "picomatch": "^2.2.1"
+      },
+      "dependencies": {
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fast-safe-stringify": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
+      "dev": true
+    },
+    "fastparse": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+      "dev": true
+    },
+    "fastq": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+      "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "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"
+      }
+    },
+    "fb-watchman": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+      "dev": true,
+      "requires": {
+        "bser": "2.1.1"
+      }
+    },
+    "fecha": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz",
+      "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==",
+      "dev": true
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "dev": true
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "file-loader": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz",
+      "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.6.5"
+      }
+    },
+    "filelist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz",
+      "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==",
+      "dev": true,
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+      "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.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"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      }
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "find-versions": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "dev": true,
+      "requires": {
+        "semver-regex": "^2.0.0"
+      }
+    },
+    "findup-sync": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+      "dev": true,
+      "requires": {
+        "detect-file": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "micromatch": "^3.0.4",
+        "resolve-dir": "^1.0.1"
+      }
+    },
+    "first-chunk-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+      "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "fn-name": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz",
+      "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=",
+      "dev": true
+    },
+    "follow-redirects": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "friendly-errors-webpack-plugin": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz",
+      "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "error-stack-parser": "^2.0.0",
+        "string-width": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "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"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "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"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
+      "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "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": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "dev": true,
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "g-status": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz",
+      "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.1",
+        "matcher": "^1.0.0",
+        "simple-git": "^1.85.0"
+      },
+      "dependencies": {
+        "arrify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+          "dev": true
+        }
+      }
+    },
+    "gauge": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz",
+      "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=",
+      "dev": true,
+      "requires": {
+        "ansi": "^0.3.0",
+        "has-unicode": "^2.0.0",
+        "lodash.pad": "^4.1.0",
+        "lodash.padend": "^4.1.0",
+        "lodash.padstart": "^4.1.0"
+      }
+    },
+    "generator-jhipster": {
+      "version": "6.10.1",
+      "resolved": "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-6.10.1.tgz",
+      "integrity": "sha512-a2MtlL//Ui/29F2Q4qgHp6qoXRr5vcqFwH4y5I5xDRHq3x1cHscZYedR79EV1oAwKzmFCqYpsWGoPAhFJlj0UA==",
+      "dev": true,
+      "requires": {
+        "aws-sdk": "2.706.0",
+        "axios": "0.19.2",
+        "chalk": "4.1.0",
+        "commander": "5.1.0",
+        "conf": "6.2.4",
+        "didyoumean": "1.2.1",
+        "ejs": "3.1.3",
+        "faker": "4.1.0",
+        "glob": "7.1.6",
+        "gulp-filter": "6.0.0",
+        "insight": "0.10.3",
+        "jhipster-core": "7.3.4",
+        "js-object-pretty-print": "0.3.0",
+        "js-yaml": "3.14.0",
+        "lodash": "4.17.15",
+        "meow": "6.1.0",
+        "mkdirp": "1.0.4",
+        "normalize-path": "3.0.0",
+        "ora": "4.0.4",
+        "os-locale": "5.0.0",
+        "parse-gitignore": "1.0.1",
+        "pluralize": "8.0.0",
+        "prettier": "2.0.5",
+        "prettier-plugin-java": "0.8.0",
+        "progress": "2.0.3",
+        "randexp": "0.5.3",
+        "semver": "7.3.2",
+        "shelljs": "0.8.4",
+        "sync-request": "6.1.0",
+        "tabtab": "2.2.2",
+        "test": "^0.6.0",
+        "through2": "3.0.2",
+        "uuid": "7.0.3",
+        "yeoman-environment": "2.10.3",
+        "yeoman-generator": "4.11.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "axios": {
+          "version": "0.19.2",
+          "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
+          "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
+          "dev": true,
+          "requires": {
+            "follow-redirects": "1.5.10"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "commander": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+          "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^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"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "invert-kv": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz",
+          "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+          "dev": true
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "lcid": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
+          "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+          "dev": true,
+          "requires": {
+            "invert-kv": "^3.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz",
+          "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+          "dev": true,
+          "requires": {
+            "execa": "^4.0.0",
+            "lcid": "^3.0.0",
+            "mem": "^5.0.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "through2": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.4",
+            "readable-stream": "2 || 3"
+          }
+        },
+        "uuid": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+          "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "genfun": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
+      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
+      "dev": true
+    },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
+    },
+    "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=="
+    },
+    "get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+      "dev": true
+    },
+    "get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+      "dev": true
+    },
+    "get-port": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+      "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "gh-got": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz",
+      "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=",
+      "dev": true,
+      "requires": {
+        "got": "^6.2.0",
+        "is-plain-obj": "^1.1.0"
+      }
+    },
+    "github-username": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz",
+      "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=",
+      "dev": true,
+      "requires": {
+        "gh-got": "^5.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "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": "5.1.1",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "global-modules": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+      "dev": true,
+      "requires": {
+        "global-prefix": "^3.0.0"
+      },
+      "dependencies": {
+        "global-prefix": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+          "dev": true,
+          "requires": {
+            "ini": "^1.3.5",
+            "kind-of": "^6.0.2",
+            "which": "^1.3.1"
+          }
+        }
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
+      }
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+    },
+    "globby": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+      "dev": true,
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
+      }
+    },
+    "got": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+      "dev": true,
+      "requires": {
+        "create-error-class": "^3.0.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^3.0.0",
+        "is-redirect": "^1.0.0",
+        "is-retry-allowed": "^1.0.0",
+        "is-stream": "^1.0.0",
+        "lowercase-keys": "^1.0.0",
+        "safe-buffer": "^5.0.1",
+        "timed-out": "^4.0.0",
+        "unzip-response": "^2.0.1",
+        "url-parse-lax": "^1.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        }
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+      "dev": true
+    },
+    "grouped-queue": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-1.1.0.tgz",
+      "integrity": "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+      "dev": true
+    },
+    "gulp-filter": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz",
+      "integrity": "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==",
+      "dev": true,
+      "requires": {
+        "multimatch": "^4.0.0",
+        "plugin-error": "^1.0.1",
+        "streamfilter": "^3.0.0"
+      }
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "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
+        }
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        }
+      }
+    },
+    "hard-rejection": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+      "dev": true
+    },
+    "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"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        }
+      }
+    },
+    "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="
+    },
+    "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-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
+      "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
+      "dev": true
+    },
+    "html-encoding-sniffer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+      "dev": true,
+      "requires": {
+        "whatwg-encoding": "^1.0.5"
+      }
+    },
+    "html-entities": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+      "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
+      "dev": true
+    },
+    "html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true
+    },
+    "html-loader": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.1.0.tgz",
+      "integrity": "sha512-zwLbEgy+i7sgIYTlxI9M7jwkn29IvdsV6f1y7a2aLv/w8l1RigVk0PFijBZLLFsdi2gvL8sf2VJhTjLlfnK8sA==",
+      "dev": true,
+      "requires": {
+        "html-minifier-terser": "^5.0.5",
+        "htmlparser2": "^4.1.0",
+        "loader-utils": "^2.0.0",
+        "parse-srcset": "^1.0.2",
+        "schema-utils": "^2.6.5"
+      }
+    },
+    "html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+      "dev": true,
+      "requires": {
+        "camel-case": "^4.1.1",
+        "clean-css": "^4.2.3",
+        "commander": "^4.1.1",
+        "he": "^1.2.0",
+        "param-case": "^3.0.3",
+        "relateurl": "^0.2.7",
+        "terser": "^4.6.3"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+          "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+          "dev": true
+        }
+      }
+    },
+    "html-webpack-plugin": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz",
+      "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==",
+      "dev": true,
+      "requires": {
+        "@types/html-minifier-terser": "^5.0.0",
+        "@types/tapable": "^1.0.5",
+        "@types/webpack": "^4.41.8",
+        "html-minifier-terser": "^5.0.1",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.15",
+        "pretty-error": "^2.1.1",
+        "tapable": "^1.1.3",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+      "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.0.0",
+        "domutils": "^2.0.0",
+        "entities": "^2.0.0"
+      }
+    },
+    "http-basic": {
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+      "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+      "dev": true,
+      "requires": {
+        "caseless": "^0.12.0",
+        "concat-stream": "^1.6.2",
+        "http-response-object": "^3.0.1",
+        "parse-cache-control": "^1.0.1"
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.7.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"
+      },
+      "dependencies": {
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+          "dev": true
+        }
+      }
+    },
+    "http-proxy": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz",
+      "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "1.x.x",
+        "requires-port": "1.x.x"
+      }
+    },
+    "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "eventemitter3": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz",
+          "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==",
+          "dev": true
+        },
+        "http-proxy": {
+          "version": "1.18.1",
+          "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+          "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+          "dev": true,
+          "requires": {
+            "eventemitter3": "^4.0.0",
+            "follow-redirects": "^1.0.0",
+            "requires-port": "^1.0.0"
+          }
+        }
+      }
+    },
+    "http-response-object": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+      "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+      "dev": true,
+      "requires": {
+        "@types/node": "^10.0.3"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "10.17.28",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz",
+          "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==",
+          "dev": true
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+      "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+      "dev": true,
+      "requires": {
+        "agent-base": "^4.3.0",
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "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"
+      }
+    },
+    "husky": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
+      "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "ci-info": "^2.0.0",
+        "compare-versions": "^3.6.0",
+        "cosmiconfig": "^6.0.0",
+        "find-versions": "^3.2.0",
+        "opencollective-postinstall": "^2.0.2",
+        "pkg-dir": "^4.2.0",
+        "please-upgrade-node": "^3.2.0",
+        "slash": "^3.0.0",
+        "which-pm-runs": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "iconv-lite": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+      "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "icss-utils": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+      "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14"
+      }
+    },
+    "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": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+      "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"
+      }
+    },
+    "immutable": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
+      "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=",
+      "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": "3.2.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.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"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "import-local": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
+      "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^3.0.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^2.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.15",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.5.3",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "insight": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz",
+      "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "chalk": "^2.4.2",
+        "conf": "^1.4.0",
+        "inquirer": "^6.3.1",
+        "lodash.debounce": "^4.0.8",
+        "os-name": "^3.1.0",
+        "request": "^2.88.0",
+        "tough-cookie": "^3.0.1",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "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"
+          }
+        },
+        "cli-cursor": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+          "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^2.0.0"
+          }
+        },
+        "conf": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz",
+          "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^4.1.0",
+            "env-paths": "^1.0.0",
+            "make-dir": "^1.0.0",
+            "pkg-up": "^2.0.0",
+            "write-file-atomic": "^2.3.0"
+          }
+        },
+        "dot-prop": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz",
+          "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==",
+          "dev": true,
+          "requires": {
+            "is-obj": "^1.0.0"
+          }
+        },
+        "env-paths": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
+          "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
+          "dev": true
+        },
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "inquirer": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
+          "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^3.2.0",
+            "chalk": "^2.4.2",
+            "cli-cursor": "^2.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^2.0.0",
+            "lodash": "^4.17.12",
+            "mute-stream": "0.0.7",
+            "run-async": "^2.2.0",
+            "rxjs": "^6.4.0",
+            "string-width": "^2.1.0",
+            "strip-ansi": "^5.1.0",
+            "through": "^2.3.6"
+          }
+        },
+        "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-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "mimic-fn": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+          "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+          "dev": true
+        },
+        "mute-stream": {
+          "version": "0.0.7",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+          "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+          "dev": true
+        },
+        "onetime": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+          "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "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
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
+          "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+          "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+          "dev": true,
+          "requires": {
+            "onetime": "^2.0.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "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": {
+            "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"
+              }
+            }
+          }
+        },
+        "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
+            }
+          }
+        },
+        "tough-cookie": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+          "dev": true,
+          "requires": {
+            "ip-regex": "^2.1.0",
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        },
+        "write-file-atomic": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+          "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
+          }
+        }
+      }
+    },
+    "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.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "dev": true
+    },
+    "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": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dev": true,
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "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": "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=="
+    },
+    "is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "dev": true
+    },
+    "is-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "is-number-like": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
+      "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
+      "dev": true,
+      "requires": {
+        "lodash.isfinite": "^3.3.2"
+      }
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "dev": true
+    },
+    "is-observable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz",
+      "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==",
+      "dev": true,
+      "requires": {
+        "symbol-observable": "^1.1.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"
+      }
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-potential-custom-element-name": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+      "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+      "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+      "dev": true
+    },
+    "is-redirect": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+      "dev": true
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "dev": true
+    },
+    "is-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==",
+      "dev": true
+    },
+    "is-scoped": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz",
+      "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=",
+      "dev": true,
+      "requires": {
+        "scoped-regex": "^1.0.0"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+      "dev": true,
+      "requires": {
+        "html-comment-regex": "^1.1.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isbinaryfile": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+      "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul-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-instrument": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.7.5",
+        "@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": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+      "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.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
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+      "dev": true,
+      "requires": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      }
+    },
+    "istextorbinary": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz",
+      "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==",
+      "dev": true,
+      "requires": {
+        "binaryextensions": "^2.1.2",
+        "editions": "^2.2.0",
+        "textextensions": "^2.5.0"
+      }
+    },
+    "jake": {
+      "version": "10.8.2",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
+      "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
+      "dev": true,
+      "requires": {
+        "async": "0.9.x",
+        "chalk": "^2.4.2",
+        "filelist": "^1.0.1",
+        "minimatch": "^3.0.4"
+      },
+      "dependencies": {
+        "async": {
+          "version": "0.9.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+          "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
+          "dev": true
+        }
+      }
+    },
+    "java-parser": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-0.8.0.tgz",
+      "integrity": "sha512-8MOu9EDjWlAcBnxjVI8jblcOX/zJt9XVLaMLrXYvmJYk3gvRqTUKsEp/PxaooJQc6wh+nPEyqEbhCy3BWIgi0g==",
+      "dev": true,
+      "requires": {
+        "chevrotain": "6.5.0",
+        "lodash": "4.17.15"
+      },
+      "dependencies": {
+        "chevrotain": {
+          "version": "6.5.0",
+          "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz",
+          "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==",
+          "dev": true,
+          "requires": {
+            "regexp-to-ast": "0.4.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "regexp-to-ast": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz",
+          "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==",
+          "dev": true
+        }
+      }
+    },
+    "jest": {
+      "version": "26.1.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz",
+      "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==",
+      "dev": true,
+      "requires": {
+        "@jest/core": "^26.1.0",
+        "import-local": "^3.0.2",
+        "jest-cli": "^26.1.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-cli": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz",
+          "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==",
+          "dev": true,
+          "requires": {
+            "@jest/core": "^26.4.2",
+            "@jest/test-result": "^26.3.0",
+            "@jest/types": "^26.3.0",
+            "chalk": "^4.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "import-local": "^3.0.2",
+            "is-ci": "^2.0.0",
+            "jest-config": "^26.4.2",
+            "jest-util": "^26.3.0",
+            "jest-validate": "^26.4.2",
+            "prompts": "^2.0.1",
+            "yargs": "^15.3.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        }
+      }
+    },
+    "jest-changed-files": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz",
+      "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "execa": "^4.0.0",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+          "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "jest-config": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz",
+      "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/test-sequencer": "^26.4.2",
+        "@jest/types": "^26.3.0",
+        "babel-jest": "^26.3.0",
+        "chalk": "^4.0.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.2.4",
+        "jest-environment-jsdom": "^26.3.0",
+        "jest-environment-node": "^26.3.0",
+        "jest-get-type": "^26.3.0",
+        "jest-jasmine2": "^26.4.2",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.2",
+        "micromatch": "^4.0.2",
+        "pretty-format": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-date-mock": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz",
+      "integrity": "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw==",
+      "dev": true
+    },
+    "jest-diff": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
+      "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "diff-sequences": "^25.2.6",
+        "jest-get-type": "^25.2.6",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-docblock": {
+      "version": "26.0.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
+      "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
+      "dev": true,
+      "requires": {
+        "detect-newline": "^3.0.0"
+      }
+    },
+    "jest-each": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz",
+      "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "pretty-format": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-environment-jsdom": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz",
+      "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "jsdom": "^16.2.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-environment-node": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz",
+      "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-get-type": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+      "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz",
+      "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/graceful-fs": "^4.1.2",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^2.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-regex-util": "^26.0.0",
+        "jest-serializer": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "sane": "^4.0.3",
+        "walker": "^1.0.7"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-jasmine2": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz",
+      "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/source-map": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "expect": "^26.4.2",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^26.4.2",
+        "jest-matcher-utils": "^26.4.2",
+        "jest-message-util": "^26.3.0",
+        "jest-runtime": "^26.4.2",
+        "jest-snapshot": "^26.4.2",
+        "jest-util": "^26.3.0",
+        "pretty-format": "^26.4.2",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-junit": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-11.0.1.tgz",
+      "integrity": "sha512-stgc0mBoiSg/F9qWd4KkmR3K7Nk2u+M/dc1oup7gxz9mrzGcEaU2YL9/0QscVqqg3IOaA1P5ZXtozG/XR6j6nw==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "strip-ansi": "^5.2.0",
+        "uuid": "^3.3.3",
+        "xml": "^1.0.1"
+      },
+      "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
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "jest-leak-detector": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz",
+      "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==",
+      "dev": true,
+      "requires": {
+        "jest-get-type": "^26.3.0",
+        "pretty-format": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-matcher-utils": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz",
+      "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "jest-diff": "^26.4.2",
+        "jest-get-type": "^26.3.0",
+        "pretty-format": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "diff-sequences": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz",
+          "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-diff": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz",
+          "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0",
+            "diff-sequences": "^26.3.0",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.4.2"
+          }
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-message-util": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz",
+      "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@jest/types": "^26.3.0",
+        "@types/stack-utils": "^1.0.1",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "micromatch": "^4.0.2",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-mock": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz",
+      "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-pnp-resolver": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+      "dev": true
+    },
+    "jest-preset-angular": {
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.2.1.tgz",
+      "integrity": "sha512-6t7lavnIHnZWz6a03jpZ5L7phMefi6SoBIRZ/GQdyML8YgwMtbJszbhUE+dh5lzmeNbd6AJ1gfleetGy2Rg4cQ==",
+      "dev": true,
+      "requires": {
+        "pretty-format": "^26.0.0",
+        "ts-jest": "^26.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-regex-util": {
+      "version": "26.0.0",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
+      "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
+      "dev": true
+    },
+    "jest-resolve": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz",
+      "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^26.3.0",
+        "read-pkg-up": "^7.0.1",
+        "resolve": "^1.17.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+              "dev": true
+            }
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "jest-resolve-dependencies": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz",
+      "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-snapshot": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-runner": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz",
+      "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "emittery": "^0.7.1",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^26.4.2",
+        "jest-docblock": "^26.0.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-leak-detector": "^26.4.2",
+        "jest-message-util": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "jest-runtime": "^26.4.2",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "source-map-support": "^0.5.6",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-runtime": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz",
+      "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/globals": "^26.4.2",
+        "@jest/source-map": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^26.4.2",
+        "jest-haste-map": "^26.3.0",
+        "jest-message-util": "^26.3.0",
+        "jest-mock": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-snapshot": "^26.4.2",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.2",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0",
+        "yargs": "^15.3.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        }
+      }
+    },
+    "jest-serializer": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz",
+      "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "graceful-fs": "^4.2.4"
+      }
+    },
+    "jest-snapshot": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz",
+      "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0",
+        "@jest/types": "^26.3.0",
+        "@types/prettier": "^2.0.0",
+        "chalk": "^4.0.0",
+        "expect": "^26.4.2",
+        "graceful-fs": "^4.2.4",
+        "jest-diff": "^26.4.2",
+        "jest-get-type": "^26.3.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-matcher-utils": "^26.4.2",
+        "jest-message-util": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^26.4.2",
+        "semver": "^7.3.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "diff-sequences": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz",
+          "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-diff": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz",
+          "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0",
+            "diff-sequences": "^26.3.0",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.4.2"
+          }
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-sonar-reporter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz",
+      "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==",
+      "dev": true,
+      "requires": {
+        "xml": "^1.0.1"
+      }
+    },
+    "jest-util": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz",
+      "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "is-ci": "^2.0.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-validate": {
+      "version": "26.4.2",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz",
+      "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "camelcase": "^6.0.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "leven": "^3.1.0",
+        "pretty-format": "^26.4.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
+          "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.2",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz",
+          "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-watcher": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz",
+      "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "jest-util": "^26.3.0",
+        "string-length": "^4.0.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-worker": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
+      "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jhipster-core": {
+      "version": "7.3.4",
+      "resolved": "https://registry.npmjs.org/jhipster-core/-/jhipster-core-7.3.4.tgz",
+      "integrity": "sha512-AUhT69kNkqppaJZVfan/xnKG4Gs9Ggj7YLtTZFVe+xg+THrbMb5Ng7PL07PDlDw4KAEA33GMCwuAf65E8EpC4g==",
+      "dev": true,
+      "requires": {
+        "chevrotain": "7.0.1",
+        "fs-extra": "8.1.0",
+        "lodash": "4.17.15",
+        "winston": "3.2.1"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
+      }
+    },
+    "jmespath": {
+      "version": "0.15.0",
+      "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
+      "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
+      "dev": true
+    },
+    "js-object-pretty-print": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/js-object-pretty-print/-/js-object-pretty-print-0.3.0.tgz",
+      "integrity": "sha1-RnDkUAZu4ezPNRdMfRl/WqOLz3Q=",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "jsdom": {
+      "version": "16.4.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
+      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.3",
+        "acorn": "^7.1.1",
+        "acorn-globals": "^6.0.0",
+        "cssom": "^0.4.4",
+        "cssstyle": "^2.2.0",
+        "data-urls": "^2.0.0",
+        "decimal.js": "^10.2.0",
+        "domexception": "^2.0.1",
+        "escodegen": "^1.14.1",
+        "html-encoding-sniffer": "^2.0.1",
+        "is-potential-custom-element-name": "^1.0.0",
+        "nwsapi": "^2.2.0",
+        "parse5": "5.1.1",
+        "request": "^2.88.2",
+        "request-promise-native": "^1.0.8",
+        "saxes": "^5.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^3.0.1",
+        "w3c-hr-time": "^1.0.2",
+        "w3c-xmlserializer": "^2.0.0",
+        "webidl-conversions": "^6.1.0",
+        "whatwg-encoding": "^1.0.5",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0",
+        "ws": "^7.2.3",
+        "xml-name-validator": "^3.0.0"
+      },
+      "dependencies": {
+        "tough-cookie": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+          "dev": true,
+          "requires": {
+            "ip-regex": "^2.1.0",
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "ws": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+          "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+          "dev": true
+        }
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz",
+      "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-schema-typed": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz",
+      "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true
+    },
+    "kuler": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz",
+      "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==",
+      "dev": true,
+      "requires": {
+        "colornames": "^1.1.1"
+      }
+    },
+    "last-call-webpack-plugin": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
+      "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.5",
+        "webpack-sources": "^1.1.0"
+      }
+    },
+    "lazy-cache": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+      "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+      "dev": true,
+      "requires": {
+        "set-getter": "^0.1.0"
+      }
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levenary": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+      "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+      "dev": true,
+      "requires": {
+        "leven": "^3.1.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      }
+    },
+    "limiter": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
+      "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
+      "dev": true
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "lint-staged": {
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz",
+      "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.1",
+        "commander": "^2.14.1",
+        "cosmiconfig": "^5.2.0",
+        "debug": "^3.1.0",
+        "dedent": "^0.7.0",
+        "del": "^3.0.0",
+        "execa": "^1.0.0",
+        "g-status": "^2.0.2",
+        "is-glob": "^4.0.0",
+        "is-windows": "^1.0.2",
+        "listr": "^0.14.2",
+        "listr-update-renderer": "^0.5.0",
+        "lodash": "^4.17.11",
+        "log-symbols": "^2.2.0",
+        "micromatch": "^3.1.8",
+        "npm-which": "^3.0.1",
+        "p-map": "^1.1.1",
+        "path-is-inside": "^1.0.2",
+        "pify": "^3.0.0",
+        "please-upgrade-node": "^3.0.2",
+        "staged-git-files": "1.1.2",
+        "string-argv": "^0.0.2",
+        "stringify-object": "^3.2.2",
+        "yup": "^0.27.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "log-symbols": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+          "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.1"
+          }
+        },
+        "p-map": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+          "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "listr": {
+      "version": "0.14.3",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
+      "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
+      "dev": true,
+      "requires": {
+        "@samverschueren/stream-to-observable": "^0.3.0",
+        "is-observable": "^1.1.0",
+        "is-promise": "^2.1.0",
+        "is-stream": "^1.1.0",
+        "listr-silent-renderer": "^1.1.1",
+        "listr-update-renderer": "^0.5.0",
+        "listr-verbose-renderer": "^0.5.0",
+        "p-map": "^2.0.0",
+        "rxjs": "^6.3.3"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
+      "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "elegant-spinner": "^1.0.1",
+        "figures": "^1.7.0",
+        "indent-string": "^3.0.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^2.3.0",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "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"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5",
+            "object-assign": "^4.1.0"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "^1.0.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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
+      "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "cli-cursor": "^2.1.0",
+        "date-fns": "^1.27.2",
+        "figures": "^2.0.0"
+      },
+      "dependencies": {
+        "cli-cursor": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+          "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^2.0.0"
+          }
+        },
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "mimic-fn": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+          "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+          "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+          "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+          "dev": true,
+          "requires": {
+            "onetime": "^2.0.0",
+            "signal-exit": "^3.0.2"
+          }
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "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": "2.0.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      }
+    },
+    "localtunnel": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz",
+      "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==",
+      "dev": true,
+      "requires": {
+        "axios": "0.19.0",
+        "debug": "4.1.1",
+        "openurl": "1.1.1",
+        "yargs": "6.6.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+          "dev": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wrap-ansi": "^2.0.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "which-module": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "6.6.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+          "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^1.4.0",
+            "read-pkg-up": "^1.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^1.0.2",
+            "which-module": "^1.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^4.2.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.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==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
+    },
+    "lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+      "dev": true
+    },
+    "lodash.isfinite": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
+      "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.pad": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz",
+      "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=",
+      "dev": true
+    },
+    "lodash.padend": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+      "dev": true
+    },
+    "lodash.padstart": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz",
+      "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
+    },
+    "lodash.template": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.templatesettings": "^4.0.0"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0"
+      }
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+      "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2"
+      }
+    },
+    "log-update": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
+      "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.0.0",
+        "cli-cursor": "^2.0.0",
+        "wrap-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "cli-cursor": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+          "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^2.0.0"
+          }
+        },
+        "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
+        },
+        "mimic-fn": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+          "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+          "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+          "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+          "dev": true,
+          "requires": {
+            "onetime": "^2.0.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "wrap-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
+          "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0"
+          }
+        }
+      }
+    },
+    "logform": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz",
+      "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==",
+      "dev": true,
+      "requires": {
+        "colors": "^1.2.1",
+        "fast-safe-stringify": "^2.0.4",
+        "fecha": "^4.2.0",
+        "ms": "^2.1.1",
+        "triple-beam": "^1.3.0"
+      }
+    },
+    "loglevel": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
+      "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dev": true,
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "lower-case": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
+      "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "macos-release": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz",
+      "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==",
+      "dev": true
+    },
+    "magic-string": {
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+      "dev": true,
+      "requires": {
+        "sourcemap-codec": "^1.4.4"
+      }
+    },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dev": true,
+      "requires": {
+        "semver": "^6.0.0"
+      },
+      "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
+        }
+      }
+    },
+    "make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+      "dev": true
+    },
+    "make-fetch-happen": {
+      "version": "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
+        }
+      }
+    },
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "dev": true,
+      "requires": {
+        "tmpl": "1.0.x"
+      }
+    },
+    "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-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+      "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+      "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"
+      }
+    },
+    "matcher": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz",
+      "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.4"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz",
+      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.3",
+        "mimic-fn": "^2.1.0",
+        "p-is-promise": "^2.1.0"
+      }
+    },
+    "mem-fs": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.2.0.tgz",
+      "integrity": "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ==",
+      "dev": true,
+      "requires": {
+        "through2": "^3.0.0",
+        "vinyl": "^2.0.1",
+        "vinyl-file": "^3.0.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.4",
+            "readable-stream": "2 || 3"
+          }
+        }
+      }
+    },
+    "mem-fs-editor": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-6.0.0.tgz",
+      "integrity": "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "deep-extend": "^0.6.0",
+        "ejs": "^2.6.1",
+        "glob": "^7.1.4",
+        "globby": "^9.2.0",
+        "isbinaryfile": "^4.0.0",
+        "mkdirp": "^0.5.0",
+        "multimatch": "^4.0.0",
+        "rimraf": "^2.6.3",
+        "through2": "^3.0.1",
+        "vinyl": "^2.2.0"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+          "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+          "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"
+          }
+        },
+        "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"
+          }
+        },
+        "ejs": {
+          "version": "2.7.4",
+          "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+          "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+          "dev": true
+        },
+        "fast-glob": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+          "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+          "dev": true,
+          "requires": {
+            "@mrmlnc/readdir-enhanced": "^2.2.1",
+            "@nodelib/fs.stat": "^1.1.2",
+            "glob-parent": "^3.1.0",
+            "is-glob": "^4.0.0",
+            "merge2": "^1.2.3",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+              }
+            }
+          }
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+          "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "path-type": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "through2": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.4",
+            "readable-stream": "2 || 3"
+          }
+        }
+      }
+    },
+    "memory-fs": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
+      "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
+      "dev": true,
+      "requires": {
+        "@types/minimist": "^1.2.0",
+        "camelcase-keys": "^6.1.1",
+        "decamelize-keys": "^1.1.0",
+        "hard-rejection": "^2.0.0",
+        "minimist-options": "^4.0.1",
+        "normalize-package-data": "^2.5.0",
+        "read-pkg-up": "^7.0.0",
+        "redent": "^3.0.0",
+        "trim-newlines": "^3.0.0",
+        "type-fest": "^0.8.1",
+        "yargs-parser": "^18.1.1"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+              "dev": true
+            }
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "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-jsons-webpack-plugin": {
+      "version": "1.0.21",
+      "resolved": "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz",
+      "integrity": "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ==",
+      "dev": true,
+      "requires": {
+        "es6-promise": "4.0.5",
+        "glob": "7.1.1"
+      },
+      "dependencies": {
+        "es6-promise": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz",
+          "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=",
+          "dev": true
+        },
+        "glob": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+          "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+          "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"
+          }
+        }
+      }
+    },
+    "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
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "mime": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.44.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
+    },
+    "min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
+      "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "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": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "minimist-options": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
+      },
+      "dependencies": {
+        "arrify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+          "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
+        }
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+          "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+          "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+          "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "mitt": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
+      "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
+      "dev": true
+    },
+    "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.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "moment": {
+      "version": "2.27.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+      "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+    },
+    "moment-locales-webpack-plugin": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz",
+      "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==",
+      "dev": true,
+      "requires": {
+        "lodash.difference": "^4.5.0"
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "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
+    },
+    "multimatch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
+      "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "^3.0.3",
+        "array-differ": "^3.0.0",
+        "array-union": "^2.1.0",
+        "arrify": "^2.0.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": 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"
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "ng-jhipster": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/ng-jhipster/-/ng-jhipster-0.14.0.tgz",
+      "integrity": "sha512-f6S8gkGLVOLYcODykhhgGkqY3zTO/VIc2oavvkN8pg7BAqIwj7gkLjrPnYTF4IDH9taSDkkD+Oizp4XLPEEc4A==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "ngx-cookie-service": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-3.0.4.tgz",
+      "integrity": "sha512-g4KHpCWL2EtKatWqn8lz/DdyMQO8sDS7BNwCSvxF1ETTW5DPJnbdEwCjSdm84MmfqBh6JdgvoQd//rOxH5EbgQ=="
+    },
+    "ngx-infinite-scroll": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-9.0.0.tgz",
+      "integrity": "sha512-C8JhvrTip/AKv6f8oiB+GJjW+FGE3EPIc3Kk+v3MICGlW0nkOetyJDe/ejXr8tI8zwbNjbfvAKFRKenibDIW6w==",
+      "requires": {
+        "@scarf/scarf": "0.1.5",
+        "opencollective-postinstall": "^2.0.2"
+      }
+    },
+    "ngx-webstorage": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-5.0.0.tgz",
+      "integrity": "sha512-m96dBjUgLCpaknLRKfsJMEik393xrSX0EwO3paNSkS5d+xj2/cAendE3NwJeKY/W1D9EkKAhCvSUDX9/bAwCUg=="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "no-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
+      "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
+      "dev": true,
+      "requires": {
+        "lower-case": "^2.0.1",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "node-fetch-npm": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz",
+      "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==",
+      "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-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+      "dev": true
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "events": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+          "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+          "dev": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "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
+            }
+          }
+        }
+      }
+    },
+    "node-modules-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+      "dev": true
+    },
+    "node-notifier": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz",
+      "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "growly": "^1.3.0",
+        "is-wsl": "^2.2.0",
+        "semver": "^7.3.2",
+        "shellwords": "^0.1.1",
+        "uuid": "^8.3.0",
+        "which": "^2.0.2"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true,
+          "optional": true
+        },
+        "uuid": {
+          "version": "8.3.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+          "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
+          "dev": true,
+          "optional": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.60",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
+      "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
+      "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": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "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"
+      }
+    },
+    "npm-api": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/npm-api/-/npm-api-1.0.0.tgz",
+      "integrity": "sha512-gtJhIhGq07g9H5sIAB9TZzTySW8MYtcYqg+e+J+5q1GmDsDLLVfyvVBL1VklzjtRsElph11GUtLBS191RDOJxQ==",
+      "dev": true,
+      "requires": {
+        "JSONStream": "^1.3.5",
+        "clone-deep": "^4.0.1",
+        "download-stats": "^0.3.4",
+        "moment": "^2.24.0",
+        "paged-request": "^2.0.1",
+        "request": "^2.88.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-install-checks": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
+      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
+      "dev": true,
+      "requires": {
+        "semver": "^7.1.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "npm-normalize-package-bin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+      "dev": true
+    },
+    "npm-package-arg": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
+      "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^3.0.2",
+        "semver": "^7.0.0",
+        "validate-npm-package-name": "^3.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "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-path": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz",
+      "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==",
+      "dev": true,
+      "requires": {
+        "which": "^1.2.10"
+      }
+    },
+    "npm-pick-manifest": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz",
+      "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==",
+      "dev": true,
+      "requires": {
+        "npm-install-checks": "^4.0.0",
+        "npm-package-arg": "^8.0.0",
+        "semver": "^7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "npm-registry-fetch": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
+      "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==",
+      "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": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "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-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        },
+        "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=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npm-which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz",
+      "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=",
+      "dev": true,
+      "requires": {
+        "commander": "^2.9.0",
+        "npm-path": "^2.0.2",
+        "which": "^1.2.10"
+      }
+    },
+    "npmlog": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz",
+      "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=",
+      "dev": true,
+      "requires": {
+        "ansi": "~0.3.1",
+        "are-we-there-yet": "~1.1.2",
+        "gauge": "~1.2.5"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "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
+    },
+    "nwsapi": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-component": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-hash": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
+      "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+      "dev": true
+    },
+    "object-is": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+      "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-path": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
+      "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+      "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "one-time": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
+      "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=",
+      "dev": true
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "open": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz",
+      "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      }
+    },
+    "opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+    },
+    "opener": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
+      "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+      "dev": true
+    },
+    "openurl": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
+      "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+      "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "dev": true
+        }
+      }
+    },
+    "optimize-css-assets-webpack-plugin": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz",
+      "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==",
+      "dev": true,
+      "requires": {
+        "cssnano": "^4.1.10",
+        "last-call-webpack-plugin": "^3.0.0"
+      }
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "requires": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      }
+    },
+    "ora": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz",
+      "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.2.0",
+        "is-interactive": "^1.0.0",
+        "log-symbols": "^3.0.0",
+        "mute-stream": "0.0.8",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "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": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "^1.0.0"
+      }
+    },
+    "os-name": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz",
+      "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==",
+      "dev": true,
+      "requires": {
+        "macos-release": "^2.2.0",
+        "windows-release": "^3.1.0"
+      }
+    },
+    "os-shim": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+      "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=",
+      "dev": true
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-each-series": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz",
+      "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.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==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "dev": true,
+      "requires": {
+        "retry": "^0.12.0"
+      },
+      "dependencies": {
+        "retry": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+          "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+          "dev": true
+        }
+      }
+    },
+    "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=="
+    },
+    "pacote": {
+      "version": "9.5.12",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz",
+      "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.3",
+        "cacache": "^12.0.2",
+        "chownr": "^1.1.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-normalize-package-bin": "^1.0.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.1.12",
+        "npm-pick-manifest": "^3.0.0",
+        "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.10",
+        "unique-filename": "^1.1.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "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-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "paged-request": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/paged-request/-/paged-request-2.0.1.tgz",
+      "integrity": "sha512-C0bB/PFk9rQskD1YEiz7uuchzqKDQGgdsEHN1ahify0UUWzgmMK4NDG9fhlQg2waogmNFwEvEeHfMRvJySpdVw==",
+      "dev": true,
+      "requires": {
+        "axios": "^0.18.0"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.18.1",
+          "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz",
+          "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==",
+          "dev": true,
+          "requires": {
+            "follow-redirects": "1.5.10",
+            "is-buffer": "^2.0.2"
+          }
+        },
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "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"
+      }
+    },
+    "param-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
+      "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
+      "dev": true,
+      "requires": {
+        "dot-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-cache-control": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+      "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=",
+      "dev": true
+    },
+    "parse-gitignore": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz",
+      "integrity": "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A==",
+      "dev": true
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "parse-srcset": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
+      "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=",
+      "dev": true
+    },
+    "parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "dev": true
+    },
+    "parseqs": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+      "dev": true,
+      "requires": {
+        "better-assert": "~1.0.0"
+      }
+    },
+    "parseuri": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+      "dev": true,
+      "requires": {
+        "better-assert": "~1.0.0"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascal-case": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
+      "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "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": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
+    "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=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+    },
+    "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": "1.1.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pirates": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+      "dev": true,
+      "requires": {
+        "node-modules-regexp": "^1.0.0"
+      }
+    },
+    "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"
+      }
+    },
+    "pkg-up": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+      "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "please-upgrade-node": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+      "dev": true,
+      "requires": {
+        "semver-compare": "^1.0.0"
+      }
+    },
+    "plugin-error": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^1.0.1",
+        "arr-diff": "^4.0.0",
+        "arr-union": "^3.1.0",
+        "extend-shallow": "^3.0.2"
+      },
+      "dependencies": {
+        "ansi-colors": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+          "dev": true,
+          "requires": {
+            "ansi-wrap": "^0.1.0"
+          }
+        }
+      }
+    },
+    "pluralize": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+      "dev": true
+    },
+    "portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "portscanner": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz",
+      "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "is-number-like": "^1.0.3"
+      }
+    },
+    "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.32",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+      "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz",
+      "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-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"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+      "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.5"
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.1.1",
+        "postcss": "^7.0.32",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+      "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^6.0.0"
+      }
+    },
+    "postcss-modules-values": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+      "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.0.0",
+        "postcss": "^7.0.6"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+          "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+          "dev": true
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
+      "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "dev": true,
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
+      "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
+      "dev": true
+    },
+    "prettier-plugin-java": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-0.8.0.tgz",
+      "integrity": "sha512-+4qdhUfFQIj4bLGSDrAGmUZKXQRjJYpQFbmRh04atEZe7QEZUF6NHVyRjJ73Cgwhc5NaiyIpFhtcXgLf9J9V6A==",
+      "dev": true,
+      "requires": {
+        "java-parser": "^0.8.0",
+        "lodash": "4.17.15",
+        "prettier": "2.0.4"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "prettier": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz",
+          "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==",
+          "dev": true
+        }
+      }
+    },
+    "pretty-bytes": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
+      "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==",
+      "dev": true
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "dev": true,
+      "requires": {
+        "renderkid": "^2.0.1",
+        "utila": "~0.4"
+      }
+    },
+    "pretty-format": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
+      "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "ansi-regex": "^5.0.0",
+        "ansi-styles": "^4.0.0",
+        "react-is": "^16.12.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "promise": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+      "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+      "dev": true,
+      "requires": {
+        "asap": "~2.0.6"
+      }
+    },
+    "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"
+      }
+    },
+    "prompts": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
+      "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
+      "dev": true,
+      "requires": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.4"
+      }
+    },
+    "property-expr": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz",
+      "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==",
+      "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"
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "dev": true
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+      "dev": true
+    },
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "dev": true
+    },
+    "randexp": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz",
+      "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==",
+      "dev": true,
+      "requires": {
+        "drange": "^1.0.2",
+        "ret": "^0.2.0"
+      },
+      "dependencies": {
+        "ret": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
+          "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==",
+          "dev": true
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
+      "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.3",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "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"
+          }
+        }
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "read-chunk": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
+      "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==",
+      "dev": true,
+      "requires": {
+        "pify": "^4.0.1",
+        "with-open-file": "^0.1.6"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        }
+      }
+    },
+    "read-package-json": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz",
+      "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "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"
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdir-scoped-modules": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
+      "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
+      "dev": true,
+      "requires": {
+        "debuglog": "^1.0.1",
+        "dezalgo": "^1.0.0",
+        "graceful-fs": "^4.1.2",
+        "once": "^1.3.0"
+      }
+    },
+    "readdirp": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      }
+    },
+    "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.1",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+      "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.13.7",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+      "dev": true
+    },
+    "regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "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-to-ast": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+      "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==",
+      "dev": true
+    },
+    "regexp.prototype.flags": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
+      "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.2.0"
+      }
+    },
+    "regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+      "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
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "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
+    },
+    "renderkid": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
+      "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
+      "dev": true,
+      "requires": {
+        "css-select": "^1.1.0",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.3.0",
+        "strip-ansi": "^3.0.0",
+        "utila": "^0.4.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          },
+          "dependencies": {
+            "domelementtype": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+              "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+              "dev": true
+            },
+            "entities": {
+              "version": "2.0.3",
+              "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+              "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+              "dev": true
+            }
+          }
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+          "dev": true
+        },
+        "domhandler": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1"
+          }
+        },
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        },
+        "htmlparser2": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+          "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^1.3.1",
+            "domhandler": "^2.3.0",
+            "domutils": "^1.5.1",
+            "entities": "^1.1.1",
+            "inherits": "^2.0.1",
+            "readable-stream": "^3.1.1"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "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
+    },
+    "replace-ext": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+      "dev": true
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.4",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "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=="
+    },
+    "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.17.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
+      },
+      "dependencies": {
+        "global-modules": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+          "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+          "dev": true,
+          "requires": {
+            "global-prefix": "^1.0.1",
+            "is-windows": "^1.0.1",
+            "resolve-dir": "^1.0.0"
+          }
+        }
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "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
+    },
+    "resp-modifier": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
+      "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.2.0",
+        "minimatch": "^3.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "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.10.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+      "dev": true
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        }
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "rollup": {
+      "version": "1.32.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz",
+      "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "*",
+        "@types/node": "*",
+        "acorn": "^7.1.0"
+      }
+    },
+    "rollup-plugin-babel": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz",
+      "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "rollup-pluginutils": "^2.8.1"
+      }
+    },
+    "rollup-plugin-terser": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz",
+      "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "jest-worker": "^24.9.0",
+        "rollup-pluginutils": "^2.8.2",
+        "serialize-javascript": "^2.1.2",
+        "terser": "^4.6.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "rollup-pluginutils": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+      "dev": true,
+      "requires": {
+        "estree-walker": "^0.6.1"
+      },
+      "dependencies": {
+        "estree-walker": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+          "dev": true
+        }
+      }
+    },
+    "rsvp": {
+      "version": "4.8.5",
+      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
+      "dev": true
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "rx": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+      "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
+      "dev": true
+    },
+    "rxjs": {
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+      "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
+        }
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "sane": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+      "dev": true,
+      "requires": {
+        "@cnakazawa/watch": "^1.0.3",
+        "anymatch": "^2.0.0",
+        "capture-exit": "^2.0.0",
+        "exec-sh": "^0.3.2",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "sass": {
+      "version": "1.26.9",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz",
+      "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==",
+      "dev": true,
+      "requires": {
+        "chokidar": ">=2.0.0 <4.0.0"
+      }
+    },
+    "sass-loader": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
+      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.6.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "sax": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
+      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
+      "dev": true
+    },
+    "saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.2.0"
+      }
+    },
+    "schema-utils": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.4",
+        "ajv": "^6.12.2",
+        "ajv-keywords": "^3.4.1"
+      }
+    },
+    "scoped-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz",
+      "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=",
+      "dev": true
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "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.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+    },
+    "semver-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+      "dev": true
+    },
+    "semver-dsl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "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"
+      }
+    },
+    "semver-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
+      "dev": true
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "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.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.0",
+        "statuses": "~1.4.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        },
+        "statuses": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+      "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "server-destroy": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+      "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+      "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="
+    },
+    "set-getter": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+      "dev": true,
+      "requires": {
+        "to-object-path": "^0.3.0"
+      }
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
+      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
+    },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "simple-git": {
+      "version": "1.132.0",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz",
+      "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.0.1"
+      }
+    },
+    "simple-progress-webpack-plugin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/simple-progress-webpack-plugin/-/simple-progress-webpack-plugin-1.1.2.tgz",
+      "integrity": "sha512-bNQfb3qSqbtsfxg6d0dGechUUJH2lZqKG5+bj2aoJmEA0rSzcm+2JVfC2YgkDABfuGItZ/O5ttt6BssWZW4SNg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.3.x",
+        "figures": "2.0.x",
+        "log-update": "2.3.x"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+          "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        }
+      }
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+          "dev": true
+        }
+      }
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "smart-buffer": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
+      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "socket.io-adapter": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
+      "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==",
+      "dev": true
+    },
+    "socket.io-client": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
+      "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
+      "dev": true,
+      "requires": {
+        "backo2": "1.0.2",
+        "base64-arraybuffer": "0.1.5",
+        "component-bind": "1.0.0",
+        "component-emitter": "1.2.1",
+        "debug": "~4.1.0",
+        "engine.io-client": "~3.4.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.3.0",
+        "to-array": "0.1.4"
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
+      "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
+      "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
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.20",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+      "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.4.0",
+        "websocket-driver": "0.6.5"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "sockjs-client": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+      "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.5",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "~0.11.1",
+        "inherits": "^2.0.3",
+        "json3": "^3.3.2",
+        "url-parse": "^1.4.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.3",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+          "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        }
+      }
+    },
+    "socks": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz",
+      "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "smart-buffer": "^4.1.0"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "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": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.19",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "dev": true
+    },
+    "spawn-sync": {
+      "version": "1.0.15",
+      "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
+      "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.4.7",
+        "os-shim": "^0.1.2"
+      }
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "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.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "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.1.2",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dev": true,
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "ssri": {
+      "version": "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"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+      "dev": true
+    },
+    "stack-utils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz",
+      "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+          "dev": true
+        }
+      }
+    },
+    "stackframe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
+      "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==",
+      "dev": true
+    },
+    "staged-git-files": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz",
+      "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+      "dev": true
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+      "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
+    },
+    "stream-throttle": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
+      "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=",
+      "dev": true,
+      "requires": {
+        "commander": "^2.2.0",
+        "limiter": "^1.0.5"
+      }
+    },
+    "streamfilter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz",
+      "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^3.0.6"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string-argv": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz",
+      "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=",
+      "dev": true
+    },
+    "string-length": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
+      "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
+      "dev": true,
+      "requires": {
+        "char-regex": "^1.0.2",
+        "strip-ansi": "^6.0.0"
+      }
+    },
+    "string-template": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+      "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
+      "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==",
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "dev": true,
+      "requires": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "dependencies": {
+        "is-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+          "dev": true
+        }
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "requires": {
+        "ansi-regex": "^5.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-bom-buf": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz",
+      "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.1"
+      }
+    },
+    "strip-bom-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+      "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
+      "dev": true,
+      "requires": {
+        "first-chunk-stream": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "strip-comments": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
+      "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
+      "dev": true,
+      "requires": {
+        "babel-extract-comments": "^1.0.0",
+        "babel-plugin-transform-object-rest-spread": "^6.26.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+      "dev": true,
+      "requires": {
+        "min-indent": "^1.0.0"
+      }
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "style-loader": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz",
+      "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.6.6"
+      }
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-hyperlinks": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
+      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      },
+      "dependencies": {
+        "css-select": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+          "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0",
+            "css-what": "^3.2.1",
+            "domutils": "^1.7.0",
+            "nth-check": "^1.0.2"
+          }
+        },
+        "css-what": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
+          "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
+          "dev": true
+        },
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          },
+          "dependencies": {
+            "domelementtype": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+              "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+              "dev": true
+            }
+          }
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+          "dev": true
+        },
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+          "dev": true
+        }
+      }
+    },
+    "swagger-ui-dist": {
+      "version": "3.25.1",
+      "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.1.tgz",
+      "integrity": "sha512-Sw/K95j1pT9TZtLKiHDEml7YqcXC9thTTQjxrvNgd9j1KzOIxpo/5lhHuUMAN/hxVAHetzmcBcQaBjywRXog8w=="
+    },
+    "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
+    },
+    "symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true
+    },
+    "sync-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+      "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+      "dev": true,
+      "requires": {
+        "http-response-object": "^3.0.1",
+        "sync-rpc": "^1.2.1",
+        "then-request": "^6.0.0"
+      }
+    },
+    "sync-rpc": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+      "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+      "dev": true,
+      "requires": {
+        "get-port": "^3.1.0"
+      }
+    },
+    "synchronous-promise": {
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz",
+      "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==",
+      "dev": true
+    },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "tabtab": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz",
+      "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.2.0",
+        "inquirer": "^1.0.2",
+        "lodash.difference": "^4.5.0",
+        "lodash.uniq": "^4.5.0",
+        "minimist": "^1.2.0",
+        "mkdirp": "^0.5.1",
+        "npmlog": "^2.0.3",
+        "object-assign": "^4.1.0"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+          "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "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"
+          }
+        },
+        "cli-cursor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        },
+        "external-editor": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz",
+          "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=",
+          "dev": true,
+          "requires": {
+            "extend": "^3.0.0",
+            "spawn-sync": "^1.0.15",
+            "tmp": "^0.0.29"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5",
+            "object-assign": "^4.1.0"
+          }
+        },
+        "inquirer": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz",
+          "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^1.1.0",
+            "chalk": "^1.0.0",
+            "cli-cursor": "^1.0.1",
+            "cli-width": "^2.0.0",
+            "external-editor": "^1.1.0",
+            "figures": "^1.3.5",
+            "lodash": "^4.3.0",
+            "mute-stream": "0.0.6",
+            "pinkie-promise": "^2.0.0",
+            "run-async": "^2.2.0",
+            "rx": "^4.1.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.0",
+            "through": "^2.3.6"
+          }
+        },
+        "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "mute-stream": {
+          "version": "0.0.6",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz",
+          "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=",
+          "dev": true
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
+          "requires": {
+            "exit-hook": "^1.0.0",
+            "onetime": "^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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "tmp": {
+          "version": "0.0.29",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
+          "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "~1.0.1"
+          }
+        }
+      }
+    },
+    "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
+        }
+      }
+    },
+    "temp-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
+      "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=",
+      "dev": true
+    },
+    "tempy": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz",
+      "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==",
+      "dev": true,
+      "requires": {
+        "temp-dir": "^1.0.0",
+        "type-fest": "^0.3.1",
+        "unique-string": "^1.0.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+          "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+          "dev": true
+        }
+      }
+    },
+    "terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      }
+    },
+    "terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.6.tgz",
+      "integrity": "sha512-z3HLOOPUHkCNGkeEHqqiMAIy1pjpHwS1o+i6Zn0Ws3EAvHJj46737efNNEvJ0Vx9BdDQM83d56qySDJOSORA0A==",
+      "dev": true,
+      "requires": {
+        "cacache": "^15.0.4",
+        "find-cache-dir": "^3.3.1",
+        "jest-worker": "^26.0.0",
+        "p-limit": "^3.0.1",
+        "schema-utils": "^2.6.6",
+        "serialize-javascript": "^4.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.8.0",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "15.0.5",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+          "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
+          "dev": true,
+          "requires": {
+            "@npmcli/move-file": "^1.0.1",
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^6.0.0",
+            "minipass": "^3.1.1",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^1.0.3",
+            "p-map": "^4.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^3.0.2",
+            "ssri": "^8.0.0",
+            "tar": "^6.0.2",
+            "unique-filename": "^1.1.1"
+          }
+        },
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
+        "fs-minipass": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+          "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "minipass": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+          "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+          "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "serialize-javascript": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.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
+        },
+        "ssri": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
+          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.1.1"
+          }
+        },
+        "tar": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
+          "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
+          "dev": true,
+          "requires": {
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.0.0",
+            "minipass": "^3.0.0",
+            "minizlib": "^2.1.1",
+            "mkdirp": "^1.0.3",
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "test": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/test/-/test-0.6.0.tgz",
+      "integrity": "sha1-WYasRF7Bd1QyJRLRBLoyyKY+k44=",
+      "dev": true,
+      "requires": {
+        "ansi-font": "0.0.2"
+      }
+    },
+    "test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "dev": true,
+      "requires": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        }
+      }
+    },
+    "text-hex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+      "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+      "dev": true
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "textextensions": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz",
+      "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==",
+      "dev": true
+    },
+    "tfunk": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz",
+      "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.1",
+        "object-path": "^0.9.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "then-request": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+      "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+      "dev": true,
+      "requires": {
+        "@types/concat-stream": "^1.6.0",
+        "@types/form-data": "0.0.33",
+        "@types/node": "^8.0.0",
+        "@types/qs": "^6.2.31",
+        "caseless": "~0.12.0",
+        "concat-stream": "^1.6.0",
+        "form-data": "^2.2.0",
+        "http-basic": "^8.1.1",
+        "http-response-object": "^3.0.1",
+        "promise": "^8.0.0",
+        "qs": "^6.4.0"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "8.10.62",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz",
+          "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==",
+          "dev": true
+        }
+      }
+    },
+    "thread-loader": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
+      "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "throat": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+      "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=",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+      "dev": true
+    },
+    "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="
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "to-string-loader": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz",
+      "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true
+    },
+    "toposort": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+      "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dev": true,
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+      "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.1"
+      }
+    },
+    "trim-newlines": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+      "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+      "dev": true
+    },
+    "triple-beam": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+      "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==",
+      "dev": true
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+      "dev": true
+    },
+    "ts-jest": {
+      "version": "26.2.0",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.2.0.tgz",
+      "integrity": "sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA==",
+      "dev": true,
+      "requires": {
+        "@types/jest": "26.x",
+        "bs-logger": "0.x",
+        "buffer-from": "1.x",
+        "fast-json-stable-stringify": "2.x",
+        "jest-util": "26.x",
+        "json5": "2.x",
+        "lodash.memoize": "4.x",
+        "make-error": "1.x",
+        "mkdirp": "1.x",
+        "semver": "7.x",
+        "yargs-parser": "18.x"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "ts-loader": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz",
+      "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "enhanced-resolve": "^4.0.0",
+        "loader-utils": "^1.0.2",
+        "micromatch": "^4.0.0",
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "tslib": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
+      "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g=="
+    },
+    "tslint": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz",
+      "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "builtin-modules": "^1.1.1",
+        "chalk": "^2.3.0",
+        "commander": "^2.12.1",
+        "diff": "^4.0.1",
+        "glob": "^7.1.1",
+        "js-yaml": "^3.13.1",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.3",
+        "resolve": "^1.3.2",
+        "semver": "^5.3.0",
+        "tslib": "^1.10.0",
+        "tsutils": "^2.29.0"
+      },
+      "dependencies": {
+        "diff": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "tsutils": {
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true
+    },
+    "type-fest": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+      "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "3.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz",
+      "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==",
+      "dev": true
+    },
+    "ua-parser-js": {
+      "version": "0.7.17",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+      "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==",
+      "dev": true
+    },
+    "ultron": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+      "dev": true
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unique-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+      "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+      "dev": true,
+      "requires": {
+        "crypto-random-string": "^1.0.0"
+      }
+    },
+    "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"
+          }
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "untildify": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
+      "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==",
+      "dev": true
+    },
+    "unzip-response": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+      "dev": true
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
+      "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
+      "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": "1.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+      "dev": true,
+      "requires": {
+        "prepend-http": "^1.0.1"
+      }
+    },
+    "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
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "util-promisify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz",
+      "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=",
+      "dev": true,
+      "requires": {
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
+    },
+    "util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "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": "8.1.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
+      "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
+      "dev": true
+    },
+    "v8-compile-cache": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+      "dev": true
+    },
+    "v8-to-istanbul": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz",
+      "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^1.6.0",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "dev": true,
+      "requires": {
+        "builtins": "^1.0.3"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vinyl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+      "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.1",
+        "clone-buffer": "^1.0.0",
+        "clone-stats": "^1.0.0",
+        "cloneable-readable": "^1.0.0",
+        "remove-trailing-separator": "^1.0.1",
+        "replace-ext": "^1.0.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+          "dev": true
+        }
+      }
+    },
+    "vinyl-file": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz",
+      "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.3.0",
+        "strip-bom-buf": "^1.0.0",
+        "strip-bom-stream": "^2.0.0",
+        "vinyl": "^2.0.1"
+      }
+    },
+    "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
+    },
+    "w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "w3c-xmlserializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+      "dev": true,
+      "requires": {
+        "xml-name-validator": "^3.0.0"
+      }
+    },
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "dev": true,
+      "requires": {
+        "makeerror": "1.0.x"
+      }
+    },
+    "watchpack": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.0"
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true,
+          "optional": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "optional": 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,
+              "optional": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "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,
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "webidl-conversions": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+      "dev": true
+    },
+    "webpack": {
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz",
+      "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.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.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.6.1",
+        "webpack-sources": "^1.4.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+          "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+          "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "is-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "serialize-javascript": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.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
+        },
+        "terser-webpack-plugin": {
+          "version": "1.4.5",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+          "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+          "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": "^4.0.0",
+            "source-map": "^0.6.1",
+            "terser": "^4.1.2",
+            "webpack-sources": "^1.4.0",
+            "worker-farm": "^1.7.0"
+          }
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz",
+      "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1",
+        "bfj": "^6.1.1",
+        "chalk": "^2.4.1",
+        "commander": "^2.18.0",
+        "ejs": "^2.6.1",
+        "express": "^4.16.3",
+        "filesize": "^3.6.1",
+        "gzip-size": "^5.0.0",
+        "lodash": "^4.17.15",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "ejs": {
+          "version": "2.7.4",
+          "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+          "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-cli": {
+      "version": "3.3.12",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz",
+      "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cross-spawn": "^6.0.5",
+        "enhanced-resolve": "^4.1.1",
+        "findup-sync": "^3.0.0",
+        "global-modules": "^2.0.0",
+        "import-local": "^2.0.0",
+        "interpret": "^1.4.0",
+        "loader-utils": "^1.4.0",
+        "supports-color": "^6.1.0",
+        "v8-compile-cache": "^2.1.1",
+        "yargs": "^13.3.2"
+      },
+      "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
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+      "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "memory-fs": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+          "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        },
+        "mime": {
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+      "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
+      "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.3.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.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.7",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "0.3.20",
+        "sockjs-client": "1.4.0",
+        "spdy": "^4.0.2",
+        "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": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.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
+            },
+            "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"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          }
+        },
+        "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"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true
+        },
+        "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"
+              }
+            }
+          }
+        },
+        "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
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "is-absolute-url": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+          "dev": true
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-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-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"
+          }
+        },
+        "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-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "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
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          },
+          "dependencies": {
+            "glob": {
+              "version": "7.1.6",
+              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+              "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+              "dev": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "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"
+          },
+          "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
+            },
+            "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"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        },
+        "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"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.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
+            },
+            "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"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.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"
+      },
+      "dependencies": {
+        "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
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "webpack-notifier": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz",
+      "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==",
+      "dev": true,
+      "requires": {
+        "node-notifier": "^5.1.2",
+        "object-assign": "^4.1.0",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "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
+        },
+        "node-notifier": {
+          "version": "5.4.3",
+          "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz",
+          "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==",
+          "dev": true,
+          "requires": {
+            "growly": "^1.3.0",
+            "is-wsl": "^1.1.0",
+            "semver": "^5.5.0",
+            "shellwords": "^0.1.1",
+            "which": "^1.3.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"
+          }
+        }
+      }
+    },
+    "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
+        }
+      }
+    },
+    "websocket-driver": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+      "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
+      "dev": true,
+      "requires": {
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+      "dev": true
+    },
+    "whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.24"
+      },
+      "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"
+          }
+        }
+      }
+    },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz",
+      "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^2.0.2",
+        "webidl-conversions": "^5.0.0"
+      },
+      "dependencies": {
+        "webidl-conversions": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+          "dev": true
+        }
+      }
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "which-pm-runs": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+      "dev": true
+    },
+    "window-size": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+      "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=",
+      "dev": true
+    },
+    "windows-release": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz",
+      "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0"
+      }
+    },
+    "winston": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz",
+      "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.1",
+        "diagnostics": "^1.1.1",
+        "is-stream": "^1.1.0",
+        "logform": "^2.1.1",
+        "one-time": "0.0.4",
+        "readable-stream": "^3.1.1",
+        "stack-trace": "0.0.x",
+        "triple-beam": "^1.3.0",
+        "winston-transport": "^4.3.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "winston-transport": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
+      "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.3.7",
+        "triple-beam": "^1.2.0"
+      }
+    },
+    "with-open-file": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
+      "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==",
+      "dev": true,
+      "requires": {
+        "p-finally": "^1.0.0",
+        "p-try": "^2.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
+        }
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "workbox-background-sync": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.3.tgz",
+      "integrity": "sha512-V/R95aPxYjbKCaVzUTihrZ9ObGOnzoA5n60r0DQ747p8Pj15/dDTYixonKhhlvavTiNezUrp+wTQBvZvcd/ETA==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-broadcast-update": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.3.tgz",
+      "integrity": "sha512-HJ7FDmgweRcYp8fMiFbkmhaTjMYhMByURe5+TempnCi7cT5NNbyaG4T+rg8NWYxAeumSAB3JQF6XD/z34vRRHA==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-build": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.3.tgz",
+      "integrity": "sha512-cssa2cKAi/FNp2P2m2DjF/UsXlVX6b1HgkXOjBTraFkIeyZEKxN1F1DnxOpGkdM/bPPRa7y5OmUvjOpgOd9apA==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.8.4",
+        "@babel/preset-env": "^7.8.4",
+        "@babel/runtime": "^7.8.4",
+        "@hapi/joi": "^15.1.0",
+        "@rollup/plugin-node-resolve": "^7.1.1",
+        "@rollup/plugin-replace": "^2.3.1",
+        "@surma/rollup-plugin-off-main-thread": "^1.1.1",
+        "common-tags": "^1.8.0",
+        "fast-json-stable-stringify": "^2.1.0",
+        "fs-extra": "^8.1.0",
+        "glob": "^7.1.6",
+        "lodash.template": "^4.5.0",
+        "pretty-bytes": "^5.3.0",
+        "rollup": "^1.31.1",
+        "rollup-plugin-babel": "^4.3.3",
+        "rollup-plugin-terser": "^5.2.0",
+        "source-map": "^0.7.3",
+        "source-map-url": "^0.4.0",
+        "stringify-object": "^3.3.0",
+        "strip-comments": "^1.0.2",
+        "tempy": "^0.3.0",
+        "upath": "^1.2.0",
+        "workbox-background-sync": "^5.1.3",
+        "workbox-broadcast-update": "^5.1.3",
+        "workbox-cacheable-response": "^5.1.3",
+        "workbox-core": "^5.1.3",
+        "workbox-expiration": "^5.1.3",
+        "workbox-google-analytics": "^5.1.3",
+        "workbox-navigation-preload": "^5.1.3",
+        "workbox-precaching": "^5.1.3",
+        "workbox-range-requests": "^5.1.3",
+        "workbox-routing": "^5.1.3",
+        "workbox-strategies": "^5.1.3",
+        "workbox-streams": "^5.1.3",
+        "workbox-sw": "^5.1.3",
+        "workbox-window": "^5.1.3"
+      },
+      "dependencies": {
+        "@babel/core": {
+          "version": "7.11.4",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz",
+          "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.11.4",
+            "@babel/helper-module-transforms": "^7.11.0",
+            "@babel/helpers": "^7.10.4",
+            "@babel/parser": "^7.11.4",
+            "@babel/template": "^7.10.4",
+            "@babel/traverse": "^7.11.0",
+            "@babel/types": "^7.11.0",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.19",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "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
+            }
+          }
+        },
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "workbox-cacheable-response": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.3.tgz",
+      "integrity": "sha512-lOJEwK2T4KWFNdhRFUKxTPBIO5hIYm9E/nYgMq5h/IH3iHPHlBPuFwRMaQy+TTCGWWTA85NomQOjVw1bj65RLw==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-core": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.3.tgz",
+      "integrity": "sha512-TFSIPxxciX9sFaj0FDiohBeIKpwMcCyNduydi9i3LChItcndDS6TJpErxybv8aBWeCMraXt33TWtF6kKuIObNw==",
+      "dev": true
+    },
+    "workbox-expiration": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.3.tgz",
+      "integrity": "sha512-8YhpmIHqIx+xmtxONADc+di4a3zzCsvVHLiKq6T3vJZUPnqV2jzx+51+UHMUh3T5w5Z5SFC14l0V/jesRbuMKg==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-google-analytics": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.3.tgz",
+      "integrity": "sha512-ouK6xIJa+raFcO29TgwKFU/Hv1ejqSYzCzH9lI2B/4z/Wdnb8maL6mMIojQ8j5SohwKswMZmLDl0Az2PCmX11w==",
+      "dev": true,
+      "requires": {
+        "workbox-background-sync": "^5.1.3",
+        "workbox-core": "^5.1.3",
+        "workbox-routing": "^5.1.3",
+        "workbox-strategies": "^5.1.3"
+      }
+    },
+    "workbox-navigation-preload": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.3.tgz",
+      "integrity": "sha512-29SPQMAccOgbq3BT9Gz7k+ydy0mcKKR0Rmkmd46tnujutiL4ooE57fBhwsA+c6OlLcYdisvilKlV2YWEtKWfgQ==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-precaching": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.3.tgz",
+      "integrity": "sha512-9jjBiB00AOI0NnI320ddnhvlL3bjMrDoI3211kEaxcRWh0N2fX25uVn0O8N8u1gWY4tIfwZAn/DgtAU13cFhYA==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-range-requests": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.3.tgz",
+      "integrity": "sha512-uUvEoyEUx86LJc7mtmy/6U8xuK0guXU2FnPimt17zDbsC8FSOaPxc92rxtD6xmDSYrI4FqIebypBCjgIe+sfxA==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-routing": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.3.tgz",
+      "integrity": "sha512-F+sAp9Iy3lVl3BEG+pzXWVq4AftzjiFpHDaZ4Kf4vLoBoKQE0hIHet4zE5DpHqYdyw+Udhp4wrfHamX6PN6z1Q==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "workbox-strategies": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.3.tgz",
+      "integrity": "sha512-wiXHfmOKnWABeIVW+/ye0e00+2CcS5y7SIj2f9zcdy2ZLEbcOf7B+yOl5OrWpBGlTUwRjIYhV++ZqiKm3Dc+8w==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3",
+        "workbox-routing": "^5.1.3"
+      }
+    },
+    "workbox-streams": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.3.tgz",
+      "integrity": "sha512-8kt70eBd1RXL0qenxEnch3Cd7VyW3O0CkeGBN4Bikt307nIV5Q0JciLA5o0CRteijawYOiTq0/px4GDBv1obgQ==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3",
+        "workbox-routing": "^5.1.3"
+      }
+    },
+    "workbox-sw": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.3.tgz",
+      "integrity": "sha512-Syk6RhYr/8VdFwXrxo5IpVz8Og2xapHTWJhqsZRF+TbxSvlaJs8hrvVPd7edn5ZiiVdPhE9NTeOTOg1+D+FGoA==",
+      "dev": true
+    },
+    "workbox-webpack-plugin": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.3.tgz",
+      "integrity": "sha512-gxSkZ9GFLrMNC/8DGNRjcMhrt8iu+MMXhH/Fpo3wo9rKaSMsI7esGq0klTH/UloP9pNvBizVydysrB52eRhI7w==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "fast-json-stable-stringify": "^2.0.0",
+        "source-map-url": "^0.4.0",
+        "upath": "^1.1.2",
+        "webpack-sources": "^1.3.0",
+        "workbox-build": "^5.1.3"
+      }
+    },
+    "workbox-window": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.3.tgz",
+      "integrity": "sha512-oYvfVtPLET7FUrhOzbk0R+aATVmpdQBkmDqwyFH4W2dfVqJXTvTXzuGP5Pn9oZ8jMTB3AYW43yhYBlLYM3mYyg==",
+      "dev": true,
+      "requires": {
+        "workbox-core": "^5.1.3"
+      }
+    },
+    "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"
+      }
+    },
+    "wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      }
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "write-file-webpack-plugin": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.1.tgz",
+      "integrity": "sha512-AZ7qJUvhTCBiOtG21aFJUcNuLVo2FFM6JMGKvaUGAH+QDqQAp2iG0nq3GcuXmJOFQR2JjpjhyYkyPrbFKhdjNQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.0",
+        "debug": "^3.1.0",
+        "filesize": "^3.6.1",
+        "lodash": "^4.17.13",
+        "mkdirp": "^0.5.1",
+        "moment": "^2.22.1",
+        "write-file-atomic": "^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"
+          }
+        },
+        "write-file-atomic": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+          "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
+          }
+        }
+      }
+    },
+    "ws": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
+      "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+      "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
+      "dev": true
+    },
+    "xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+      "dev": true
+    },
+    "xml2js": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+      "dev": true,
+      "requires": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~9.0.1"
+      }
+    },
+    "xmlbuilder": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+      "dev": true
+    },
+    "xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "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=="
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "yaml": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+      "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+      "dev": true
+    },
+    "yargs": {
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
+      "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
+      "requires": {
+        "cliui": "^6.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^4.2.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.0"
+      }
+    },
+    "yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "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
+    },
+    "yeoman-environment": {
+      "version": "2.10.3",
+      "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.10.3.tgz",
+      "integrity": "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "debug": "^3.1.0",
+        "diff": "^3.5.0",
+        "escape-string-regexp": "^1.0.2",
+        "execa": "^4.0.0",
+        "globby": "^8.0.1",
+        "grouped-queue": "^1.1.0",
+        "inquirer": "^7.1.0",
+        "is-scoped": "^1.0.0",
+        "lodash": "^4.17.10",
+        "log-symbols": "^2.2.0",
+        "mem-fs": "^1.1.0",
+        "mem-fs-editor": "^6.0.0",
+        "npm-api": "^1.0.0",
+        "semver": "^7.1.3",
+        "strip-ansi": "^4.0.0",
+        "text-table": "^0.2.0",
+        "untildify": "^3.0.3",
+        "yeoman-generator": "^4.8.2"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+          "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "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"
+          }
+        },
+        "arrify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "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"
+          }
+        },
+        "dir-glob": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+          "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+          "dev": true,
+          "requires": {
+            "arrify": "^1.0.1",
+            "path-type": "^3.0.0"
+          }
+        },
+        "execa": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+          "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "fast-glob": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+          "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+          "dev": true,
+          "requires": {
+            "@mrmlnc/readdir-enhanced": "^2.2.1",
+            "@nodelib/fs.stat": "^1.1.2",
+            "glob-parent": "^3.1.0",
+            "is-glob": "^4.0.0",
+            "merge2": "^1.2.3",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.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"
+              }
+            }
+          }
+        },
+        "globby": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
+          "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "dir-glob": "2.0.0",
+            "fast-glob": "^2.0.2",
+            "glob": "^7.1.2",
+            "ignore": "^3.3.5",
+            "pify": "^3.0.0",
+            "slash": "^1.0.0"
+          }
+        },
+        "ignore": {
+          "version": "3.3.10",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+          "dev": true
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "log-symbols": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+          "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.1"
+          }
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "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"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "slash": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+          "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"
+          }
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "yeoman-generator": {
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-4.11.0.tgz",
+      "integrity": "sha512-++t6t2Z6HjL5F1/UM7+uNvGknKmQdF8tstJx8WKzsUSEpB+19kLVtapSfQIh9uWqm0L59fLWDzUui//WXoynPw==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "chalk": "^2.4.2",
+        "cli-table": "^0.3.1",
+        "cross-spawn": "^6.0.5",
+        "dargs": "^6.1.0",
+        "dateformat": "^3.0.3",
+        "debug": "^4.1.1",
+        "diff": "^4.0.1",
+        "error": "^7.0.2",
+        "find-up": "^3.0.0",
+        "github-username": "^3.0.0",
+        "grouped-queue": "^1.1.0",
+        "istextorbinary": "^2.5.1",
+        "lodash": "^4.17.11",
+        "make-dir": "^3.0.0",
+        "mem-fs-editor": "^7.0.1",
+        "minimist": "^1.2.5",
+        "pretty-bytes": "^5.2.0",
+        "read-chunk": "^3.2.0",
+        "read-pkg-up": "^5.0.0",
+        "rimraf": "^2.6.3",
+        "run-async": "^2.0.0",
+        "semver": "^7.2.1",
+        "shelljs": "^0.8.3",
+        "text-table": "^0.2.0",
+        "through2": "^3.0.1",
+        "yeoman-environment": "^2.9.5"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+          "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+          "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"
+          }
+        },
+        "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"
+          }
+        },
+        "diff": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "fast-glob": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+          "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+          "dev": true,
+          "requires": {
+            "@mrmlnc/readdir-enhanced": "^2.2.1",
+            "@nodelib/fs.stat": "^1.1.2",
+            "glob-parent": "^3.1.0",
+            "is-glob": "^4.0.0",
+            "merge2": "^1.2.3",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+              }
+            }
+          }
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+          "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "mem-fs-editor": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-7.0.1.tgz",
+          "integrity": "sha512-eD8r4/d2ayp9HHIgBPHB6Ds0ggA8F9cf9HxcNtbqrwqJXfIDrOSMG5K4fV3+Ib3B+HIdrWqkeDDDvrO7i9EbvQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "deep-extend": "^0.6.0",
+            "ejs": "^3.0.1",
+            "glob": "^7.1.4",
+            "globby": "^9.2.0",
+            "isbinaryfile": "^4.0.0",
+            "mkdirp": "^1.0.0",
+            "multimatch": "^4.0.0",
+            "rimraf": "^3.0.0",
+            "through2": "^3.0.1",
+            "vinyl": "^2.2.0"
+          },
+          "dependencies": {
+            "rimraf": {
+              "version": "3.0.2",
+              "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+              "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+              "dev": true,
+              "requires": {
+                "glob": "^7.1.3"
+              }
+            }
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "parse-json": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "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-type": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz",
+          "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0",
+            "read-pkg": "^5.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "through2": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+          "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.4",
+            "readable-stream": "2 || 3"
+          }
+        },
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        }
+      }
+    },
+    "yup": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz",
+      "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.0.0",
+        "fn-name": "~2.0.1",
+        "lodash": "^4.17.11",
+        "property-expr": "^1.5.0",
+        "synchronous-promise": "^2.0.6",
+        "toposort": "^2.0.2"
+      }
+    },
+    "zone.js": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
+      "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
+    }
+  }
+}
diff --git a/borestop/package.json b/borestop/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..644c8c578fc444142b25345271f88bfaea6146c0
--- /dev/null
+++ b/borestop/package.json
@@ -0,0 +1,124 @@
+{
+  "name": "borestop",
+  "version": "0.0.1-SNAPSHOT",
+  "description": "Description for borestop",
+  "private": true,
+  "license": "UNLICENSED",
+  "cacheDirectories": [
+    "node_modules"
+  ],
+  "dependencies": {
+    "@angular/common": "10.0.0",
+    "@angular/compiler": "10.0.0",
+    "@angular/core": "10.0.0",
+    "@angular/forms": "10.0.0",
+    "@angular/localize": "10.0.0",
+    "@angular/platform-browser": "10.0.0",
+    "@angular/platform-browser-dynamic": "10.0.0",
+    "@angular/router": "10.0.0",
+    "@fortawesome/angular-fontawesome": "0.6.1",
+    "@fortawesome/fontawesome-svg-core": "1.2.29",
+    "@fortawesome/free-solid-svg-icons": "5.13.1",
+    "@ng-bootstrap/ng-bootstrap": "6.1.0",
+    "@ngx-translate/core": "12.1.2",
+    "@ngx-translate/http-loader": "5.0.0",
+    "bootstrap": "4.5.0",
+    "moment": "2.27.0",
+    "ng-jhipster": "0.14.0",
+    "ngx-cookie-service": "3.0.4",
+    "ngx-infinite-scroll": "9.0.0",
+    "ngx-webstorage": "5.0.0",
+    "rxjs": "6.5.5",
+    "swagger-ui-dist": "3.25.1",
+    "tslib": "2.0.0",
+    "zone.js": "0.10.3"
+  },
+  "devDependencies": {
+    "@angular/cli": "10.0.0",
+    "@angular/compiler-cli": "10.0.0",
+    "@ngtools/webpack": "10.0.0",
+    "@openapitools/openapi-generator-cli": "1.0.13-4.3.1",
+    "@types/jest": "26.0.3",
+    "@types/node": "13.13.4",
+    "@typescript-eslint/eslint-plugin": "2.30.0",
+    "@typescript-eslint/eslint-plugin-tslint": "2.30.0",
+    "@typescript-eslint/parser": "2.30.0",
+    "autoprefixer": "9.8.4",
+    "browser-sync": "2.26.7",
+    "browser-sync-webpack-plugin": "2.2.2",
+    "codelyzer": "5.2.2",
+    "copy-webpack-plugin": "6.0.2",
+    "css-loader": "3.6.0",
+    "eslint": "6.8.0",
+    "eslint-config-jhipster": "0.0.1",
+    "eslint-config-prettier": "6.11.0",
+    "eslint-loader": "4.0.2",
+    "file-loader": "6.0.0",
+    "friendly-errors-webpack-plugin": "1.7.0",
+    "generator-jhipster": "6.10.1",
+    "html-loader": "1.1.0",
+    "html-webpack-plugin": "4.3.0",
+    "husky": "4.2.5",
+    "jest": "26.1.0",
+    "jest-date-mock": "1.0.8",
+    "jest-junit": "11.0.1",
+    "jest-preset-angular": "8.2.1",
+    "jest-sonar-reporter": "2.0.0",
+    "lint-staged": "8.2.1",
+    "merge-jsons-webpack-plugin": "1.0.21",
+    "mini-css-extract-plugin": "0.9.0",
+    "moment-locales-webpack-plugin": "1.2.0",
+    "optimize-css-assets-webpack-plugin": "5.0.3",
+    "postcss-loader": "3.0.0",
+    "prettier": "2.0.5",
+    "rimraf": "3.0.2",
+    "sass": "1.26.9",
+    "sass-loader": "8.0.2",
+    "simple-progress-webpack-plugin": "1.1.2",
+    "style-loader": "1.2.1",
+    "terser-webpack-plugin": "3.0.6",
+    "thread-loader": "2.1.3",
+    "to-string-loader": "1.1.6",
+    "ts-loader": "7.0.5",
+    "tslint": "6.1.2",
+    "typescript": "3.9.5",
+    "webpack": "4.43.0",
+    "webpack-bundle-analyzer": "3.8.0",
+    "webpack-cli": "3.3.12",
+    "webpack-dev-server": "3.11.0",
+    "webpack-merge": "4.2.2",
+    "webpack-notifier": "1.8.0",
+    "workbox-webpack-plugin": "5.1.3",
+    "write-file-webpack-plugin": "4.5.1"
+  },
+  "engines": {
+    "node": ">=12.16.1"
+  },
+  "scripts": {
+    "prettier:format": "prettier --write \"{,src/**/}*.{md,json,ts,css,scss,yml}\"",
+    "lint": "eslint . --ext .js,.ts",
+    "lint:fix": "npm run lint -- --fix",
+    "ngc": "ngc -p tsconfig.app.json",
+    "cleanup": "rimraf target/classes/static/",
+    "clean-www": "rimraf target/classes/static/app/{src,target/}",
+    "start": "npm run webpack:dev",
+    "start-tls": "npm run webpack:dev -- --env.tls",
+    "serve": "npm run start",
+    "build": "npm run webpack:prod",
+    "test": "npm run lint && jest --coverage --logHeapUsage -w=2 --config src/test/javascript/jest.conf.js",
+    "test:watch": "npm run test -- --watch",
+    "webpack:dev": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --env.stats=minimal",
+    "webpack:dev-verbose": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --profile --progress --env.stats=normal",
+    "webpack:build:main": "npm run webpack -- --config webpack/webpack.dev.js --env.stats=minimal",
+    "webpack:build": "npm run cleanup && npm run webpack:build:main",
+    "webpack:prod:main": "npm run webpack -- --config webpack/webpack.prod.js --profile",
+    "webpack:prod": "npm run cleanup && npm run webpack:prod:main && npm run clean-www",
+    "webpack:test": "npm run test",
+    "webpack-dev-server": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js",
+    "webpack": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack.js"
+  },
+  "jestSonar": {
+    "reportPath": "target/test-results/jest",
+    "reportFile": "TESTS-results-sonar.xml"
+  }
+}
diff --git a/borestop/pom.xml b/borestop/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9d3775754836b846d57d830d3db5f9cd5b32545c
--- /dev/null
+++ b/borestop/pom.xml
@@ -0,0 +1,1114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.ippon.borestop</groupId>
+    <artifactId>borestop</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Borestop</name>
+
+    <repositories>
+        <!-- jhipster-needle-maven-repository -->
+    </repositories>
+
+    <pluginRepositories>
+        <!-- jhipster-needle-maven-plugin-repository -->
+    </pluginRepositories>
+
+    <!-- jhipster-needle-distribution-management -->
+
+    <properties>
+        <!-- Build properties -->
+        <maven.version>3.3.9</maven.version>
+        <java.version>1.8</java.version>
+        <node.version>v12.16.1</node.version>
+        <npm.version>6.14.5</npm.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
+        <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
+        <maven.compiler.source>${java.version}</maven.compiler.source>
+        <maven.compiler.target>${java.version}</maven.compiler.target>
+        <argLine>-Djava.security.egd=file:/dev/./urandom -Xmx256m</argLine>
+        <m2e.apt.activation>jdt_apt</m2e.apt.activation>
+        <run.addResources>false</run.addResources>
+        <!-- These remain empty unless the corresponding profile is active -->
+        <profile.no-liquibase />
+        <profile.swagger />
+        <profile.tls />
+
+        <!-- Dependency versions -->
+        <jhipster-dependencies.version>3.9.0</jhipster-dependencies.version>
+        <!-- The spring-boot version should match the one managed by
+        https://mvnrepository.com/artifact/io.github.jhipster/jhipster-dependencies/${jhipster-dependencies.version} -->
+        <spring-boot.version>2.2.7.RELEASE</spring-boot.version>
+        <!-- The hibernate version should match the one managed by
+        https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} -->
+        <hibernate.version>5.4.15.Final</hibernate.version>
+        <!-- The javassist version should match the one managed by
+        https://mvnrepository.com/artifact/org.hibernate/hibernate-core/${hibernate.version} -->
+        <javassist.version>3.24.0-GA</javassist.version>
+        <!-- The liquibase version should match the one managed by
+        https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} -->
+        <liquibase.version>3.9.0</liquibase.version>
+        <liquibase-hibernate5.version>3.8</liquibase-hibernate5.version>
+        <h2.version>1.4.200</h2.version>
+        <validation-api.version>2.0.1.Final</validation-api.version>
+        <jaxb-runtime.version>2.3.3</jaxb-runtime.version>
+        <archunit-junit5.version>0.14.1</archunit-junit5.version>
+        <mapstruct.version>1.3.1.Final</mapstruct.version>
+        <!-- Plugin versions -->
+        <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
+        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+        <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
+        <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
+        <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version>
+        <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version>
+        <maven-idea-plugin.version>2.2.1</maven-idea-plugin.version>
+        <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
+        <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>
+        <maven-war-plugin.version>3.2.3</maven-war-plugin.version>
+        <maven-checkstyle.version>3.1.1</maven-checkstyle.version>
+        <checkstyle.version>8.32</checkstyle.version>
+        <spring-nohttp-checkstyle.version>0.0.4.RELEASE</spring-nohttp-checkstyle.version>
+        <frontend-maven-plugin.version>1.10.0</frontend-maven-plugin.version>
+        <git-commit-id-plugin.version>4.0.0</git-commit-id-plugin.version>
+        <jacoco-maven-plugin.version>0.8.5</jacoco-maven-plugin.version>
+        <jib-maven-plugin.version>2.4.0</jib-maven-plugin.version>
+        <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
+        <properties-maven-plugin.version>1.0.0</properties-maven-plugin.version>
+        <sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version>
+        <jacoco.utReportFolder>${project.build.directory}/jacoco/test</jacoco.utReportFolder>
+        <jacoco.utReportFile>${jacoco.utReportFolder}/test.exec</jacoco.utReportFile>
+        <jacoco.itReportFolder>${project.build.directory}/jacoco/integrationTest</jacoco.itReportFolder>
+        <jacoco.itReportFile>${jacoco.itReportFolder}/integrationTest.exec</jacoco.itReportFile>
+        <junit.utReportFolder>${project.testresult.directory}/test</junit.utReportFolder>
+        <junit.itReportFolder>${project.testresult.directory}/integrationTest</junit.itReportFolder>
+        <!-- jhipster-needle-maven-property -->
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.github.jhipster</groupId>
+                <artifactId>jhipster-dependencies</artifactId>
+                <version>${jhipster-dependencies.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <!-- jhipster-needle-maven-add-dependency-management -->
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.github.jhipster</groupId>
+            <artifactId>jhipster-framework</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-jaxb-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-hibernate5</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-hppc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-bean-validators</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>postgresql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-jpamodelgen</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.liquibase</groupId>
+            <artifactId>liquibase-core</artifactId>
+            <!-- Inherited version from Spring Boot can't be used because of regressions -->
+            <version>${liquibase.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-loader-tools</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.tngtech.archunit</groupId>
+            <artifactId>archunit-junit5-api</artifactId>
+            <version>${archunit-junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Adding the engine dependency to the surefire-plugin unfortunately does not work in the current version. -->
+        <!-- https://www.archunit.org/userguide/html/000_Index.html#_junit_5 -->
+        <dependency>
+            <groupId>com.tngtech.archunit</groupId>
+            <artifactId>archunit-junit5-engine</artifactId>
+            <version>${archunit-junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.zalando</groupId>
+            <artifactId>problem-spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <!-- Spring Cloud -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cloud-connectors</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-data</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+        </dependency>
+        <!-- jhipster-needle-maven-add-dependency -->
+    </dependencies>
+
+    <build>
+        <defaultGoal>spring-boot:run</defaultGoal>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-eclipse-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-idea-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.sonarsource.scanner.maven</groupId>
+                <artifactId>sonar-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.liquibase</groupId>
+                <artifactId>liquibase-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.google.cloud.tools</groupId>
+                <artifactId>jib-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>properties-maven-plugin</artifactId>
+            </plugin>
+            <!-- jhipster-needle-maven-add-plugin -->
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-checkstyle-plugin</artifactId>
+                    <version>${maven-checkstyle.version}</version>
+                    <dependencies>
+                        <dependency>
+                            <groupId>com.puppycrawl.tools</groupId>
+                            <artifactId>checkstyle</artifactId>
+                            <version>${checkstyle.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>io.spring.nohttp</groupId>
+                            <artifactId>nohttp-checkstyle</artifactId>
+                            <version>${spring-nohttp-checkstyle.version}</version>
+                        </dependency>
+                    </dependencies>
+                    <configuration>
+                        <configLocation>checkstyle.xml</configLocation>
+                        <includes>pom.xml,README.md</includes>
+                        <excludes>.git/**/*,target/**/*,node_modules/**/*,node/**/*</excludes>
+                        <sourceDirectories>./</sourceDirectories>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>check</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>${maven-compiler-plugin.version}</version>
+                    <configuration>
+                        <source>${java.version}</source>
+                        <target>${java.version}</target>
+                        <annotationProcessorPaths>
+                            <path>
+                                <groupId>org.springframework.boot</groupId>
+                                <artifactId>spring-boot-configuration-processor</artifactId>
+                                <version>${spring-boot.version}</version>
+                            </path>
+                            <path>
+                                <groupId>org.mapstruct</groupId>
+                                <artifactId>mapstruct-processor</artifactId>
+                                <version>${mapstruct.version}</version>
+                            </path>
+                            <!-- For JPA static metamodel generation -->
+                            <path>
+                                <groupId>org.hibernate</groupId>
+                                <artifactId>hibernate-jpamodelgen</artifactId>
+                                <version>${hibernate.version}</version>
+                            </path>
+                            <path>
+                                <groupId>org.glassfish.jaxb</groupId>
+                                <artifactId>jaxb-runtime</artifactId>
+                                <version>${jaxb-runtime.version}</version>
+                            </path>
+                            <!-- jhipster-needle-maven-add-annotation-processor -->
+                        </annotationProcessorPaths>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>${maven-javadoc-plugin.version}</version>
+                    <configuration>
+                        <source>${maven.compiler.source}</source>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>${maven-war-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <id>default-war</id>
+                            <goals>
+                                <goal>war</goal>
+                            </goals>
+                            <phase>package</phase>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <warSourceIncludes>WEB-INF/**,META-INF/**</warSourceIncludes>
+                        <failOnMissingWebXml>false</failOnMissingWebXml>
+                        <warSourceDirectory>target/classes/static/</warSourceDirectory>
+                        <webResources>
+                            <resource>
+                                <directory>src/main/webapp</directory>
+                                <includes>
+                                    <include>WEB-INF/**</include>
+                                </includes>
+                            </resource>
+                        </webResources>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>com.github.eirslett</groupId>
+                    <artifactId>frontend-maven-plugin</artifactId>
+                    <version>${frontend-maven-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>properties-maven-plugin</artifactId>
+                    <version>${properties-maven-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <phase>initialize</phase>
+                            <goals>
+                                <goal>read-project-properties</goal>
+                            </goals>
+                            <configuration>
+                                <files>
+                                    <file>sonar-project.properties</file>
+                                </files>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <plugin>
+                    <groupId>pl.project13.maven</groupId>
+                    <artifactId>git-commit-id-plugin</artifactId>
+                    <version>${git-commit-id-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>revision</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <failOnNoGitDirectory>false</failOnNoGitDirectory>
+                        <failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
+                        <generateGitPropertiesFile>true</generateGitPropertiesFile>
+                        <includeOnlyProperties>
+                            <includeOnlyProperty>^git.commit.id.abbrev$</includeOnlyProperty>
+                            <includeOnlyProperty>^git.commit.id.describe$</includeOnlyProperty>
+                            <includeOnlyProperty>^git.branch$</includeOnlyProperty>
+                        </includeOnlyProperties>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.jacoco</groupId>
+                    <artifactId>jacoco-maven-plugin</artifactId>
+                    <version>${jacoco-maven-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <id>pre-unit-tests</id>
+                            <goals>
+                                <goal>prepare-agent</goal>
+                            </goals>
+                            <configuration>
+                                <!-- Sets the path to the file which contains the execution data. -->
+                                <destFile>${jacoco.utReportFile}</destFile>
+                            </configuration>
+                        </execution>
+                        <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run -->
+                        <execution>
+                            <id>post-unit-test</id>
+                            <phase>test</phase>
+                            <goals>
+                                <goal>report</goal>
+                            </goals>
+                            <configuration>
+                                <dataFile>${jacoco.utReportFile}</dataFile>
+                                <outputDirectory>${jacoco.utReportFolder}</outputDirectory>
+                            </configuration>
+                        </execution>
+                        <execution>
+                            <id>pre-integration-tests</id>
+                            <goals>
+                                <goal>prepare-agent-integration</goal>
+                            </goals>
+                            <configuration>
+                                <!-- Sets the path to the file which contains the execution data. -->
+                                <destFile>${jacoco.itReportFile}</destFile>
+                            </configuration>
+                        </execution>
+                        <!-- Ensures that the code coverage report for integration tests is created after integration tests have been run -->
+                        <execution>
+                            <id>post-integration-tests</id>
+                            <phase>post-integration-test</phase>
+                            <goals>
+                                <goal>report-integration</goal>
+                            </goals>
+                            <configuration>
+                                <dataFile>${jacoco.itReportFile}</dataFile>
+                                <outputDirectory>${jacoco.itReportFolder}</outputDirectory>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>com.google.cloud.tools</groupId>
+                    <artifactId>jib-maven-plugin</artifactId>
+                    <version>${jib-maven-plugin.version}</version>
+                    <configuration>
+                        <from>
+                            <image>adoptopenjdk:11-jre-hotspot</image>
+                        </from>
+                        <to>
+                            <image>borestop:latest</image>
+                        </to>
+                        <container>
+                            <entrypoint>
+                                <shell>bash</shell>
+                                <option>-c</option>
+                                <arg>/entrypoint.sh</arg>
+                            </entrypoint>
+                            <ports>
+                                <port>8080</port>
+                            </ports>
+                            <environment>
+                                <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED>
+                                <JHIPSTER_SLEEP>0</JHIPSTER_SLEEP>
+                            </environment>
+                            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
+                        </container>
+                        <extraDirectories>
+                            <paths>src/main/jib</paths>
+                            <permissions>
+                                <permission>
+                                    <file>/entrypoint.sh</file>
+                                    <mode>755</mode>
+                                </permission>
+                            </permissions>
+                        </extraDirectories>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.liquibase</groupId>
+                    <artifactId>liquibase-maven-plugin</artifactId>
+                    <version>${liquibase.version}</version>
+                    <configuration>
+                        <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile>
+                        <diffChangeLogFile>${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
+                        <driver>org.h2.Driver</driver>
+                        <url>jdbc:h2:file:${project.build.directory}/h2db/db/borestop</url>
+                        <defaultSchemaName></defaultSchemaName>
+                        <username>borestop</username>
+                        <password></password>
+                        <referenceUrl>hibernate:spring:com.ippon.borestop.domain?dialect=org.hibernate.dialect.H2Dialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
+                        <verbose>true</verbose>
+                        <logging>debug</logging>
+                        <contexts>!test</contexts>
+                    </configuration>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.liquibase</groupId>
+                            <artifactId>liquibase-core</artifactId>
+                            <version>${liquibase.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.liquibase.ext</groupId>
+                            <artifactId>liquibase-hibernate5</artifactId>
+                            <version>${liquibase-hibernate5.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.springframework.boot</groupId>
+                            <artifactId>spring-boot-starter-data-jpa</artifactId>
+                            <version>${spring-boot.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>javax.validation</groupId>
+                            <artifactId>validation-api</artifactId>
+                            <version>${validation-api.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>org.javassist</groupId>
+                            <artifactId>javassist</artifactId>
+                            <version>${javassist.version}</version>
+                        </dependency>
+                        <dependency>
+                            <groupId>com.h2database</groupId>
+                            <artifactId>h2</artifactId>
+                            <version>${h2.version}</version>
+                        </dependency>
+                    </dependencies>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>${maven-clean-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-eclipse-plugin</artifactId>
+                    <version>${maven-eclipse-plugin.version}</version>
+                    <configuration>
+                        <downloadSources>true</downloadSources>
+                        <downloadJavadocs>true</downloadJavadocs>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-enforcer-plugin</artifactId>
+                    <version>${maven-enforcer-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <id>enforce-versions</id>
+                            <goals>
+                                <goal>enforce</goal>
+                            </goals>
+                        </execution>
+                        <execution>
+                            <id>enforce-dependencyConvergence</id>
+                            <configuration>
+                                <rules>
+                                    <DependencyConvergence />
+                                </rules>
+                                <fail>false</fail>
+                            </configuration>
+                            <goals>
+                                <goal>enforce</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <rules>
+                            <requireMavenVersion>
+                                <message>You are running an older version of Maven. JHipster requires at least Maven ${maven.version}</message>
+                                <version>[${maven.version},)</version>
+                            </requireMavenVersion>
+                            <requireJavaVersion>
+                                <message>You are running an incompatible version of Java. JHipster supports JDK 8 to 14.</message>
+                                <version>[1.8,15)</version>
+                            </requireJavaVersion>
+                        </rules>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-idea-plugin</artifactId>
+                    <version>${maven-idea-plugin.version}</version>
+                    <configuration>
+                        <exclude>node_modules</exclude>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>${maven-resources-plugin.version}</version>
+                    <executions>
+                        <execution>
+                            <id>default-resources</id>
+                            <phase>validate</phase>
+                            <goals>
+                                <goal>copy-resources</goal>
+                            </goals>
+                            <configuration>
+                                <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                                <useDefaultDelimiters>false</useDefaultDelimiters>
+                                <delimiters>
+                                    <delimiter>#</delimiter>
+                                </delimiters>
+                                <resources>
+                                    <resource>
+                                        <directory>src/main/resources/</directory>
+                                        <filtering>true</filtering>
+                                        <includes>
+                                            <include>config/*.yml</include>
+                                        </includes>
+                                    </resource>
+                                    <resource>
+                                        <directory>src/main/resources/</directory>
+                                        <filtering>false</filtering>
+                                        <excludes>
+                                            <exclude>config/*.yml</exclude>
+                                        </excludes>
+                                    </resource>
+                                </resources>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${maven-surefire-plugin.version}</version>
+                    <configuration>
+                        <!-- Force alphabetical order to have a reproducible build -->
+                        <runOrder>alphabetical</runOrder>
+                        <reportsDirectory>${junit.utReportFolder}</reportsDirectory>
+                        <excludes>
+                            <exclude>**/*IT*</exclude>
+                            <exclude>**/*IntTest*</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-failsafe-plugin</artifactId>
+                    <version>${maven-failsafe-plugin.version}</version>
+                    <configuration>
+                        <!-- Due to spring-boot repackage, without adding this property test classes are not found
+                             See https://github.com/spring-projects/spring-boot/issues/6254 -->
+                        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
+                        <!-- Force alphabetical order to have a reproducible build -->
+                        <runOrder>alphabetical</runOrder>
+                        <reportsDirectory>${junit.itReportFolder}</reportsDirectory>
+                        <includes>
+                            <include>**/*IT*</include>
+                            <include>**/*IntTest*</include>
+                        </includes>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>integration-test</id>
+                            <goals>
+                                <goal>integration-test</goal>
+                            </goals>
+                        </execution>
+                        <execution>
+                            <id>verify</id>
+                            <goals>
+                                <goal>verify</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.sonarsource.scanner.maven</groupId>
+                    <artifactId>sonar-maven-plugin</artifactId>
+                    <version>${sonar-maven-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-maven-plugin</artifactId>
+                    <version>${spring-boot.version}</version>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>repackage</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <mainClass>${start-class}</mainClass>
+                        <fork>true</fork>
+                        <!--
+                        Enable the line below to have remote debugging of your application on port 5005
+                        <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments>
+                        -->
+                    </configuration>
+
+                </plugin>
+                <!-- jhipster-needle-maven-add-plugin-management -->
+            </plugins>
+        </pluginManagement>
+    </build>
+    <profiles>
+        <profile>
+            <id>no-liquibase</id>
+            <properties>
+                <profile.no-liquibase>,no-liquibase</profile.no-liquibase>
+            </properties>
+        </profile>
+        <profile>
+            <id>swagger</id>
+            <properties>
+                <profile.swagger>,swagger</profile.swagger>
+            </properties>
+        </profile>
+        <profile>
+            <id>tls</id>
+            <properties>
+                <profile.tls>,tls</profile.tls>
+            </properties>
+        </profile>
+        <profile>
+            <id>webpack</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>com.h2database</groupId>
+                    <artifactId>h2</artifactId>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>com.github.eirslett</groupId>
+                        <artifactId>frontend-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>install node and npm</id>
+                                <goals>
+                                    <goal>install-node-and-npm</goal>
+                                </goals>
+                                <configuration>
+                                    <nodeVersion>${node.version}</nodeVersion>
+                                    <npmVersion>${npm.version}</npmVersion>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>npm install</id>
+                                <goals>
+                                    <goal>npm</goal>
+                                </goals>
+                            </execution>
+                            <execution>
+                                <id>webpack build dev</id>
+                                <goals>
+                                    <goal>npm</goal>
+                                </goals>
+                                <phase>generate-resources</phase>
+                                <configuration>
+                                    <arguments>run webpack:build</arguments>
+                                    <environmentVariables>
+                                        <APP_VERSION>${project.version}</APP_VERSION>
+                                    </environmentVariables>
+                                    <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <properties>
+                <!-- default Spring profiles -->
+                <spring.profiles.active>dev${profile.no-liquibase}</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-undertow</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-devtools</artifactId>
+                    <optional>true</optional>
+                </dependency>
+                <dependency>
+                    <groupId>com.h2database</groupId>
+                    <artifactId>h2</artifactId>
+                </dependency>
+            </dependencies>
+            <properties>
+                <!-- default Spring profiles -->
+                <spring.profiles.active>dev${profile.tls}${profile.no-liquibase}</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-undertow</artifactId>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-clean-plugin</artifactId>
+                        <configuration>
+                            <filesets>
+                                <fileset>
+                                    <directory>target/classes/static/</directory>
+                                </fileset>
+                            </filesets>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.springframework.boot</groupId>
+                        <artifactId>spring-boot-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>build-info</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>com.github.eirslett</groupId>
+                        <artifactId>frontend-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>install node and npm</id>
+                                <goals>
+                                    <goal>install-node-and-npm</goal>
+                                </goals>
+                                <configuration>
+                                    <nodeVersion>${node.version}</nodeVersion>
+                                    <npmVersion>${npm.version}</npmVersion>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>npm install</id>
+                                <goals>
+                                    <goal>npm</goal>
+                                </goals>
+                                <configuration>
+                                    <arguments>install</arguments>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>webpack build test</id>
+                                <goals>
+                                    <goal>npm</goal>
+                                </goals>
+                                <phase>test</phase>
+                                <configuration>
+                                    <arguments>run webpack:test</arguments>
+                                    <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>webpack build prod</id>
+                                <goals>
+                                    <goal>npm</goal>
+                                </goals>
+                                <phase>generate-resources</phase>
+                                <configuration>
+                                    <arguments>run webpack:prod</arguments>
+                                    <environmentVariables>
+                                        <APP_VERSION>${project.version}</APP_VERSION>
+                                    </environmentVariables>
+                                    <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>pl.project13.maven</groupId>
+                        <artifactId>git-commit-id-plugin</artifactId>
+                    </plugin>
+                </plugins>
+            </build>
+            <properties>
+                <!-- default Spring profiles -->
+                <spring.profiles.active>prod${profile.swagger}${profile.tls}${profile.no-liquibase}</spring.profiles.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>war</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-war-plugin</artifactId>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <!--
+                Profile for applying IDE-specific configuration.
+                At the moment it configures MapStruct and Hibernate JPA Metamodel Generator, which you need when working
+                with DTOs and entity filtering.
+            -->
+            <id>IDE</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.mapstruct</groupId>
+                    <artifactId>mapstruct-processor</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.hibernate</groupId>
+                    <artifactId>hibernate-jpamodelgen</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+        <profile>
+            <!-- This is automatically activated when working in Eclipse -->
+            <id>eclipse</id>
+            <activation>
+                <property>
+                    <name>m2e.version</name>
+                </property>
+            </activation>
+            <dependencies>
+                <!-- The following dependency is added due to issue #9175-->
+                <dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-undertow</artifactId>
+                </dependency>
+            </dependencies>
+            <build>
+                <pluginManagement>
+                    <plugins>
+                        <!--
+                            This plugin's configuration is used to store Eclipse m2e settings only.
+                            It has no influence on the Maven build itself.
+                            Remove when the m2e plugin can correctly bind to Maven lifecycle
+                        -->
+                        <plugin>
+                            <groupId>org.eclipse.m2e</groupId>
+                            <artifactId>lifecycle-mapping</artifactId>
+                            <version>${lifecycle-mapping.version}</version>
+                            <configuration>
+                                <lifecycleMappingMetadata>
+                                    <pluginExecutions>
+                                        <pluginExecution>
+                                            <pluginExecutionFilter>
+                                                <groupId>org.jacoco</groupId>
+                                                <artifactId>
+                                                    jacoco-maven-plugin
+                                                </artifactId>
+                                                <versionRange>
+                                                    ${jacoco-maven-plugin.version}
+                                                </versionRange>
+                                                <goals>
+                                                    <goal>prepare-agent</goal>
+                                                </goals>
+                                            </pluginExecutionFilter>
+                                            <action>
+                                                <ignore/>
+                                            </action>
+                                        </pluginExecution>
+                                        <pluginExecution>
+                                            <pluginExecutionFilter>
+                                                <groupId>com.github.eirslett</groupId>
+                                                <artifactId>frontend-maven-plugin</artifactId>
+                                                <versionRange>${frontend-maven-plugin.version}</versionRange>
+                                                <goals>
+                                                    <goal>install-node-and-npm</goal>
+                                                    <goal>npm</goal>
+                                                </goals>
+                                            </pluginExecutionFilter>
+                                            <action>
+                                                <ignore/>
+                                            </action>
+                                        </pluginExecution>
+                                    </pluginExecutions>
+                                </lifecycleMappingMetadata>
+                            </configuration>
+                        </plugin>
+                    </plugins>
+                </pluginManagement>
+            </build>
+        </profile>
+        <!-- jhipster-needle-maven-add-profile -->
+    </profiles>
+</project>
diff --git a/borestop/postcss.config.js b/borestop/postcss.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0f214d58f29f748facb7b881b7a717982c1c8a1
--- /dev/null
+++ b/borestop/postcss.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+  plugins: [require('autoprefixer')]
+};
diff --git a/borestop/proxy.conf.json b/borestop/proxy.conf.json
new file mode 100644
index 0000000000000000000000000000000000000000..3bfe56a3ce74f44d1ba41b2f6af563e791b0b9b0
--- /dev/null
+++ b/borestop/proxy.conf.json
@@ -0,0 +1,7 @@
+{
+  "*": {
+    "target": "http://localhost:8080",
+    "secure": false,
+    "loglevel": "debug"
+  }
+}
diff --git a/borestop/sonar-project.properties b/borestop/sonar-project.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4f82e483570628c59ad48a07ab000b39b654d517
--- /dev/null
+++ b/borestop/sonar-project.properties
@@ -0,0 +1,33 @@
+sonar.projectKey=borestop
+sonar.projectName=borestop generated by jhipster
+sonar.projectVersion=1.0
+
+sonar.sources=src/main/
+sonar.host.url=http://localhost:9001
+
+sonar.tests=src/test/
+sonar.coverage.jacoco.xmlReportPaths=target/jacoco/test/jacoco.xml,target/jacoco/integrationTest/jacoco.xml
+sonar.java.codeCoveragePlugin=jacoco
+sonar.junit.reportPaths=target/test-results/test,target/test-results/integrationTest
+sonar.testExecutionReportPaths=target/test-results/jest/TESTS-results-sonar.xml
+sonar.typescript.lcov.reportPaths=target/test-results/lcov.info
+
+sonar.sourceEncoding=UTF-8
+sonar.exclusions=src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/classes/static/**/*.*
+
+sonar.issue.ignore.multicriteria=S3437,S4502,S4684,UndocumentedApi,BoldAndItalicTagsCheck
+# Rule https://sonarcloud.io/coding_rules?open=squid%3AS3437&rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient
+sonar.issue.ignore.multicriteria.S3437.resourceKey=src/main/java/**/*
+sonar.issue.ignore.multicriteria.S3437.ruleKey=squid:S3437
+# Rule https://sonarcloud.io/coding_rules?open=squid%3AUndocumentedApi&rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names should be self-explanatory
+sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey=src/main/java/**/*
+sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey=squid:UndocumentedApi
+# Rule https://sonarcloud.io/coding_rules?open=squid%3AS4502&rule_key=squid%3AS4502 is ignored, as for JWT tokens we are not subject to CSRF attack
+sonar.issue.ignore.multicriteria.S4502.resourceKey=src/main/java/**/*
+sonar.issue.ignore.multicriteria.S4502.ruleKey=squid:S4502
+# Rule https://sonarcloud.io/coding_rules?open=java%3AS4684&rule_key=java%3AS4684
+sonar.issue.ignore.multicriteria.S4684.resourceKey=src/main/java/**/*
+sonar.issue.ignore.multicriteria.S4684.ruleKey=java:S4684
+# Rule https://sonarcloud.io/coding_rules?open=Web%3ABoldAndItalicTagsCheck&rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is recommended by http://fontawesome.io/examples/
+sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey=src/main/webapp/app/**/*.*
+sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey=Web:BoldAndItalicTagsCheck
diff --git a/borestop/src/main/docker/app.yml b/borestop/src/main/docker/app.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e864d8b4e9b1f37fd181b6e4e9ee99f1e7261422
--- /dev/null
+++ b/borestop/src/main/docker/app.yml
@@ -0,0 +1,16 @@
+version: '2'
+services:
+  borestop-app:
+    image: borestop
+    environment:
+      - _JAVA_OPTIONS=-Xmx512m -Xms256m
+      - SPRING_PROFILES_ACTIVE=prod,swagger
+      - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true
+      - SPRING_DATASOURCE_URL=jdbc:postgresql://borestop-postgresql:5432/borestop
+      - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application
+    ports:
+      - 8080:8080
+  borestop-postgresql:
+    extends:
+      file: postgresql.yml
+      service: borestop-postgresql
diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json
new file mode 100644
index 0000000000000000000000000000000000000000..5104abcdb90953caea0e888b536dd7ad02cf6b1b
--- /dev/null
+++ b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json
@@ -0,0 +1,3778 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "limit": 100,
+        "name": "Annotations & Alerts",
+        "showIn": 0,
+        "type": "dashboard"
+      },
+      {
+        "datasource": "Prometheus",
+        "enable": true,
+        "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0",
+        "iconColor": "rgba(255, 96, 96, 1)",
+        "name": "Restart Detection",
+        "showIn": 0,
+        "step": "1m",
+        "tagKeys": "restart-tag",
+        "textFormat": "uptime reset",
+        "titleFormat": "Restart"
+      }
+    ]
+  },
+  "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)",
+  "editable": true,
+  "gnetId": 4701,
+  "graphTooltip": 1,
+  "iteration": 1553765841423,
+  "links": [],
+  "panels": [
+    {
+      "content": "\n# Acknowledgments\n\nThank you to [Michael Weirauch](https://twitter.com/emwexx) for creating this dashboard: see original JVM (Micrometer) dashboard at [https://grafana.com/dashboards/4701](https://grafana.com/dashboards/4701)\n\n\n\n",
+      "gridPos": {
+        "h": 3,
+        "w": 24,
+        "x": 0,
+        "y": 0
+      },
+      "id": 141,
+      "links": [],
+      "mode": "markdown",
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "Acknowledgments",
+      "type": "text"
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 3
+      },
+      "id": 125,
+      "panels": [],
+      "repeat": null,
+      "title": "Quick Facts",
+      "type": "row"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"],
+      "datasource": "Prometheus",
+      "decimals": 1,
+      "editable": true,
+      "error": false,
+      "format": "s",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 0,
+        "y": 4
+      },
+      "height": "",
+      "id": 63,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "70%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "process_uptime_seconds{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "metric": "",
+          "refId": "A",
+          "step": 14400
+        }
+      ],
+      "thresholds": "",
+      "title": "Uptime",
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"],
+      "datasource": "Prometheus",
+      "decimals": null,
+      "editable": true,
+      "error": false,
+      "format": "dateTimeAsIso",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 6,
+        "y": 4
+      },
+      "height": "",
+      "id": 92,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "70%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "process_start_time_seconds{application=\"$application\", instance=\"$instance\"}*1000",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "metric": "",
+          "refId": "A",
+          "step": 14400
+        }
+      ],
+      "thresholds": "",
+      "title": "Start time",
+      "type": "singlestat",
+      "valueFontSize": "70%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"],
+      "datasource": "Prometheus",
+      "decimals": 2,
+      "editable": true,
+      "error": false,
+      "format": "percent",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 12,
+        "y": 4
+      },
+      "id": 65,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "70%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "refId": "A",
+          "step": 14400
+        }
+      ],
+      "thresholds": "70,90",
+      "title": "Heap used",
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"],
+      "datasource": "Prometheus",
+      "decimals": 2,
+      "editable": true,
+      "error": false,
+      "format": "percent",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 18,
+        "y": 4
+      },
+      "id": 75,
+      "interval": null,
+      "links": [],
+      "mappingType": 2,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "70%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        },
+        {
+          "from": "-99999999999999999999999999999999",
+          "text": "N/A",
+          "to": "0"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "refId": "A",
+          "step": 14400
+        }
+      ],
+      "thresholds": "70,90",
+      "title": "Non-Heap used",
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        },
+        {
+          "op": "=",
+          "text": "x",
+          "value": ""
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 7
+      },
+      "id": 126,
+      "panels": [],
+      "repeat": null,
+      "title": "I/O Overview",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 0,
+        "y": 8
+      },
+      "id": 111,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\"}[1m]))",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "HTTP",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Rate",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "decimals": null,
+          "format": "ops",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {
+        "HTTP": "#890f02",
+        "HTTP - 5xx": "#bf1b00"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 8,
+        "y": 8
+      },
+      "id": 112,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status=~\"5..\"}[1m]))",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "HTTP - 5xx",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Errors",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "decimals": null,
+          "format": "ops",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 16,
+        "y": 8
+      },
+      "id": 113,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(rate(http_server_requests_seconds_sum{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "HTTP - AVG",
+          "refId": "A"
+        },
+        {
+          "expr": "max(http_server_requests_seconds_max{application=\"$application\", instance=\"$instance\", status!~\"5..\"})",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "HTTP - MAX",
+          "refId": "B"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Duration",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "s",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 15
+      },
+      "id": 127,
+      "panels": [],
+      "repeat": null,
+      "title": "JVM Memory",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 0,
+        "y": 16
+      },
+      "id": 24,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "committed",
+          "refId": "B",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "refId": "C",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "JVM Heap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 8,
+        "y": 16
+      },
+      "id": 25,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "committed",
+          "refId": "B",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "refId": "C",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "JVM Non-Heap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 16,
+        "y": 16
+      },
+      "id": 26,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "committed",
+          "refId": "B",
+          "step": 2400
+        },
+        {
+          "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "refId": "C",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_vss_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": true,
+          "intervalFactor": 2,
+          "legendFormat": "vss",
+          "metric": "",
+          "refId": "D",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_rss_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "rss",
+          "refId": "E",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "pss",
+          "refId": "F",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "swap",
+          "refId": "G",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_swappss_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "swappss",
+          "refId": "H",
+          "step": 2400
+        },
+        {
+          "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"} + process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "phys (pss+swap)",
+          "refId": "I",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "JVM Total",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 23
+      },
+      "id": 128,
+      "panels": [],
+      "repeat": null,
+      "title": "JVM Misc",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 0,
+        "y": 24
+      },
+      "id": 106,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "system",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "process",
+          "refId": "B"
+        },
+        {
+          "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "process-1h",
+          "refId": "C"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "CPU",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 1,
+          "format": "percentunit",
+          "label": "",
+          "logBase": 1,
+          "max": "1",
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 6,
+        "y": 24
+      },
+      "id": 93,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "system-1m",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "refId": "B"
+        },
+        {
+          "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "cpu",
+          "refId": "C"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Load",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 1,
+          "format": "short",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 12,
+        "y": 24
+      },
+      "id": 32,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_threads_live{application=\"$application\", instance=\"$instance\"} or jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "live",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "jvm_threads_daemon{application=\"$application\", instance=\"$instance\"} or jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "daemon",
+          "metric": "",
+          "refId": "B",
+          "step": 2400
+        },
+        {
+          "expr": "jvm_threads_peak{application=\"$application\", instance=\"$instance\"} or jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "peak",
+          "refId": "C",
+          "step": 2400
+        },
+        {
+          "expr": "process_threads{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "process",
+          "refId": "D",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Threads",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 0,
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {
+        "blocked": "#bf1b00",
+        "new": "#fce2de",
+        "runnable": "#7eb26d",
+        "terminated": "#511749",
+        "timed-waiting": "#c15c17",
+        "waiting": "#eab839"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 18,
+        "y": 24
+      },
+      "id": 124,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "{{state}}",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Thread States",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {
+        "debug": "#1F78C1",
+        "error": "#BF1B00",
+        "info": "#508642",
+        "trace": "#6ED0E0",
+        "warn": "#EAB839"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 18,
+        "x": 0,
+        "y": 31
+      },
+      "height": "",
+      "id": 91,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "hideEmpty": false,
+        "hideZero": false,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": true,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [
+        {
+          "alias": "error",
+          "yaxis": 1
+        },
+        {
+          "alias": "warn",
+          "yaxis": 1
+        }
+      ],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "increase(logback_events_total{application=\"$application\", instance=\"$instance\"}[1m])",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "{{level}}",
+          "metric": "",
+          "refId": "A",
+          "step": 1200
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Log Events (1m)",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 0,
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 18,
+        "y": 31
+      },
+      "id": 61,
+      "legend": {
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "process_open_fds{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 2,
+          "legendFormat": "open",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "process_max_fds{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "B",
+          "step": 2400
+        },
+        {
+          "expr": "process_files_open{application=\"$application\", instance=\"$instance\"} or process_files_open_files{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "open",
+          "refId": "C"
+        },
+        {
+          "expr": "process_files_max{application=\"$application\", instance=\"$instance\"} or process_files_max_files{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "refId": "D"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "File Descriptors",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 0,
+          "format": "short",
+          "label": null,
+          "logBase": 10,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 38
+      },
+      "id": 129,
+      "panels": [],
+      "repeat": "persistence_counts",
+      "title": "JVM Memory Pools (Heap)",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 0,
+        "y": 39
+      },
+      "id": 3,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": "jvm_memory_pool_heap",
+      "scopedVars": {
+        "jvm_memory_pool_heap": {
+          "selected": false,
+          "text": "PS Eden Space",
+          "value": "PS Eden Space"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_heap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 8,
+        "y": 39
+      },
+      "id": 134,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": null,
+      "repeatIteration": 1553765841423,
+      "repeatPanelId": 3,
+      "scopedVars": {
+        "jvm_memory_pool_heap": {
+          "selected": false,
+          "text": "PS Old Gen",
+          "value": "PS Old Gen"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_heap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 16,
+        "y": 39
+      },
+      "id": 135,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": null,
+      "repeatIteration": 1553765841423,
+      "repeatPanelId": 3,
+      "scopedVars": {
+        "jvm_memory_pool_heap": {
+          "selected": false,
+          "text": "PS Survivor Space",
+          "value": "PS Survivor Space"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_heap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 46
+      },
+      "id": 130,
+      "panels": [],
+      "repeat": null,
+      "title": "JVM Memory Pools (Non-Heap)",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 0,
+        "y": 47
+      },
+      "id": 78,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": "jvm_memory_pool_nonheap",
+      "scopedVars": {
+        "jvm_memory_pool_nonheap": {
+          "selected": false,
+          "text": "Metaspace",
+          "value": "Metaspace"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_nonheap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 8,
+        "y": 47
+      },
+      "id": 136,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": null,
+      "repeatIteration": 1553765841423,
+      "repeatPanelId": 78,
+      "scopedVars": {
+        "jvm_memory_pool_nonheap": {
+          "selected": false,
+          "text": "Compressed Class Space",
+          "value": "Compressed Class Space"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_nonheap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 16,
+        "y": 47
+      },
+      "id": 137,
+      "legend": {
+        "alignAsTable": false,
+        "avg": false,
+        "current": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "maxPerRow": 3,
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": null,
+      "repeatIteration": 1553765841423,
+      "repeatPanelId": 78,
+      "scopedVars": {
+        "jvm_memory_pool_nonheap": {
+          "selected": false,
+          "text": "Code Cache",
+          "value": "Code Cache"
+        }
+      },
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "commited",
+          "metric": "",
+          "refId": "B",
+          "step": 1800
+        },
+        {
+          "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "max",
+          "metric": "",
+          "refId": "C",
+          "step": 1800
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "$jvm_memory_pool_nonheap",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["mbytes", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 54
+      },
+      "id": 131,
+      "panels": [],
+      "repeat": null,
+      "title": "Garbage Collection",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 0,
+        "y": 55
+      },
+      "id": 98,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 2,
+          "legendFormat": "{{action}} ({{cause}})",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Collections",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "ops",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 8,
+        "y": 55
+      },
+      "id": 101,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])",
+          "format": "time_series",
+          "hide": false,
+          "instant": false,
+          "intervalFactor": 1,
+          "legendFormat": "avg {{action}} ({{cause}})",
+          "refId": "A"
+        },
+        {
+          "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "hide": false,
+          "instant": false,
+          "intervalFactor": 1,
+          "legendFormat": "max {{action}} ({{cause}})",
+          "refId": "B"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Pause Durations",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "s",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 7,
+        "w": 8,
+        "x": 16,
+        "y": 55
+      },
+      "id": 99,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "allocated",
+          "refId": "A"
+        },
+        {
+          "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "promoted",
+          "refId": "B"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Allocated/Promoted",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 62
+      },
+      "id": 132,
+      "panels": [],
+      "repeat": null,
+      "title": "Classloading",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 0,
+        "y": 63
+      },
+      "id": 37,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_classes_loaded{application=\"$application\", instance=\"$instance\"} or jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "loaded",
+          "metric": "",
+          "refId": "A",
+          "step": 1200
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Classes loaded",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 12,
+        "y": 63
+      },
+      "id": 38,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "delta(jvm_classes_loaded{application=\"$application\",instance=\"$instance\"}[5m]) or delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[5m])",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 2,
+          "legendFormat": "delta",
+          "metric": "",
+          "refId": "A",
+          "step": 1200
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Class delta (5m)",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["ops", "short"],
+      "yaxes": [
+        {
+          "decimals": null,
+          "format": "short",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 70
+      },
+      "id": 133,
+      "panels": [],
+      "repeat": null,
+      "title": "Buffer Pools",
+      "type": "row"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 0,
+        "y": 71
+      },
+      "id": 33,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "capacity",
+          "metric": "",
+          "refId": "B",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Direct Buffers",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 6,
+        "y": 71
+      },
+      "id": 83,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"direct\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "count",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Direct Buffers",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 0,
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 12,
+        "y": 71
+      },
+      "id": 85,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "used",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        },
+        {
+          "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "capacity",
+          "metric": "",
+          "refId": "B",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Mapped Buffers",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "Prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "grid": {
+        "leftLogBase": 1,
+        "leftMax": null,
+        "leftMin": null,
+        "rightLogBase": 1,
+        "rightMax": null,
+        "rightMin": null
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 18,
+        "y": 71
+      },
+      "id": 84,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "paceLength": 10,
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"mapped\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}",
+          "format": "time_series",
+          "intervalFactor": 2,
+          "legendFormat": "count",
+          "metric": "",
+          "refId": "A",
+          "step": 2400
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Mapped Buffers",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "x-axis": true,
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "y-axis": true,
+      "y_formats": ["short", "short"],
+      "yaxes": [
+        {
+          "decimals": 0,
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": 0,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    }
+  ],
+  "refresh": "10s",
+  "schemaVersion": 18,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": [
+      {
+        "allValue": null,
+        "current": {
+          "text": "test",
+          "value": "test"
+        },
+        "datasource": "Prometheus",
+        "definition": "",
+        "hide": 0,
+        "includeAll": false,
+        "label": "Application",
+        "multi": false,
+        "name": "application",
+        "options": [],
+        "query": "label_values(application)",
+        "refresh": 2,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 0,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allFormat": "glob",
+        "allValue": null,
+        "current": {
+          "text": "localhost:8080",
+          "value": "localhost:8080"
+        },
+        "datasource": "Prometheus",
+        "definition": "",
+        "hide": 0,
+        "includeAll": false,
+        "label": "Instance",
+        "multi": false,
+        "multiFormat": "glob",
+        "name": "instance",
+        "options": [],
+        "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)",
+        "refresh": 2,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 0,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allFormat": "glob",
+        "allValue": null,
+        "current": {
+          "text": "All",
+          "value": "$__all"
+        },
+        "datasource": "Prometheus",
+        "definition": "",
+        "hide": 0,
+        "includeAll": true,
+        "label": "JVM Memory Pools Heap",
+        "multi": false,
+        "multiFormat": "glob",
+        "name": "jvm_memory_pool_heap",
+        "options": [],
+        "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)",
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 1,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allFormat": "glob",
+        "allValue": null,
+        "current": {
+          "text": "All",
+          "value": "$__all"
+        },
+        "datasource": "Prometheus",
+        "definition": "",
+        "hide": 0,
+        "includeAll": true,
+        "label": "JVM Memory Pools Non-Heap",
+        "multi": false,
+        "multiFormat": "glob",
+        "name": "jvm_memory_pool_nonheap",
+        "options": [],
+        "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)",
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 2,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      }
+    ]
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {
+    "now": true,
+    "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"],
+    "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
+  },
+  "timezone": "browser",
+  "title": "JVM (Micrometer)",
+  "uid": "Ud1CFe3iz",
+  "version": 1
+}
diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4817a83a5edef41d6ab96885d54d417f5cf80426
--- /dev/null
+++ b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml
@@ -0,0 +1,11 @@
+apiVersion: 1
+
+providers:
+  - name: 'Prometheus'
+    orgId: 1
+    folder: ''
+    type: file
+    disableDeletion: false
+    editable: true
+    options:
+      path: /etc/grafana/provisioning/dashboards
diff --git a/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml
new file mode 100644
index 0000000000000000000000000000000000000000..57b2bb3eafdfb8a4356a4bbb7dba77439db8ea90
--- /dev/null
+++ b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml
@@ -0,0 +1,50 @@
+apiVersion: 1
+
+# list of datasources that should be deleted from the database
+deleteDatasources:
+  - name: Prometheus
+    orgId: 1
+
+# list of datasources to insert/update depending
+# whats available in the database
+datasources:
+  # <string, required> name of the datasource. Required
+  - name: Prometheus
+    # <string, required> datasource type. Required
+    type: prometheus
+    # <string, required> access mode. direct or proxy. Required
+    access: proxy
+    # <int> org id. will default to orgId 1 if not specified
+    orgId: 1
+    # <string> url
+    # On MacOS, replace localhost by host.docker.internal
+    url: http://localhost:9090
+    # <string> database password, if used
+    password:
+    # <string> database user, if used
+    user:
+    # <string> database name, if used
+    database:
+    # <bool> enable/disable basic auth
+    basicAuth: false
+    # <string> basic auth username
+    basicAuthUser: admin
+    # <string> basic auth password
+    basicAuthPassword: admin
+    # <bool> enable/disable with credentials headers
+    withCredentials:
+    # <bool> mark as default datasource. Max one per org
+    isDefault: true
+    # <map> fields that will be converted to json and stored in json_data
+    jsonData:
+      graphiteVersion: '1.1'
+      tlsAuth: false
+      tlsAuthWithCACert: false
+    # <string> json object of data that will be encrypted.
+    secureJsonData:
+      tlsCACert: '...'
+      tlsClientCert: '...'
+      tlsClientKey: '...'
+    version: 1
+    # <bool> allow users to edit datasources from the UI.
+    editable: true
diff --git a/borestop/src/main/docker/monitoring.yml b/borestop/src/main/docker/monitoring.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bac6b99c844e06fd5114ea124049b2d7b4d2ce0f
--- /dev/null
+++ b/borestop/src/main/docker/monitoring.yml
@@ -0,0 +1,26 @@
+version: '2'
+services:
+  borestop-prometheus:
+    image: prom/prometheus:v2.18.1
+    volumes:
+      - ./prometheus/:/etc/prometheus/
+    command:
+      - '--config.file=/etc/prometheus/prometheus.yml'
+    ports:
+      - 9090:9090
+    # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and
+    # grafana/provisioning/datasources/datasource.yml
+    network_mode: 'host' # to test locally running service
+  borestop-grafana:
+    image: grafana/grafana:7.0.1
+    volumes:
+      - ./grafana/provisioning/:/etc/grafana/provisioning/
+    environment:
+      - GF_SECURITY_ADMIN_PASSWORD=admin
+      - GF_USERS_ALLOW_SIGN_UP=false
+      - GF_INSTALL_PLUGINS=grafana-piechart-panel
+    ports:
+      - 3000:3000
+    # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and
+    # grafana/provisioning/datasources/datasource.yml
+    network_mode: 'host' # to test locally running service
diff --git a/borestop/src/main/docker/postgresql.yml b/borestop/src/main/docker/postgresql.yml
new file mode 100644
index 0000000000000000000000000000000000000000..21dfb387e303775bfb84bdced78dc8f92035fb74
--- /dev/null
+++ b/borestop/src/main/docker/postgresql.yml
@@ -0,0 +1,12 @@
+version: '2'
+services:
+  borestop-postgresql:
+    image: postgres:12.3
+    # volumes:
+    #     - ~/volumes/jhipster/borestop/postgresql/:/var/lib/postgresql/data/
+    environment:
+      - POSTGRES_USER=borestop
+      - POSTGRES_PASSWORD=
+      - POSTGRES_HOST_AUTH_METHOD=trust
+    ports:
+      - 5432:5432
diff --git a/borestop/src/main/docker/prometheus/prometheus.yml b/borestop/src/main/docker/prometheus/prometheus.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b370a2f49569ece2402b1601f9d0511c43081fab
--- /dev/null
+++ b/borestop/src/main/docker/prometheus/prometheus.yml
@@ -0,0 +1,31 @@
+# Sample global config for monitoring JHipster applications
+global:
+  scrape_interval: 15s # By default, scrape targets every 15 seconds.
+  evaluation_interval: 15s # By default, scrape targets every 15 seconds.
+  # scrape_timeout is set to the global default (10s).
+
+  # Attach these labels to any time series or alerts when communicating with
+  # external systems (federation, remote storage, Alertmanager).
+  external_labels:
+    monitor: 'jhipster'
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
+  - job_name: 'prometheus'
+
+    # Override the global default and scrape targets from this job every 5 seconds.
+    scrape_interval: 5s
+
+    # scheme defaults to 'http' enable https in case your application is server via https
+    #scheme: https
+    # basic auth is not needed by default. See https://www.jhipster.tech/monitoring/#configuring-metrics-forwarding for details
+    #basic_auth:
+    # username: admin
+    # password: admin
+    metrics_path: /management/prometheus
+    static_configs:
+      - targets:
+          # On MacOS, replace localhost by host.docker.internal
+          - localhost:8080
diff --git a/borestop/src/main/docker/sonar.yml b/borestop/src/main/docker/sonar.yml
new file mode 100644
index 0000000000000000000000000000000000000000..001568b473827791b670b0fd92112472df76ec8f
--- /dev/null
+++ b/borestop/src/main/docker/sonar.yml
@@ -0,0 +1,7 @@
+version: '2'
+services:
+  borestop-sonar:
+    image: sonarqube:8.3.1-community
+    ports:
+      - 9001:9000
+      - 9092:9092
diff --git a/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce00b43981d62e1342f90c579f401e345e27b694
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java
@@ -0,0 +1,19 @@
+package com.ippon.borestop;
+
+import io.github.jhipster.config.DefaultProfileUtil;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * This is a helper Java class that provides an alternative to creating a {@code web.xml}.
+ * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc.
+ */
+public class ApplicationWebXml extends SpringBootServletInitializer {
+
+  @Override
+  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+    // set a default to use when no profile is configured.
+    DefaultProfileUtil.addDefaultProfile(application.application());
+    return application.sources(BorestopApp.class);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/BorestopApp.java b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java
new file mode 100644
index 0000000000000000000000000000000000000000..015bb8093fa43831e47bc5d4bd413e6ef68092fc
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java
@@ -0,0 +1,104 @@
+package com.ippon.borestop;
+
+import com.ippon.borestop.config.ApplicationProperties;
+import io.github.jhipster.config.DefaultProfileUtil;
+import io.github.jhipster.config.JHipsterConstants;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collection;
+import javax.annotation.PostConstruct;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.core.env.Environment;
+
+@SpringBootApplication
+@EnableConfigurationProperties({ LiquibaseProperties.class, ApplicationProperties.class })
+public class BorestopApp {
+  private static final Logger log = LoggerFactory.getLogger(BorestopApp.class);
+
+  private final Environment env;
+
+  public BorestopApp(Environment env) {
+    this.env = env;
+  }
+
+  /**
+   * Initializes borestop.
+   * <p>
+   * Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile
+   * <p>
+   * You can find more information on how profiles work with JHipster on <a href="https://www.jhipster.tech/profiles/">https://www.jhipster.tech/profiles/</a>.
+   */
+  @PostConstruct
+  public void initApplication() {
+    Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles());
+    if (
+      activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) &&
+      activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)
+    ) {
+      log.error(
+        "You have misconfigured your application! It should not run " + "with both the 'dev' and 'prod' profiles at the same time."
+      );
+    }
+    if (
+      activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) &&
+      activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD)
+    ) {
+      log.error(
+        "You have misconfigured your application! It should not " + "run with both the 'dev' and 'cloud' profiles at the same time."
+      );
+    }
+  }
+
+  /**
+   * Main method, used to run the application.
+   *
+   * @param args the command line arguments.
+   */
+  public static void main(String[] args) {
+    SpringApplication app = new SpringApplication(BorestopApp.class);
+    DefaultProfileUtil.addDefaultProfile(app);
+    Environment env = app.run(args).getEnvironment();
+    logApplicationStartup(env);
+  }
+
+  private static void logApplicationStartup(Environment env) {
+    String protocol = "http";
+    if (env.getProperty("server.ssl.key-store") != null) {
+      protocol = "https";
+    }
+    String serverPort = env.getProperty("server.port");
+    String contextPath = env.getProperty("server.servlet.context-path");
+    if (StringUtils.isBlank(contextPath)) {
+      contextPath = "/";
+    }
+    String hostAddress = "localhost";
+    try {
+      hostAddress = InetAddress.getLocalHost().getHostAddress();
+    } catch (UnknownHostException e) {
+      log.warn("The host name could not be determined, using `localhost` as fallback");
+    }
+    log.info(
+      "\n----------------------------------------------------------\n\t" +
+      "Application '{}' is running! Access URLs:\n\t" +
+      "Local: \t\t{}://localhost:{}{}\n\t" +
+      "External: \t{}://{}:{}{}\n\t" +
+      "Profile(s): \t{}\n----------------------------------------------------------",
+      env.getProperty("spring.application.name"),
+      protocol,
+      serverPort,
+      contextPath,
+      protocol,
+      hostAddress,
+      serverPort,
+      contextPath,
+      env.getActiveProfiles()
+    );
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..df71391a5dab74e7dffc424ba64b4a0c92cb8264
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java
@@ -0,0 +1,108 @@
+package com.ippon.borestop.aop.logging;
+
+import io.github.jhipster.config.JHipsterConstants;
+import java.util.Arrays;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.Profiles;
+
+/**
+ * Aspect for logging execution of service and repository Spring components.
+ *
+ * By default, it only runs with the "dev" profile.
+ */
+@Aspect
+public class LoggingAspect {
+  private final Environment env;
+
+  public LoggingAspect(Environment env) {
+    this.env = env;
+  }
+
+  /**
+   * Pointcut that matches all repositories, services and Web REST endpoints.
+   */
+  @Pointcut(
+    "within(@org.springframework.stereotype.Repository *)" +
+    " || within(@org.springframework.stereotype.Service *)" +
+    " || within(@org.springframework.web.bind.annotation.RestController *)"
+  )
+  public void springBeanPointcut() {
+    // Method is empty as this is just a Pointcut, the implementations are in the advices.
+  }
+
+  /**
+   * Pointcut that matches all Spring beans in the application's main packages.
+   */
+  @Pointcut(
+    "within(com.ippon.borestop.repository..*)" + " || within(com.ippon.borestop.service..*)" + " || within(com.ippon.borestop.web.rest..*)"
+  )
+  public void applicationPackagePointcut() {
+    // Method is empty as this is just a Pointcut, the implementations are in the advices.
+  }
+
+  /**
+   * Retrieves the {@link Logger} associated to the given {@link JoinPoint}.
+   *
+   * @param joinPoint join point we want the logger for.
+   * @return {@link Logger} associated to the given {@link JoinPoint}.
+   */
+  private Logger logger(JoinPoint joinPoint) {
+    return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName());
+  }
+
+  /**
+   * Advice that logs methods throwing exceptions.
+   *
+   * @param joinPoint join point for advice.
+   * @param e exception.
+   */
+  @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e")
+  public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
+    if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) {
+      logger(joinPoint)
+        .error(
+          "Exception in {}() with cause = \'{}\' and exception = \'{}\'",
+          joinPoint.getSignature().getName(),
+          e.getCause() != null ? e.getCause() : "NULL",
+          e.getMessage(),
+          e
+        );
+    } else {
+      logger(joinPoint)
+        .error("Exception in {}() with cause = {}", joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL");
+    }
+  }
+
+  /**
+   * Advice that logs when a method is entered and exited.
+   *
+   * @param joinPoint join point for advice.
+   * @return result.
+   * @throws Throwable throws {@link IllegalArgumentException}.
+   */
+  @Around("applicationPackagePointcut() && springBeanPointcut()")
+  public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
+    Logger log = logger(joinPoint);
+    if (log.isDebugEnabled()) {
+      log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs()));
+    }
+    try {
+      Object result = joinPoint.proceed();
+      if (log.isDebugEnabled()) {
+        log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result);
+      }
+      return result;
+    } catch (IllegalArgumentException e) {
+      log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName());
+      throw e;
+    }
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..874f412ab1c2417c133bbe96228de741b77ef170
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java
@@ -0,0 +1,12 @@
+package com.ippon.borestop.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Properties specific to Borestop.
+ * <p>
+ * Properties are configured in the {@code application.yml} file.
+ * See {@link io.github.jhipster.config.JHipsterProperties} for a good example.
+ */
+@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
+public class ApplicationProperties {}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..ffc95958c6c97cfd73a0140bde1d18e45551b8a3
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java
@@ -0,0 +1,45 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor;
+import java.util.concurrent.Executor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
+import org.springframework.boot.autoconfigure.task.TaskExecutionProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+@Configuration
+@EnableAsync
+@EnableScheduling
+public class AsyncConfiguration implements AsyncConfigurer {
+  private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class);
+
+  private final TaskExecutionProperties taskExecutionProperties;
+
+  public AsyncConfiguration(TaskExecutionProperties taskExecutionProperties) {
+    this.taskExecutionProperties = taskExecutionProperties;
+  }
+
+  @Override
+  @Bean(name = "taskExecutor")
+  public Executor getAsyncExecutor() {
+    log.debug("Creating Async Task Executor");
+    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+    executor.setCorePoolSize(taskExecutionProperties.getPool().getCoreSize());
+    executor.setMaxPoolSize(taskExecutionProperties.getPool().getMaxSize());
+    executor.setQueueCapacity(taskExecutionProperties.getPool().getQueueCapacity());
+    executor.setThreadNamePrefix(taskExecutionProperties.getThreadNamePrefix());
+    return new ExceptionHandlingAsyncTaskExecutor(executor);
+  }
+
+  @Override
+  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+    return new SimpleAsyncUncaughtExceptionHandler();
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..c962ed93bdfdcab204735728415feb74edd46314
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java
@@ -0,0 +1,24 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.config.JHipsterConstants;
+import javax.sql.DataSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.config.java.AbstractCloudConfig;
+import org.springframework.context.annotation.*;
+
+@Configuration
+@Profile(JHipsterConstants.SPRING_PROFILE_CLOUD)
+public class CloudDatabaseConfiguration extends AbstractCloudConfig {
+  private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class);
+
+  private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari";
+
+  @Bean
+  @ConfigurationProperties(CLOUD_CONFIGURATION_HIKARI_PREFIX)
+  public DataSource dataSource() {
+    log.info("Configuring JDBC datasource from a cloud provider");
+    return connectionFactory().dataSource();
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/Constants.java b/borestop/src/main/java/com/ippon/borestop/config/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..34304cb36f63858163dd37bd39a122ef7becadb4
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/Constants.java
@@ -0,0 +1,15 @@
+package com.ippon.borestop.config;
+
+/**
+ * Application constants.
+ */
+public final class Constants {
+  // Regex for acceptable logins
+  public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$";
+
+  public static final String SYSTEM_ACCOUNT = "system";
+  public static final String DEFAULT_LANGUAGE = "en";
+  public static final String ANONYMOUS_USER = "anonymoususer";
+
+  private Constants() {}
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..fbdadc25d00dee7242cae6b6f0a92baaef201b25
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java
@@ -0,0 +1,56 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.config.JHipsterConstants;
+import io.github.jhipster.config.h2.H2ConfigurationHelper;
+import java.sql.SQLException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@EnableJpaRepositories("com.ippon.borestop.repository")
+@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
+@EnableTransactionManagement
+public class DatabaseConfiguration {
+  private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class);
+
+  private final Environment env;
+
+  public DatabaseConfiguration(Environment env) {
+    this.env = env;
+  }
+
+  /**
+   * Open the TCP port for the H2 database, so it is available remotely.
+   *
+   * @return the H2 database TCP server.
+   * @throws SQLException if the server failed to start.
+   */
+  @Bean(initMethod = "start", destroyMethod = "stop")
+  @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
+  public Object h2TCPServer() throws SQLException {
+    String port = getValidPortForH2();
+    log.debug("H2 database is available on port {}", port);
+    return H2ConfigurationHelper.createServer(port);
+  }
+
+  private String getValidPortForH2() {
+    int port = Integer.parseInt(env.getProperty("server.port"));
+    if (port < 10000) {
+      port = 10000 + port;
+    } else {
+      if (port < 63536) {
+        port = port + 2000;
+      } else {
+        port = port - 2000;
+      }
+    }
+    return String.valueOf(port);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5eb685771c91368e6d0222b7921b82df94efaed
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java
@@ -0,0 +1,20 @@
+package com.ippon.borestop.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Configure the converters to use the ISO format for dates by default.
+ */
+@Configuration
+public class DateTimeFormatConfiguration implements WebMvcConfigurer {
+
+  @Override
+  public void addFormatters(FormatterRegistry registry) {
+    DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
+    registrar.setUseIsoFormat(true);
+    registrar.registerFormatters(registry);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..515b3f44cd70b1b226fd43979e599b4e695b6891
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java
@@ -0,0 +1,51 @@
+package com.ippon.borestop.config;
+
+import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.zalando.problem.ProblemModule;
+import org.zalando.problem.violations.ConstraintViolationProblemModule;
+
+@Configuration
+public class JacksonConfiguration {
+
+  /**
+   * Support for Java date and time API.
+   * @return the corresponding Jackson module.
+   */
+  @Bean
+  public JavaTimeModule javaTimeModule() {
+    return new JavaTimeModule();
+  }
+
+  @Bean
+  public Jdk8Module jdk8TimeModule() {
+    return new Jdk8Module();
+  }
+
+  /*
+   * Support for Hibernate types in Jackson.
+   */
+  @Bean
+  public Hibernate5Module hibernate5Module() {
+    return new Hibernate5Module();
+  }
+
+  /*
+   * Module for serialization/deserialization of RFC7807 Problem.
+   */
+  @Bean
+  public ProblemModule problemModule() {
+    return new ProblemModule();
+  }
+
+  /*
+   * Module for serialization/deserialization of ConstraintViolationProblem.
+   */
+  @Bean
+  public ConstraintViolationProblemModule constraintViolationProblemModule() {
+    return new ConstraintViolationProblemModule();
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5305f2a3e0947997cf15f7ba13af85e25235f18
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java
@@ -0,0 +1,68 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.config.JHipsterConstants;
+import io.github.jhipster.config.liquibase.SpringLiquibaseUtil;
+import java.util.concurrent.Executor;
+import javax.sql.DataSource;
+import liquibase.integration.spring.SpringLiquibase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource;
+import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.Profiles;
+
+@Configuration
+public class LiquibaseConfiguration {
+  private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class);
+
+  private final Environment env;
+
+  public LiquibaseConfiguration(Environment env) {
+    this.env = env;
+  }
+
+  @Bean
+  public SpringLiquibase liquibase(
+    @Qualifier("taskExecutor") Executor executor,
+    @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource,
+    LiquibaseProperties liquibaseProperties,
+    ObjectProvider<DataSource> dataSource,
+    DataSourceProperties dataSourceProperties
+  ) {
+    // If you don't want Liquibase to start asynchronously, substitute by this:
+    // SpringLiquibase liquibase = SpringLiquibaseUtil.createSpringLiquibase(liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties);
+    SpringLiquibase liquibase = SpringLiquibaseUtil.createAsyncSpringLiquibase(
+      this.env,
+      executor,
+      liquibaseDataSource.getIfAvailable(),
+      liquibaseProperties,
+      dataSource.getIfUnique(),
+      dataSourceProperties
+    );
+    liquibase.setChangeLog("classpath:config/liquibase/master.xml");
+    liquibase.setContexts(liquibaseProperties.getContexts());
+    liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
+    liquibase.setLiquibaseSchema(liquibaseProperties.getLiquibaseSchema());
+    liquibase.setLiquibaseTablespace(liquibaseProperties.getLiquibaseTablespace());
+    liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable());
+    liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable());
+    liquibase.setDropFirst(liquibaseProperties.isDropFirst());
+    liquibase.setLabels(liquibaseProperties.getLabels());
+    liquibase.setChangeLogParameters(liquibaseProperties.getParameters());
+    liquibase.setRollbackFile(liquibaseProperties.getRollbackFile());
+    liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate());
+    if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) {
+      liquibase.setShouldRun(false);
+    } else {
+      liquibase.setShouldRun(liquibaseProperties.isEnabled());
+      log.debug("Configuring Liquibase");
+    }
+    return liquibase;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..22c40b423cb398cffb94139abb03bc31e770b404
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java
@@ -0,0 +1,26 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.config.locale.AngularCookieLocaleResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.*;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+@Configuration
+public class LocaleConfiguration implements WebMvcConfigurer {
+
+  @Bean
+  public LocaleResolver localeResolver() {
+    AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver();
+    cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY");
+    return cookieLocaleResolver;
+  }
+
+  @Override
+  public void addInterceptors(InterceptorRegistry registry) {
+    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
+    localeChangeInterceptor.setParamName("language");
+    registry.addInterceptor(localeChangeInterceptor);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..63268ca1fd25c45d457214cb95e3fccf82ed34d8
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java
@@ -0,0 +1,17 @@
+package com.ippon.borestop.config;
+
+import com.ippon.borestop.aop.logging.LoggingAspect;
+import io.github.jhipster.config.JHipsterConstants;
+import org.springframework.context.annotation.*;
+import org.springframework.core.env.Environment;
+
+@Configuration
+@EnableAspectJAutoProxy
+public class LoggingAspectConfiguration {
+
+  @Bean
+  @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
+  public LoggingAspect loggingAspect(Environment env) {
+    return new LoggingAspect(env);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b584f0117dcc2a407fd127c74b720d2e872fb7d
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java
@@ -0,0 +1,51 @@
+package com.ippon.borestop.config;
+
+import static io.github.jhipster.config.logging.LoggingUtils.*;
+
+import ch.qos.logback.classic.LoggerContext;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.github.jhipster.config.JHipsterProperties;
+import java.util.HashMap;
+import java.util.Map;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+/*
+ * Configures the console and Logstash log appenders from the app properties
+ */
+@Configuration
+public class LoggingConfiguration {
+
+  public LoggingConfiguration(
+    @Value("${spring.application.name}") String appName,
+    @Value("${server.port}") String serverPort,
+    JHipsterProperties jHipsterProperties,
+    ObjectMapper mapper
+  )
+    throws JsonProcessingException {
+    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+
+    Map<String, String> map = new HashMap<>();
+    map.put("app_name", appName);
+    map.put("app_port", serverPort);
+    String customFields = mapper.writeValueAsString(map);
+
+    JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging();
+    JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash();
+
+    if (loggingProperties.isUseJsonFormat()) {
+      addJsonConsoleAppender(context, customFields);
+    }
+    if (logstashProperties.isEnabled()) {
+      addLogstashTcpSocketAppender(context, customFields, logstashProperties);
+    }
+    if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) {
+      addContextListener(context, customFields, loggingProperties);
+    }
+    if (jHipsterProperties.getMetrics().getLogs().isEnabled()) {
+      setMetricsMarkerLogbackFilter(context, loggingProperties.isUseJsonFormat());
+    }
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..728f8a2aab90219729f84c1e3f23323e4723510a
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java
@@ -0,0 +1,99 @@
+package com.ippon.borestop.config;
+
+import com.ippon.borestop.security.*;
+import com.ippon.borestop.security.jwt.*;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.HttpMethod;
+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.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter;
+import org.springframework.web.filter.CorsFilter;
+import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport;
+
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
+@Import(SecurityProblemSupport.class)
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+  private final TokenProvider tokenProvider;
+
+  private final CorsFilter corsFilter;
+  private final SecurityProblemSupport problemSupport;
+
+  public SecurityConfiguration(TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) {
+    this.tokenProvider = tokenProvider;
+    this.corsFilter = corsFilter;
+    this.problemSupport = problemSupport;
+  }
+
+  @Bean
+  public PasswordEncoder passwordEncoder() {
+    return new BCryptPasswordEncoder();
+  }
+
+  @Override
+  public void configure(WebSecurity web) {
+    web
+      .ignoring()
+      .antMatchers(HttpMethod.OPTIONS, "/**")
+      .antMatchers("/app/**/*.{js,html}")
+      .antMatchers("/i18n/**")
+      .antMatchers("/content/**")
+      .antMatchers("/h2-console/**")
+      .antMatchers("/swagger-ui/index.html")
+      .antMatchers("/test/**");
+  }
+
+  @Override
+  public void configure(HttpSecurity http) throws Exception {
+    // @formatter:off
+        http
+            .csrf()
+            .disable()
+            .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
+            .exceptionHandling()
+                .authenticationEntryPoint(problemSupport)
+                .accessDeniedHandler(problemSupport)
+        .and()
+            .headers()
+            .contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:")
+        .and()
+            .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
+        .and()
+            .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'")
+        .and()
+            .frameOptions()
+            .deny()
+        .and()
+            .sessionManagement()
+            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+        .and()
+            .authorizeRequests()
+            .antMatchers("/api/authenticate").permitAll()
+            .antMatchers("/api/register").permitAll()
+            .antMatchers("/api/activate").permitAll()
+            .antMatchers("/api/account/reset-password/init").permitAll()
+            .antMatchers("/api/account/reset-password/finish").permitAll()
+            .antMatchers("/api/**").authenticated()
+            .antMatchers("/management/health").permitAll()
+            .antMatchers("/management/info").permitAll()
+            .antMatchers("/management/prometheus").permitAll()
+            .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
+        .and()
+            .httpBasic()
+        .and()
+            .apply(securityConfigurerAdapter());
+  // @formatter:on
+  }
+
+  private JWTConfigurer securityConfigurerAdapter() {
+    return new JWTConfigurer(tokenProvider);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..9cc17d0f91e04d3550a367cc4a6887f38c935970
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java
@@ -0,0 +1,50 @@
+package com.ippon.borestop.config;
+
+import io.github.jhipster.config.JHipsterConstants;
+import io.github.jhipster.config.JHipsterProperties;
+import java.util.concurrent.TimeUnit;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.http.CacheControl;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@Profile({ JHipsterConstants.SPRING_PROFILE_PRODUCTION })
+public class StaticResourcesWebConfiguration implements WebMvcConfigurer {
+  protected static final String[] RESOURCE_LOCATIONS = new String[] {
+    "classpath:/static/app/",
+    "classpath:/static/content/",
+    "classpath:/static/i18n/"
+  };
+  protected static final String[] RESOURCE_PATHS = new String[] { "/app/*", "/content/*", "/i18n/*" };
+
+  private final JHipsterProperties jhipsterProperties;
+
+  public StaticResourcesWebConfiguration(JHipsterProperties jHipsterProperties) {
+    this.jhipsterProperties = jHipsterProperties;
+  }
+
+  @Override
+  public void addResourceHandlers(ResourceHandlerRegistry registry) {
+    ResourceHandlerRegistration resourceHandlerRegistration = appendResourceHandler(registry);
+    initializeResourceHandler(resourceHandlerRegistration);
+  }
+
+  protected ResourceHandlerRegistration appendResourceHandler(ResourceHandlerRegistry registry) {
+    return registry.addResourceHandler(RESOURCE_PATHS);
+  }
+
+  protected void initializeResourceHandler(ResourceHandlerRegistration resourceHandlerRegistration) {
+    resourceHandlerRegistration.addResourceLocations(RESOURCE_LOCATIONS).setCacheControl(getCacheControl());
+  }
+
+  protected CacheControl getCacheControl() {
+    return CacheControl.maxAge(getJHipsterHttpCacheProperty(), TimeUnit.DAYS).cachePublic();
+  }
+
+  private int getJHipsterHttpCacheProperty() {
+    return jhipsterProperties.getHttp().getCache().getTimeToLiveInDays();
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java
new file mode 100644
index 0000000000000000000000000000000000000000..85a7845b668cf04e63abe1bff524fb7e4cab2040
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java
@@ -0,0 +1,133 @@
+package com.ippon.borestop.config;
+
+import static java.net.URLDecoder.decode;
+
+import io.github.jhipster.config.JHipsterConstants;
+import io.github.jhipster.config.JHipsterProperties;
+import io.github.jhipster.config.h2.H2ConfigurationHelper;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Paths;
+import java.util.*;
+import javax.servlet.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.web.server.*;
+import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.Profiles;
+import org.springframework.http.MediaType;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * Configuration of web application with Servlet 3.0 APIs.
+ */
+@Configuration
+public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer<WebServerFactory> {
+  private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);
+
+  private final Environment env;
+
+  private final JHipsterProperties jHipsterProperties;
+
+  public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) {
+    this.env = env;
+    this.jHipsterProperties = jHipsterProperties;
+  }
+
+  @Override
+  public void onStartup(ServletContext servletContext) throws ServletException {
+    if (env.getActiveProfiles().length != 0) {
+      log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles());
+    }
+
+    if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) {
+      initH2Console(servletContext);
+    }
+    log.info("Web application fully configured");
+  }
+
+  /**
+   * Customize the Servlet engine: Mime types, the document root, the cache.
+   */
+  @Override
+  public void customize(WebServerFactory server) {
+    setMimeMappings(server);
+
+    // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets.
+    setLocationForStaticAssets(server);
+  }
+
+  private void setMimeMappings(WebServerFactory server) {
+    if (server instanceof ConfigurableServletWebServerFactory) {
+      MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
+
+      // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711
+      mappings.add("html", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase());
+
+      // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64
+      mappings.add("json", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase());
+      ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server;
+      servletWebServer.setMimeMappings(mappings);
+    }
+  }
+
+  private void setLocationForStaticAssets(WebServerFactory server) {
+    if (server instanceof ConfigurableServletWebServerFactory) {
+      ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server;
+      File root;
+      String prefixPath = resolvePathPrefix();
+      root = new File(prefixPath + "target/classes/static/");
+      if (root.exists() && root.isDirectory()) {
+        servletWebServer.setDocumentRoot(root);
+      }
+    }
+  }
+
+  /**
+   * Resolve path prefix to static resources.
+   */
+  private String resolvePathPrefix() {
+    String fullExecutablePath;
+    try {
+      fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      /* try without decoding if this ever happens */
+      fullExecutablePath = this.getClass().getResource("").getPath();
+    }
+    String rootPath = Paths.get(".").toUri().normalize().getPath();
+    String extractedPath = fullExecutablePath.replace(rootPath, "");
+    int extractionEndIndex = extractedPath.indexOf("target/");
+    if (extractionEndIndex <= 0) {
+      return "";
+    }
+    return extractedPath.substring(0, extractionEndIndex);
+  }
+
+  @Bean
+  public CorsFilter corsFilter() {
+    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+    CorsConfiguration config = jHipsterProperties.getCors();
+    if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) {
+      log.debug("Registering CORS filter");
+      source.registerCorsConfiguration("/api/**", config);
+      source.registerCorsConfiguration("/management/**", config);
+      source.registerCorsConfiguration("/v2/api-docs", config);
+    }
+    return new CorsFilter(source);
+  }
+
+  /**
+   * Initializes H2 console.
+   */
+  private void initH2Console(ServletContext servletContext) {
+    log.debug("Initialize H2 console");
+    H2ConfigurationHelper.initH2Console(servletContext);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..56abe0e1ea475eed2f42699f1faa9661f8236089
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java
@@ -0,0 +1,88 @@
+package com.ippon.borestop.config.audit;
+
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import java.util.*;
+import org.springframework.boot.actuate.audit.AuditEvent;
+import org.springframework.security.web.authentication.WebAuthenticationDetails;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AuditEventConverter {
+
+  /**
+   * Convert a list of {@link PersistentAuditEvent}s to a list of {@link AuditEvent}s.
+   *
+   * @param persistentAuditEvents the list to convert.
+   * @return the converted list.
+   */
+  public List<AuditEvent> convertToAuditEvent(Iterable<PersistentAuditEvent> persistentAuditEvents) {
+    if (persistentAuditEvents == null) {
+      return Collections.emptyList();
+    }
+    List<AuditEvent> auditEvents = new ArrayList<>();
+    for (PersistentAuditEvent persistentAuditEvent : persistentAuditEvents) {
+      auditEvents.add(convertToAuditEvent(persistentAuditEvent));
+    }
+    return auditEvents;
+  }
+
+  /**
+   * Convert a {@link PersistentAuditEvent} to an {@link AuditEvent}.
+   *
+   * @param persistentAuditEvent the event to convert.
+   * @return the converted list.
+   */
+  public AuditEvent convertToAuditEvent(PersistentAuditEvent persistentAuditEvent) {
+    if (persistentAuditEvent == null) {
+      return null;
+    }
+    return new AuditEvent(
+      persistentAuditEvent.getAuditEventDate(),
+      persistentAuditEvent.getPrincipal(),
+      persistentAuditEvent.getAuditEventType(),
+      convertDataToObjects(persistentAuditEvent.getData())
+    );
+  }
+
+  /**
+   * Internal conversion. This is needed to support the current SpringBoot actuator {@code AuditEventRepository} interface.
+   *
+   * @param data the data to convert.
+   * @return a map of {@link String}, {@link Object}.
+   */
+  public Map<String, Object> convertDataToObjects(Map<String, String> data) {
+    Map<String, Object> results = new HashMap<>();
+
+    if (data != null) {
+      for (Map.Entry<String, String> entry : data.entrySet()) {
+        results.put(entry.getKey(), entry.getValue());
+      }
+    }
+    return results;
+  }
+
+  /**
+   * Internal conversion. This method will allow to save additional data.
+   * By default, it will save the object as string.
+   *
+   * @param data the data to convert.
+   * @return a map of {@link String}, {@link String}.
+   */
+  public Map<String, String> convertDataToStrings(Map<String, Object> data) {
+    Map<String, String> results = new HashMap<>();
+
+    if (data != null) {
+      for (Map.Entry<String, Object> entry : data.entrySet()) {
+        // Extract the data that will be saved.
+        if (entry.getValue() instanceof WebAuthenticationDetails) {
+          WebAuthenticationDetails authenticationDetails = (WebAuthenticationDetails) entry.getValue();
+          results.put("remoteAddress", authenticationDetails.getRemoteAddress());
+          results.put("sessionId", authenticationDetails.getSessionId());
+        } else {
+          results.put(entry.getKey(), Objects.toString(entry.getValue()));
+        }
+      }
+    }
+    return results;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa8b682e11bcb90feef7ce86eaa053dfe2cad29c
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Audit specific code.
+ */
+package com.ippon.borestop.config.audit;
diff --git a/borestop/src/main/java/com/ippon/borestop/config/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..a24097d917d307ee2f922095c0581aff66bed44d
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/config/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Spring Framework configuration files.
+ */
+package com.ippon.borestop.config;
diff --git a/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..31109e42cd4ff7ed52e2fa5d839b97a63e5d8c5c
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java
@@ -0,0 +1,75 @@
+package com.ippon.borestop.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.io.Serializable;
+import java.time.Instant;
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+/**
+ * Base abstract class for entities which will hold definitions for created, last modified, created by,
+ * last modified by attributes.
+ */
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public abstract class AbstractAuditingEntity implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  @CreatedBy
+  @Column(name = "created_by", nullable = false, length = 50, updatable = false)
+  @JsonIgnore
+  private String createdBy;
+
+  @CreatedDate
+  @Column(name = "created_date", updatable = false)
+  @JsonIgnore
+  private Instant createdDate = Instant.now();
+
+  @LastModifiedBy
+  @Column(name = "last_modified_by", length = 50)
+  @JsonIgnore
+  private String lastModifiedBy;
+
+  @LastModifiedDate
+  @Column(name = "last_modified_date")
+  @JsonIgnore
+  private Instant lastModifiedDate = Instant.now();
+
+  public String getCreatedBy() {
+    return createdBy;
+  }
+
+  public void setCreatedBy(String createdBy) {
+    this.createdBy = createdBy;
+  }
+
+  public Instant getCreatedDate() {
+    return createdDate;
+  }
+
+  public void setCreatedDate(Instant createdDate) {
+    this.createdDate = createdDate;
+  }
+
+  public String getLastModifiedBy() {
+    return lastModifiedBy;
+  }
+
+  public void setLastModifiedBy(String lastModifiedBy) {
+    this.lastModifiedBy = lastModifiedBy;
+  }
+
+  public Instant getLastModifiedDate() {
+    return lastModifiedDate;
+  }
+
+  public void setLastModifiedDate(Instant lastModifiedDate) {
+    this.lastModifiedDate = lastModifiedDate;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/domain/Authority.java b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java
new file mode 100644
index 0000000000000000000000000000000000000000..381c6724ce26a149e55462afe8a6f8afa4306a77
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java
@@ -0,0 +1,57 @@
+package com.ippon.borestop.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+/**
+ * An authority (a security role) used by Spring Security.
+ */
+@Entity
+@Table(name = "jhi_authority")
+public class Authority implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  @NotNull
+  @Size(max = 50)
+  @Id
+  @Column(length = 50)
+  private String name;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Authority)) {
+      return false;
+    }
+    return Objects.equals(name, ((Authority) o).name);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(name);
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "Authority{" +
+            "name='" + name + '\'' +
+            "}";
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..917e4121ba92411fc0a3d97dde18958a3b87c4d8
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java
@@ -0,0 +1,107 @@
+package com.ippon.borestop.domain;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Persist AuditEvent managed by the Spring Boot actuator.
+ *
+ * @see org.springframework.boot.actuate.audit.AuditEvent
+ */
+@Entity
+@Table(name = "jhi_persistent_audit_event")
+public class PersistentAuditEvent implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
+  @SequenceGenerator(name = "sequenceGenerator")
+  @Column(name = "event_id")
+  private Long id;
+
+  @NotNull
+  @Column(nullable = false)
+  private String principal;
+
+  @Column(name = "event_date")
+  private Instant auditEventDate;
+
+  @Column(name = "event_type")
+  private String auditEventType;
+
+  @ElementCollection
+  @MapKeyColumn(name = "name")
+  @Column(name = "value")
+  @CollectionTable(name = "jhi_persistent_audit_evt_data", joinColumns = @JoinColumn(name = "event_id"))
+  private Map<String, String> data = new HashMap<>();
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getPrincipal() {
+    return principal;
+  }
+
+  public void setPrincipal(String principal) {
+    this.principal = principal;
+  }
+
+  public Instant getAuditEventDate() {
+    return auditEventDate;
+  }
+
+  public void setAuditEventDate(Instant auditEventDate) {
+    this.auditEventDate = auditEventDate;
+  }
+
+  public String getAuditEventType() {
+    return auditEventType;
+  }
+
+  public void setAuditEventType(String auditEventType) {
+    this.auditEventType = auditEventType;
+  }
+
+  public Map<String, String> getData() {
+    return data;
+  }
+
+  public void setData(Map<String, String> data) {
+    this.data = data;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof PersistentAuditEvent)) {
+      return false;
+    }
+    return id != null && id.equals(((PersistentAuditEvent) o).id);
+  }
+
+  @Override
+  public int hashCode() {
+    return 31;
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "PersistentAuditEvent{" +
+            "principal='" + principal + '\'' +
+            ", auditEventDate=" + auditEventDate +
+            ", auditEventType='" + auditEventType + '\'' +
+            '}';
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/domain/User.java b/borestop/src/main/java/com/ippon/borestop/domain/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..a43b734dd1467fba6d634e5e56ce147f6c502884
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/domain/User.java
@@ -0,0 +1,226 @@
+package com.ippon.borestop.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ippon.borestop.config.Constants;
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+import javax.persistence.*;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.annotations.BatchSize;
+
+/**
+ * A user.
+ */
+@Entity
+@Table(name = "jhi_user")
+public class User extends AbstractAuditingEntity implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
+  @SequenceGenerator(name = "sequenceGenerator")
+  private Long id;
+
+  @NotNull
+  @Pattern(regexp = Constants.LOGIN_REGEX)
+  @Size(min = 1, max = 50)
+  @Column(length = 50, unique = true, nullable = false)
+  private String login;
+
+  @JsonIgnore
+  @NotNull
+  @Size(min = 60, max = 60)
+  @Column(name = "password_hash", length = 60, nullable = false)
+  private String password;
+
+  @Size(max = 50)
+  @Column(name = "first_name", length = 50)
+  private String firstName;
+
+  @Size(max = 50)
+  @Column(name = "last_name", length = 50)
+  private String lastName;
+
+  @Email
+  @Size(min = 5, max = 254)
+  @Column(length = 254, unique = true)
+  private String email;
+
+  @NotNull
+  @Column(nullable = false)
+  private boolean activated = false;
+
+  @Size(min = 2, max = 10)
+  @Column(name = "lang_key", length = 10)
+  private String langKey;
+
+  @Size(max = 256)
+  @Column(name = "image_url", length = 256)
+  private String imageUrl;
+
+  @Size(max = 20)
+  @Column(name = "activation_key", length = 20)
+  @JsonIgnore
+  private String activationKey;
+
+  @Size(max = 20)
+  @Column(name = "reset_key", length = 20)
+  @JsonIgnore
+  private String resetKey;
+
+  @Column(name = "reset_date")
+  private Instant resetDate = null;
+
+  @JsonIgnore
+  @ManyToMany
+  @JoinTable(
+    name = "jhi_user_authority",
+    joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
+    inverseJoinColumns = { @JoinColumn(name = "authority_name", referencedColumnName = "name") }
+  )
+  @BatchSize(size = 20)
+  private Set<Authority> authorities = new HashSet<>();
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getLogin() {
+    return login;
+  }
+
+  // Lowercase the login before saving it in database
+  public void setLogin(String login) {
+    this.login = StringUtils.lowerCase(login, Locale.ENGLISH);
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  public String getFirstName() {
+    return firstName;
+  }
+
+  public void setFirstName(String firstName) {
+    this.firstName = firstName;
+  }
+
+  public String getLastName() {
+    return lastName;
+  }
+
+  public void setLastName(String lastName) {
+    this.lastName = lastName;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
+  public String getImageUrl() {
+    return imageUrl;
+  }
+
+  public void setImageUrl(String imageUrl) {
+    this.imageUrl = imageUrl;
+  }
+
+  public boolean getActivated() {
+    return activated;
+  }
+
+  public void setActivated(boolean activated) {
+    this.activated = activated;
+  }
+
+  public String getActivationKey() {
+    return activationKey;
+  }
+
+  public void setActivationKey(String activationKey) {
+    this.activationKey = activationKey;
+  }
+
+  public String getResetKey() {
+    return resetKey;
+  }
+
+  public void setResetKey(String resetKey) {
+    this.resetKey = resetKey;
+  }
+
+  public Instant getResetDate() {
+    return resetDate;
+  }
+
+  public void setResetDate(Instant resetDate) {
+    this.resetDate = resetDate;
+  }
+
+  public String getLangKey() {
+    return langKey;
+  }
+
+  public void setLangKey(String langKey) {
+    this.langKey = langKey;
+  }
+
+  public Set<Authority> getAuthorities() {
+    return authorities;
+  }
+
+  public void setAuthorities(Set<Authority> authorities) {
+    this.authorities = authorities;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof User)) {
+      return false;
+    }
+    return id != null && id.equals(((User) o).id);
+  }
+
+  @Override
+  public int hashCode() {
+    return 31;
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "User{" +
+            "login='" + login + '\'' +
+            ", firstName='" + firstName + '\'' +
+            ", lastName='" + lastName + '\'' +
+            ", email='" + email + '\'' +
+            ", imageUrl='" + imageUrl + '\'' +
+            ", activated='" + activated + '\'' +
+            ", langKey='" + langKey + '\'' +
+            ", activationKey='" + activationKey + '\'' +
+            "}";
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/domain/package-info.java b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..8952b86ca23cc0d0113b102da7ac18b9f67c56ad
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * JPA domain objects.
+ */
+package com.ippon.borestop.domain;
diff --git a/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..490eba346cd6b5c57c0d67430c3b8816a1e88eb0
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.repository;
+
+import com.ippon.borestop.domain.Authority;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * Spring Data JPA repository for the {@link Authority} entity.
+ */
+public interface AuthorityRepository extends JpaRepository<Authority, String> {}
diff --git a/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa227082d80d1b4c69329bbe68072729b3cdee35
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java
@@ -0,0 +1,92 @@
+package com.ippon.borestop.repository;
+
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.config.audit.AuditEventConverter;
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import java.time.Instant;
+import java.util.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.actuate.audit.AuditEvent;
+import org.springframework.boot.actuate.audit.AuditEventRepository;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * An implementation of Spring Boot's {@link AuditEventRepository}.
+ */
+@Repository
+public class CustomAuditEventRepository implements AuditEventRepository {
+  private static final String AUTHORIZATION_FAILURE = "AUTHORIZATION_FAILURE";
+
+  /**
+   * Should be the same as in Liquibase migration.
+   */
+  protected static final int EVENT_DATA_COLUMN_MAX_LENGTH = 255;
+
+  private final PersistenceAuditEventRepository persistenceAuditEventRepository;
+
+  private final AuditEventConverter auditEventConverter;
+
+  private final Logger log = LoggerFactory.getLogger(getClass());
+
+  public CustomAuditEventRepository(
+    PersistenceAuditEventRepository persistenceAuditEventRepository,
+    AuditEventConverter auditEventConverter
+  ) {
+    this.persistenceAuditEventRepository = persistenceAuditEventRepository;
+    this.auditEventConverter = auditEventConverter;
+  }
+
+  @Override
+  public List<AuditEvent> find(String principal, Instant after, String type) {
+    Iterable<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findByPrincipalAndAuditEventDateAfterAndAuditEventType(
+      principal,
+      after,
+      type
+    );
+    return auditEventConverter.convertToAuditEvent(persistentAuditEvents);
+  }
+
+  @Override
+  @Transactional(propagation = Propagation.REQUIRES_NEW)
+  public void add(AuditEvent event) {
+    if (!AUTHORIZATION_FAILURE.equals(event.getType()) && !Constants.ANONYMOUS_USER.equals(event.getPrincipal())) {
+      PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent();
+      persistentAuditEvent.setPrincipal(event.getPrincipal());
+      persistentAuditEvent.setAuditEventType(event.getType());
+      persistentAuditEvent.setAuditEventDate(event.getTimestamp());
+      Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData());
+      persistentAuditEvent.setData(truncate(eventData));
+      persistenceAuditEventRepository.save(persistentAuditEvent);
+    }
+  }
+
+  /**
+   * Truncate event data that might exceed column length.
+   */
+  private Map<String, String> truncate(Map<String, String> data) {
+    Map<String, String> results = new HashMap<>();
+
+    if (data != null) {
+      for (Map.Entry<String, String> entry : data.entrySet()) {
+        String value = entry.getValue();
+        if (value != null) {
+          int length = value.length();
+          if (length > EVENT_DATA_COLUMN_MAX_LENGTH) {
+            value = value.substring(0, EVENT_DATA_COLUMN_MAX_LENGTH);
+            log.warn(
+              "Event data for {} too long ({}) has been truncated to {}. Consider increasing column width.",
+              entry.getKey(),
+              length,
+              EVENT_DATA_COLUMN_MAX_LENGTH
+            );
+          }
+        }
+        results.put(entry.getKey(), value);
+      }
+    }
+    return results;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..7376410f7eb13ad69ea7fb11e612c884ec31e89d
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java
@@ -0,0 +1,21 @@
+package com.ippon.borestop.repository;
+
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import java.time.Instant;
+import java.util.List;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * Spring Data JPA repository for the {@link PersistentAuditEvent} entity.
+ */
+public interface PersistenceAuditEventRepository extends JpaRepository<PersistentAuditEvent, Long> {
+  List<PersistentAuditEvent> findByPrincipal(String principal);
+
+  List<PersistentAuditEvent> findByPrincipalAndAuditEventDateAfterAndAuditEventType(String principal, Instant after, String type);
+
+  Page<PersistentAuditEvent> findAllByAuditEventDateBetween(Instant fromDate, Instant toDate, Pageable pageable);
+
+  List<PersistentAuditEvent> findByAuditEventDateBefore(Instant before);
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..235422618ce70ae819b3b117b6bd9497fca6c413
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java
@@ -0,0 +1,35 @@
+package com.ippon.borestop.repository;
+
+import com.ippon.borestop.domain.User;
+import java.time.Instant;
+import java.util.List;
+import java.util.Optional;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.EntityGraph;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Spring Data JPA repository for the {@link User} entity.
+ */
+@Repository
+public interface UserRepository extends JpaRepository<User, Long> {
+  Optional<User> findOneByActivationKey(String activationKey);
+
+  List<User> findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant dateTime);
+
+  Optional<User> findOneByResetKey(String resetKey);
+
+  Optional<User> findOneByEmailIgnoreCase(String email);
+
+  Optional<User> findOneByLogin(String login);
+
+  @EntityGraph(attributePaths = "authorities")
+  Optional<User> findOneWithAuthoritiesByLogin(String login);
+
+  @EntityGraph(attributePaths = "authorities")
+  Optional<User> findOneWithAuthoritiesByEmailIgnoreCase(String email);
+
+  Page<User> findAllByLoginNot(Pageable pageable, String login);
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/repository/package-info.java b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..25618cca775065e58b302ddddc7de3827b8d6cd1
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Spring Data JPA repositories.
+ */
+package com.ippon.borestop.repository;
diff --git a/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..193b052d875db61a2284cc66d8000b63d25aa63d
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java
@@ -0,0 +1,14 @@
+package com.ippon.borestop.security;
+
+/**
+ * Constants for Spring Security authorities.
+ */
+public final class AuthoritiesConstants {
+  public static final String ADMIN = "ROLE_ADMIN";
+
+  public static final String USER = "ROLE_USER";
+
+  public static final String ANONYMOUS = "ROLE_ANONYMOUS";
+
+  private AuthoritiesConstants() {}
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java
new file mode 100644
index 0000000000000000000000000000000000000000..29330366b9f33c4d894703a122c2b2ad1d3534fd
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java
@@ -0,0 +1,61 @@
+package com.ippon.borestop.security;
+
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import java.util.*;
+import java.util.stream.Collectors;
+import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Authenticate a user from the database.
+ */
+@Component("userDetailsService")
+public class DomainUserDetailsService implements UserDetailsService {
+  private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class);
+
+  private final UserRepository userRepository;
+
+  public DomainUserDetailsService(UserRepository userRepository) {
+    this.userRepository = userRepository;
+  }
+
+  @Override
+  @Transactional
+  public UserDetails loadUserByUsername(final String login) {
+    log.debug("Authenticating {}", login);
+
+    if (new EmailValidator().isValid(login, null)) {
+      return userRepository
+        .findOneWithAuthoritiesByEmailIgnoreCase(login)
+        .map(user -> createSpringSecurityUser(login, user))
+        .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database"));
+    }
+
+    String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
+    return userRepository
+      .findOneWithAuthoritiesByLogin(lowercaseLogin)
+      .map(user -> createSpringSecurityUser(lowercaseLogin, user))
+      .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database"));
+  }
+
+  private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) {
+    if (!user.getActivated()) {
+      throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
+    }
+    List<GrantedAuthority> grantedAuthorities = user
+      .getAuthorities()
+      .stream()
+      .map(authority -> new SimpleGrantedAuthority(authority.getName()))
+      .collect(Collectors.toList());
+    return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), grantedAuthorities);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e4d195d4d993f497b5b921c5f168bdc1c71a946
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java
@@ -0,0 +1,79 @@
+package com.ippon.borestop.security;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+
+/**
+ * Utility class for Spring Security.
+ */
+public final class SecurityUtils {
+
+  private SecurityUtils() {}
+
+  /**
+   * Get the login of the current user.
+   *
+   * @return the login of the current user.
+   */
+  public static Optional<String> getCurrentUserLogin() {
+    SecurityContext securityContext = SecurityContextHolder.getContext();
+    return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication()));
+  }
+
+  private static String extractPrincipal(Authentication authentication) {
+    if (authentication == null) {
+      return null;
+    } else if (authentication.getPrincipal() instanceof UserDetails) {
+      UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal();
+      return springSecurityUser.getUsername();
+    } else if (authentication.getPrincipal() instanceof String) {
+      return (String) authentication.getPrincipal();
+    }
+    return null;
+  }
+
+  /**
+   * Get the JWT of the current user.
+   *
+   * @return the JWT of the current user.
+   */
+  public static Optional<String> getCurrentUserJWT() {
+    SecurityContext securityContext = SecurityContextHolder.getContext();
+    return Optional
+      .ofNullable(securityContext.getAuthentication())
+      .filter(authentication -> authentication.getCredentials() instanceof String)
+      .map(authentication -> (String) authentication.getCredentials());
+  }
+
+  /**
+   * Check if a user is authenticated.
+   *
+   * @return true if the user is authenticated, false otherwise.
+   */
+  public static boolean isAuthenticated() {
+    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+    return authentication != null && getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals);
+  }
+
+  /**
+   * If the current user has a specific authority (security role).
+   * <p>
+   * The name of this method comes from the {@code isUserInRole()} method in the Servlet API.
+   *
+   * @param authority the authority to check.
+   * @return true if the current user has the authority, false otherwise.
+   */
+  public static boolean isCurrentUserInRole(String authority) {
+    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+    return authentication != null && getAuthorities(authentication).anyMatch(authority::equals);
+  }
+
+  private static Stream<String> getAuthorities(Authentication authentication) {
+    return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java
new file mode 100644
index 0000000000000000000000000000000000000000..13ec4606e0dc2f485d772a7c7d488cb7733496a7
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java
@@ -0,0 +1,18 @@
+package com.ippon.borestop.security;
+
+import com.ippon.borestop.config.Constants;
+import java.util.Optional;
+import org.springframework.data.domain.AuditorAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implementation of {@link AuditorAware} based on Spring Security.
+ */
+@Component
+public class SpringSecurityAuditorAware implements AuditorAware<String> {
+
+  @Override
+  public Optional<String> getCurrentAuditor() {
+    return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT));
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa2e1cc0a6245e1c13293f70966ada7f8477b17e
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java
@@ -0,0 +1,18 @@
+package com.ippon.borestop.security;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * This exception is thrown in case of a not activated user trying to authenticate.
+ */
+public class UserNotActivatedException extends AuthenticationException {
+  private static final long serialVersionUID = 1L;
+
+  public UserNotActivatedException(String message) {
+    super(message);
+  }
+
+  public UserNotActivatedException(String message, Throwable t) {
+    super(message, t);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java
new file mode 100644
index 0000000000000000000000000000000000000000..796f38b7af9a58b50edd6d081c958024c7b98aae
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java
@@ -0,0 +1,20 @@
+package com.ippon.borestop.security.jwt;
+
+import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.DefaultSecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
+  private final TokenProvider tokenProvider;
+
+  public JWTConfigurer(TokenProvider tokenProvider) {
+    this.tokenProvider = tokenProvider;
+  }
+
+  @Override
+  public void configure(HttpSecurity http) {
+    JWTFilter customFilter = new JWTFilter(tokenProvider);
+    http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..163363037c49637595ddb12faf689f0f86411334
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java
@@ -0,0 +1,46 @@
+package com.ippon.borestop.security.jwt;
+
+import java.io.IOException;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.GenericFilterBean;
+
+/**
+ * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is
+ * found.
+ */
+public class JWTFilter extends GenericFilterBean {
+  public static final String AUTHORIZATION_HEADER = "Authorization";
+
+  private final TokenProvider tokenProvider;
+
+  public JWTFilter(TokenProvider tokenProvider) {
+    this.tokenProvider = tokenProvider;
+  }
+
+  @Override
+  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+    throws IOException, ServletException {
+    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+    String jwt = resolveToken(httpServletRequest);
+    if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
+      Authentication authentication = this.tokenProvider.getAuthentication(jwt);
+      SecurityContextHolder.getContext().setAuthentication(authentication);
+    }
+    filterChain.doFilter(servletRequest, servletResponse);
+  }
+
+  private String resolveToken(HttpServletRequest request) {
+    String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
+    if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
+      return bearerToken.substring(7);
+    }
+    return null;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..77db1334d6d3ed71bced9c5600c981e2f0745e43
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java
@@ -0,0 +1,103 @@
+package com.ippon.borestop.security.jwt;
+
+import io.github.jhipster.config.JHipsterProperties;
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.security.Keys;
+import java.nio.charset.StandardCharsets;
+import java.security.Key;
+import java.util.*;
+import java.util.stream.Collectors;
+import javax.annotation.PostConstruct;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+@Component
+public class TokenProvider {
+  private final Logger log = LoggerFactory.getLogger(TokenProvider.class);
+
+  private static final String AUTHORITIES_KEY = "auth";
+
+  private Key key;
+
+  private long tokenValidityInMilliseconds;
+
+  private long tokenValidityInMillisecondsForRememberMe;
+
+  private final JHipsterProperties jHipsterProperties;
+
+  public TokenProvider(JHipsterProperties jHipsterProperties) {
+    this.jHipsterProperties = jHipsterProperties;
+  }
+
+  @PostConstruct
+  public void init() {
+    byte[] keyBytes;
+    String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret();
+    if (!StringUtils.isEmpty(secret)) {
+      log.warn(
+        "Warning: the JWT key used is not Base64-encoded. " +
+        "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security."
+      );
+      keyBytes = secret.getBytes(StandardCharsets.UTF_8);
+    } else {
+      log.debug("Using a Base64-encoded JWT secret key");
+      keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret());
+    }
+    this.key = Keys.hmacShaKeyFor(keyBytes);
+    this.tokenValidityInMilliseconds = 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds();
+    this.tokenValidityInMillisecondsForRememberMe =
+      1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSecondsForRememberMe();
+  }
+
+  public String createToken(Authentication authentication, boolean rememberMe) {
+    String authorities = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(","));
+
+    long now = (new Date()).getTime();
+    Date validity;
+    if (rememberMe) {
+      validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe);
+    } else {
+      validity = new Date(now + this.tokenValidityInMilliseconds);
+    }
+
+    return Jwts
+      .builder()
+      .setSubject(authentication.getName())
+      .claim(AUTHORITIES_KEY, authorities)
+      .signWith(key, SignatureAlgorithm.HS512)
+      .setExpiration(validity)
+      .compact();
+  }
+
+  public Authentication getAuthentication(String token) {
+    Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
+
+    Collection<? extends GrantedAuthority> authorities = Arrays
+      .stream(claims.get(AUTHORITIES_KEY).toString().split(","))
+      .map(SimpleGrantedAuthority::new)
+      .collect(Collectors.toList());
+
+    User principal = new User(claims.getSubject(), "", authorities);
+
+    return new UsernamePasswordAuthenticationToken(principal, token, authorities);
+  }
+
+  public boolean validateToken(String authToken) {
+    try {
+      Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken);
+      return true;
+    } catch (JwtException | IllegalArgumentException e) {
+      log.info("Invalid JWT token.");
+      log.trace("Invalid JWT token trace.", e);
+    }
+    return false;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/security/package-info.java b/borestop/src/main/java/com/ippon/borestop/security/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..34cdc24307ccdabd460add412df831c9adc6507c
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/security/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Spring Security configuration.
+ */
+package com.ippon.borestop.security;
diff --git a/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java
new file mode 100644
index 0000000000000000000000000000000000000000..337c2eb1591b4591c8cb397b2061a7505cd93060
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java
@@ -0,0 +1,77 @@
+package com.ippon.borestop.service;
+
+import com.ippon.borestop.config.audit.AuditEventConverter;
+import com.ippon.borestop.repository.PersistenceAuditEventRepository;
+import io.github.jhipster.config.JHipsterProperties;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.Optional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.actuate.audit.AuditEvent;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Service for managing audit events.
+ * <p>
+ * This is the default implementation to support SpringBoot Actuator {@code AuditEventRepository}.
+ */
+@Service
+@Transactional
+public class AuditEventService {
+  private final Logger log = LoggerFactory.getLogger(AuditEventService.class);
+
+  private final JHipsterProperties jHipsterProperties;
+
+  private final PersistenceAuditEventRepository persistenceAuditEventRepository;
+
+  private final AuditEventConverter auditEventConverter;
+
+  public AuditEventService(
+    PersistenceAuditEventRepository persistenceAuditEventRepository,
+    AuditEventConverter auditEventConverter,
+    JHipsterProperties jhipsterProperties
+  ) {
+    this.persistenceAuditEventRepository = persistenceAuditEventRepository;
+    this.auditEventConverter = auditEventConverter;
+    this.jHipsterProperties = jhipsterProperties;
+  }
+
+  /**
+   * Old audit events should be automatically deleted after 30 days.
+   *
+   * This is scheduled to get fired at 12:00 (am).
+   */
+  @Scheduled(cron = "0 0 12 * * ?")
+  public void removeOldAuditEvents() {
+    persistenceAuditEventRepository
+      .findByAuditEventDateBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS))
+      .forEach(
+        auditEvent -> {
+          log.debug("Deleting audit data {}", auditEvent);
+          persistenceAuditEventRepository.delete(auditEvent);
+        }
+      );
+  }
+
+  @Transactional(readOnly = true)
+  public Page<AuditEvent> findAll(Pageable pageable) {
+    return persistenceAuditEventRepository.findAll(pageable).map(auditEventConverter::convertToAuditEvent);
+  }
+
+  @Transactional(readOnly = true)
+  public Page<AuditEvent> findByDates(Instant fromDate, Instant toDate, Pageable pageable) {
+    return persistenceAuditEventRepository
+      .findAllByAuditEventDateBetween(fromDate, toDate, pageable)
+      .map(auditEventConverter::convertToAuditEvent);
+  }
+
+  @Transactional(readOnly = true)
+  public Optional<AuditEvent> find(Long id) {
+    return persistenceAuditEventRepository.findById(id).map(auditEventConverter::convertToAuditEvent);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..49a051ca0586fcb27b15062fa559319e7f3dd99e
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.service;
+
+public class EmailAlreadyUsedException extends RuntimeException {
+  private static final long serialVersionUID = 1L;
+
+  public EmailAlreadyUsedException() {
+    super("Email is already in use!");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java
new file mode 100644
index 0000000000000000000000000000000000000000..731f85c6b3fc2c6c56a14410ada7b4392f93706e
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.service;
+
+public class InvalidPasswordException extends RuntimeException {
+  private static final long serialVersionUID = 1L;
+
+  public InvalidPasswordException() {
+    super("Incorrect password");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/MailService.java b/borestop/src/main/java/com/ippon/borestop/service/MailService.java
new file mode 100644
index 0000000000000000000000000000000000000000..72e3f2625fa1dca90a05e9f3845425a495809452
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/MailService.java
@@ -0,0 +1,111 @@
+package com.ippon.borestop.service;
+
+import com.ippon.borestop.domain.User;
+import io.github.jhipster.config.JHipsterProperties;
+import java.nio.charset.StandardCharsets;
+import java.util.Locale;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.MessageSource;
+import org.springframework.mail.MailException;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.spring5.SpringTemplateEngine;
+
+/**
+ * Service for sending emails.
+ * <p>
+ * We use the {@link Async} annotation to send emails asynchronously.
+ */
+@Service
+public class MailService {
+  private final Logger log = LoggerFactory.getLogger(MailService.class);
+
+  private static final String USER = "user";
+
+  private static final String BASE_URL = "baseUrl";
+
+  private final JHipsterProperties jHipsterProperties;
+
+  private final JavaMailSender javaMailSender;
+
+  private final MessageSource messageSource;
+
+  private final SpringTemplateEngine templateEngine;
+
+  public MailService(
+    JHipsterProperties jHipsterProperties,
+    JavaMailSender javaMailSender,
+    MessageSource messageSource,
+    SpringTemplateEngine templateEngine
+  ) {
+    this.jHipsterProperties = jHipsterProperties;
+    this.javaMailSender = javaMailSender;
+    this.messageSource = messageSource;
+    this.templateEngine = templateEngine;
+  }
+
+  @Async
+  public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
+    log.debug(
+      "Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}",
+      isMultipart,
+      isHtml,
+      to,
+      subject,
+      content
+    );
+
+    // Prepare message using a Spring helper
+    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
+    try {
+      MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name());
+      message.setTo(to);
+      message.setFrom(jHipsterProperties.getMail().getFrom());
+      message.setSubject(subject);
+      message.setText(content, isHtml);
+      javaMailSender.send(mimeMessage);
+      log.debug("Sent email to User '{}'", to);
+    } catch (MailException | MessagingException e) {
+      log.warn("Email could not be sent to user '{}'", to, e);
+    }
+  }
+
+  @Async
+  public void sendEmailFromTemplate(User user, String templateName, String titleKey) {
+    if (user.getEmail() == null) {
+      log.debug("Email doesn't exist for user '{}'", user.getLogin());
+      return;
+    }
+    Locale locale = Locale.forLanguageTag(user.getLangKey());
+    Context context = new Context(locale);
+    context.setVariable(USER, user);
+    context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
+    String content = templateEngine.process(templateName, context);
+    String subject = messageSource.getMessage(titleKey, null, locale);
+    sendEmail(user.getEmail(), subject, content, false, true);
+  }
+
+  @Async
+  public void sendActivationEmail(User user) {
+    log.debug("Sending activation email to '{}'", user.getEmail());
+    sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title");
+  }
+
+  @Async
+  public void sendCreationEmail(User user) {
+    log.debug("Sending creation email to '{}'", user.getEmail());
+    sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title");
+  }
+
+  @Async
+  public void sendPasswordResetMail(User user) {
+    log.debug("Sending password reset email to '{}'", user.getEmail());
+    sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/UserService.java b/borestop/src/main/java/com/ippon/borestop/service/UserService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3a5d2c44232ed677705e264a34d51ab6b0958ec
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/UserService.java
@@ -0,0 +1,313 @@
+package com.ippon.borestop.service;
+
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.Authority;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.AuthorityRepository;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.security.AuthoritiesConstants;
+import com.ippon.borestop.security.SecurityUtils;
+import com.ippon.borestop.service.dto.UserDTO;
+import io.github.jhipster.security.RandomUtil;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Service class for managing users.
+ */
+@Service
+@Transactional
+public class UserService {
+  private final Logger log = LoggerFactory.getLogger(UserService.class);
+
+  private final UserRepository userRepository;
+
+  private final PasswordEncoder passwordEncoder;
+
+  private final AuthorityRepository authorityRepository;
+
+  public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder, AuthorityRepository authorityRepository) {
+    this.userRepository = userRepository;
+    this.passwordEncoder = passwordEncoder;
+    this.authorityRepository = authorityRepository;
+  }
+
+  public Optional<User> activateRegistration(String key) {
+    log.debug("Activating user for activation key {}", key);
+    return userRepository
+      .findOneByActivationKey(key)
+      .map(
+        user -> {
+          // activate given user for the registration key.
+          user.setActivated(true);
+          user.setActivationKey(null);
+          log.debug("Activated user: {}", user);
+          return user;
+        }
+      );
+  }
+
+  public Optional<User> completePasswordReset(String newPassword, String key) {
+    log.debug("Reset user password for reset key {}", key);
+    return userRepository
+      .findOneByResetKey(key)
+      .filter(user -> user.getResetDate().isAfter(Instant.now().minusSeconds(86400)))
+      .map(
+        user -> {
+          user.setPassword(passwordEncoder.encode(newPassword));
+          user.setResetKey(null);
+          user.setResetDate(null);
+          return user;
+        }
+      );
+  }
+
+  public Optional<User> requestPasswordReset(String mail) {
+    return userRepository
+      .findOneByEmailIgnoreCase(mail)
+      .filter(User::getActivated)
+      .map(
+        user -> {
+          user.setResetKey(RandomUtil.generateResetKey());
+          user.setResetDate(Instant.now());
+          return user;
+        }
+      );
+  }
+
+  public User registerUser(UserDTO userDTO, String password) {
+    userRepository
+      .findOneByLogin(userDTO.getLogin().toLowerCase())
+      .ifPresent(
+        existingUser -> {
+          boolean removed = removeNonActivatedUser(existingUser);
+          if (!removed) {
+            throw new UsernameAlreadyUsedException();
+          }
+        }
+      );
+    userRepository
+      .findOneByEmailIgnoreCase(userDTO.getEmail())
+      .ifPresent(
+        existingUser -> {
+          boolean removed = removeNonActivatedUser(existingUser);
+          if (!removed) {
+            throw new EmailAlreadyUsedException();
+          }
+        }
+      );
+    User newUser = new User();
+    String encryptedPassword = passwordEncoder.encode(password);
+    newUser.setLogin(userDTO.getLogin().toLowerCase());
+
+    // new user gets initially a generated password
+    newUser.setPassword(encryptedPassword);
+    newUser.setFirstName(userDTO.getFirstName());
+    newUser.setLastName(userDTO.getLastName());
+    if (userDTO.getEmail() != null) {
+      newUser.setEmail(userDTO.getEmail().toLowerCase());
+    }
+    newUser.setImageUrl(userDTO.getImageUrl());
+    newUser.setLangKey(userDTO.getLangKey());
+
+    // new user is not active
+    newUser.setActivated(false);
+
+    // new user gets registration key
+    newUser.setActivationKey(RandomUtil.generateActivationKey());
+    Set<Authority> authorities = new HashSet<>();
+    authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add);
+    newUser.setAuthorities(authorities);
+    userRepository.save(newUser);
+    log.debug("Created Information for User: {}", newUser);
+    return newUser;
+  }
+
+  private boolean removeNonActivatedUser(User existingUser) {
+    if (existingUser.getActivated()) {
+      return false;
+    }
+    userRepository.delete(existingUser);
+    userRepository.flush();
+    return true;
+  }
+
+  public User createUser(UserDTO userDTO) {
+    User user = new User();
+    user.setLogin(userDTO.getLogin().toLowerCase());
+    user.setFirstName(userDTO.getFirstName());
+    user.setLastName(userDTO.getLastName());
+    if (userDTO.getEmail() != null) {
+      user.setEmail(userDTO.getEmail().toLowerCase());
+    }
+    user.setImageUrl(userDTO.getImageUrl());
+    if (userDTO.getLangKey() == null) {
+      user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language
+    } else {
+      user.setLangKey(userDTO.getLangKey());
+    }
+    String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword());
+    user.setPassword(encryptedPassword);
+    user.setResetKey(RandomUtil.generateResetKey());
+    user.setResetDate(Instant.now());
+    user.setActivated(true);
+    if (userDTO.getAuthorities() != null) {
+      Set<Authority> authorities = userDTO
+        .getAuthorities()
+        .stream()
+        .map(authorityRepository::findById)
+        .filter(Optional::isPresent)
+        .map(Optional::get)
+        .collect(Collectors.toSet());
+      user.setAuthorities(authorities);
+    }
+    userRepository.save(user);
+    log.debug("Created Information for User: {}", user);
+    return user;
+  }
+
+  /**
+   * Update all information for a specific user, and return the modified user.
+   *
+   * @param userDTO user to update.
+   * @return updated user.
+   */
+  public Optional<UserDTO> updateUser(UserDTO userDTO) {
+    return Optional
+      .of(userRepository.findById(userDTO.getId()))
+      .filter(Optional::isPresent)
+      .map(Optional::get)
+      .map(
+        user -> {
+          user.setLogin(userDTO.getLogin().toLowerCase());
+          user.setFirstName(userDTO.getFirstName());
+          user.setLastName(userDTO.getLastName());
+          if (userDTO.getEmail() != null) {
+            user.setEmail(userDTO.getEmail().toLowerCase());
+          }
+          user.setImageUrl(userDTO.getImageUrl());
+          user.setActivated(userDTO.isActivated());
+          user.setLangKey(userDTO.getLangKey());
+          Set<Authority> managedAuthorities = user.getAuthorities();
+          managedAuthorities.clear();
+          userDTO
+            .getAuthorities()
+            .stream()
+            .map(authorityRepository::findById)
+            .filter(Optional::isPresent)
+            .map(Optional::get)
+            .forEach(managedAuthorities::add);
+          log.debug("Changed Information for User: {}", user);
+          return user;
+        }
+      )
+      .map(UserDTO::new);
+  }
+
+  public void deleteUser(String login) {
+    userRepository
+      .findOneByLogin(login)
+      .ifPresent(
+        user -> {
+          userRepository.delete(user);
+          log.debug("Deleted User: {}", user);
+        }
+      );
+  }
+
+  /**
+   * Update basic information (first name, last name, email, language) for the current user.
+   *
+   * @param firstName first name of user.
+   * @param lastName  last name of user.
+   * @param email     email id of user.
+   * @param langKey   language key.
+   * @param imageUrl  image URL of user.
+   */
+  public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) {
+    SecurityUtils
+      .getCurrentUserLogin()
+      .flatMap(userRepository::findOneByLogin)
+      .ifPresent(
+        user -> {
+          user.setFirstName(firstName);
+          user.setLastName(lastName);
+          if (email != null) {
+            user.setEmail(email.toLowerCase());
+          }
+          user.setLangKey(langKey);
+          user.setImageUrl(imageUrl);
+          log.debug("Changed Information for User: {}", user);
+        }
+      );
+  }
+
+  @Transactional
+  public void changePassword(String currentClearTextPassword, String newPassword) {
+    SecurityUtils
+      .getCurrentUserLogin()
+      .flatMap(userRepository::findOneByLogin)
+      .ifPresent(
+        user -> {
+          String currentEncryptedPassword = user.getPassword();
+          if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) {
+            throw new InvalidPasswordException();
+          }
+          String encryptedPassword = passwordEncoder.encode(newPassword);
+          user.setPassword(encryptedPassword);
+          log.debug("Changed password for User: {}", user);
+        }
+      );
+  }
+
+  @Transactional(readOnly = true)
+  public Page<UserDTO> getAllManagedUsers(Pageable pageable) {
+    return userRepository.findAllByLoginNot(pageable, Constants.ANONYMOUS_USER).map(UserDTO::new);
+  }
+
+  @Transactional(readOnly = true)
+  public Optional<User> getUserWithAuthoritiesByLogin(String login) {
+    return userRepository.findOneWithAuthoritiesByLogin(login);
+  }
+
+  @Transactional(readOnly = true)
+  public Optional<User> getUserWithAuthorities() {
+    return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin);
+  }
+
+  /**
+   * Not activated users should be automatically deleted after 3 days.
+   * <p>
+   * This is scheduled to get fired everyday, at 01:00 (am).
+   */
+  @Scheduled(cron = "0 0 1 * * ?")
+  public void removeNotActivatedUsers() {
+    userRepository
+      .findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS))
+      .forEach(
+        user -> {
+          log.debug("Deleting not activated user {}", user.getLogin());
+          userRepository.delete(user);
+        }
+      );
+  }
+
+  /**
+   * Gets a list of all the authorities.
+   * @return a list of all the authorities.
+   */
+  @Transactional(readOnly = true)
+  public List<String> getAuthorities() {
+    return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList());
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecef27e2f63a9dea8aafd12a1e9eb897e02bc7d9
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.service;
+
+public class UsernameAlreadyUsedException extends RuntimeException {
+  private static final long serialVersionUID = 1L;
+
+  public UsernameAlreadyUsedException() {
+    super("Login name already used!");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..6243b6d5e733060c704792e1b05976cbf9de803f
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java
@@ -0,0 +1,34 @@
+package com.ippon.borestop.service.dto;
+
+/**
+ * A DTO representing a password change required data - current and new password.
+ */
+public class PasswordChangeDTO {
+  private String currentPassword;
+  private String newPassword;
+
+  public PasswordChangeDTO() {
+    // Empty constructor needed for Jackson.
+  }
+
+  public PasswordChangeDTO(String currentPassword, String newPassword) {
+    this.currentPassword = currentPassword;
+    this.newPassword = newPassword;
+  }
+
+  public String getCurrentPassword() {
+    return currentPassword;
+  }
+
+  public void setCurrentPassword(String currentPassword) {
+    this.currentPassword = currentPassword;
+  }
+
+  public String getNewPassword() {
+    return newPassword;
+  }
+
+  public void setNewPassword(String newPassword) {
+    this.newPassword = newPassword;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..730c85e1fd4b7e370bdb8baa42e5ece31d9f7176
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java
@@ -0,0 +1,192 @@
+package com.ippon.borestop.service.dto;
+
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.Authority;
+import com.ippon.borestop.domain.User;
+import java.time.Instant;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.validation.constraints.*;
+
+/**
+ * A DTO representing a user, with his authorities.
+ */
+public class UserDTO {
+  private Long id;
+
+  @NotBlank
+  @Pattern(regexp = Constants.LOGIN_REGEX)
+  @Size(min = 1, max = 50)
+  private String login;
+
+  @Size(max = 50)
+  private String firstName;
+
+  @Size(max = 50)
+  private String lastName;
+
+  @Email
+  @Size(min = 5, max = 254)
+  private String email;
+
+  @Size(max = 256)
+  private String imageUrl;
+
+  private boolean activated = false;
+
+  @Size(min = 2, max = 10)
+  private String langKey;
+
+  private String createdBy;
+
+  private Instant createdDate;
+
+  private String lastModifiedBy;
+
+  private Instant lastModifiedDate;
+
+  private Set<String> authorities;
+
+  public UserDTO() {
+    // Empty constructor needed for Jackson.
+  }
+
+  public UserDTO(User user) {
+    this.id = user.getId();
+    this.login = user.getLogin();
+    this.firstName = user.getFirstName();
+    this.lastName = user.getLastName();
+    this.email = user.getEmail();
+    this.activated = user.getActivated();
+    this.imageUrl = user.getImageUrl();
+    this.langKey = user.getLangKey();
+    this.createdBy = user.getCreatedBy();
+    this.createdDate = user.getCreatedDate();
+    this.lastModifiedBy = user.getLastModifiedBy();
+    this.lastModifiedDate = user.getLastModifiedDate();
+    this.authorities = user.getAuthorities().stream().map(Authority::getName).collect(Collectors.toSet());
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getLogin() {
+    return login;
+  }
+
+  public void setLogin(String login) {
+    this.login = login;
+  }
+
+  public String getFirstName() {
+    return firstName;
+  }
+
+  public void setFirstName(String firstName) {
+    this.firstName = firstName;
+  }
+
+  public String getLastName() {
+    return lastName;
+  }
+
+  public void setLastName(String lastName) {
+    this.lastName = lastName;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
+  public String getImageUrl() {
+    return imageUrl;
+  }
+
+  public void setImageUrl(String imageUrl) {
+    this.imageUrl = imageUrl;
+  }
+
+  public boolean isActivated() {
+    return activated;
+  }
+
+  public void setActivated(boolean activated) {
+    this.activated = activated;
+  }
+
+  public String getLangKey() {
+    return langKey;
+  }
+
+  public void setLangKey(String langKey) {
+    this.langKey = langKey;
+  }
+
+  public String getCreatedBy() {
+    return createdBy;
+  }
+
+  public void setCreatedBy(String createdBy) {
+    this.createdBy = createdBy;
+  }
+
+  public Instant getCreatedDate() {
+    return createdDate;
+  }
+
+  public void setCreatedDate(Instant createdDate) {
+    this.createdDate = createdDate;
+  }
+
+  public String getLastModifiedBy() {
+    return lastModifiedBy;
+  }
+
+  public void setLastModifiedBy(String lastModifiedBy) {
+    this.lastModifiedBy = lastModifiedBy;
+  }
+
+  public Instant getLastModifiedDate() {
+    return lastModifiedDate;
+  }
+
+  public void setLastModifiedDate(Instant lastModifiedDate) {
+    this.lastModifiedDate = lastModifiedDate;
+  }
+
+  public Set<String> getAuthorities() {
+    return authorities;
+  }
+
+  public void setAuthorities(Set<String> authorities) {
+    this.authorities = authorities;
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "UserDTO{" +
+            "login='" + login + '\'' +
+            ", firstName='" + firstName + '\'' +
+            ", lastName='" + lastName + '\'' +
+            ", email='" + email + '\'' +
+            ", imageUrl='" + imageUrl + '\'' +
+            ", activated=" + activated +
+            ", langKey='" + langKey + '\'' +
+            ", createdBy=" + createdBy +
+            ", createdDate=" + createdDate +
+            ", lastModifiedBy='" + lastModifiedBy + '\'' +
+            ", lastModifiedDate=" + lastModifiedDate +
+            ", authorities=" + authorities +
+            "}";
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9364fad1acceefd343bc41e4e428d0f3b217434
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Data Transfer Objects.
+ */
+package com.ippon.borestop.service.dto;
diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..91922e6c3a86ebc1eca0bc9c2e246e8a40c4331a
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java
@@ -0,0 +1,78 @@
+package com.ippon.borestop.service.mapper;
+
+import com.ippon.borestop.domain.Authority;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.service.dto.UserDTO;
+import java.util.*;
+import java.util.stream.Collectors;
+import org.springframework.stereotype.Service;
+
+/**
+ * Mapper for the entity {@link User} and its DTO called {@link UserDTO}.
+ *
+ * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct
+ * support is still in beta, and requires a manual step with an IDE.
+ */
+@Service
+public class UserMapper {
+
+  public List<UserDTO> usersToUserDTOs(List<User> users) {
+    return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList());
+  }
+
+  public UserDTO userToUserDTO(User user) {
+    return new UserDTO(user);
+  }
+
+  public List<User> userDTOsToUsers(List<UserDTO> userDTOs) {
+    return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList());
+  }
+
+  public User userDTOToUser(UserDTO userDTO) {
+    if (userDTO == null) {
+      return null;
+    } else {
+      User user = new User();
+      user.setId(userDTO.getId());
+      user.setLogin(userDTO.getLogin());
+      user.setFirstName(userDTO.getFirstName());
+      user.setLastName(userDTO.getLastName());
+      user.setEmail(userDTO.getEmail());
+      user.setImageUrl(userDTO.getImageUrl());
+      user.setActivated(userDTO.isActivated());
+      user.setLangKey(userDTO.getLangKey());
+      Set<Authority> authorities = this.authoritiesFromStrings(userDTO.getAuthorities());
+      user.setAuthorities(authorities);
+      return user;
+    }
+  }
+
+  private Set<Authority> authoritiesFromStrings(Set<String> authoritiesAsString) {
+    Set<Authority> authorities = new HashSet<>();
+
+    if (authoritiesAsString != null) {
+      authorities =
+        authoritiesAsString
+          .stream()
+          .map(
+            string -> {
+              Authority auth = new Authority();
+              auth.setName(string);
+              return auth;
+            }
+          )
+          .collect(Collectors.toSet());
+    }
+
+    return authorities;
+  }
+
+  public User userFromId(Long id) {
+    if (id == null) {
+      return null;
+    }
+    User user = new User();
+    user.setId(id);
+    return user;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc1386b7d792e08b7978da21c943d67f22d5414f
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * MapStruct mappers for mapping domain objects and Data Transfer Objects.
+ */
+package com.ippon.borestop.service.mapper;
diff --git a/borestop/src/main/java/com/ippon/borestop/service/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..d47ab40f3a7c86d94be8251d042437e016f6775f
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/service/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Service layer beans.
+ */
+package com.ippon.borestop.service;
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7f2a339d0ef0bfc347b514e832235ec11597970
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java
@@ -0,0 +1,186 @@
+package com.ippon.borestop.web.rest;
+
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.security.SecurityUtils;
+import com.ippon.borestop.service.MailService;
+import com.ippon.borestop.service.UserService;
+import com.ippon.borestop.service.dto.PasswordChangeDTO;
+import com.ippon.borestop.service.dto.UserDTO;
+import com.ippon.borestop.web.rest.errors.*;
+import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM;
+import com.ippon.borestop.web.rest.vm.ManagedUserVM;
+import java.util.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * REST controller for managing the current user's account.
+ */
+@RestController
+@RequestMapping("/api")
+public class AccountResource {
+
+  private static class AccountResourceException extends RuntimeException {
+
+    private AccountResourceException(String message) {
+      super(message);
+    }
+  }
+
+  private final Logger log = LoggerFactory.getLogger(AccountResource.class);
+
+  private final UserRepository userRepository;
+
+  private final UserService userService;
+
+  private final MailService mailService;
+
+  public AccountResource(UserRepository userRepository, UserService userService, MailService mailService) {
+    this.userRepository = userRepository;
+    this.userService = userService;
+    this.mailService = mailService;
+  }
+
+  /**
+   * {@code POST  /register} : register the user.
+   *
+   * @param managedUserVM the managed user View Model.
+   * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect.
+   * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used.
+   * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already used.
+   */
+  @PostMapping("/register")
+  @ResponseStatus(HttpStatus.CREATED)
+  public void registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) {
+    if (!checkPasswordLength(managedUserVM.getPassword())) {
+      throw new InvalidPasswordException();
+    }
+    User user = userService.registerUser(managedUserVM, managedUserVM.getPassword());
+    mailService.sendActivationEmail(user);
+  }
+
+  /**
+   * {@code GET  /activate} : activate the registered user.
+   *
+   * @param key the activation key.
+   * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be activated.
+   */
+  @GetMapping("/activate")
+  public void activateAccount(@RequestParam(value = "key") String key) {
+    Optional<User> user = userService.activateRegistration(key);
+    if (!user.isPresent()) {
+      throw new AccountResourceException("No user was found for this activation key");
+    }
+  }
+
+  /**
+   * {@code GET  /authenticate} : check if the user is authenticated, and return its login.
+   *
+   * @param request the HTTP request.
+   * @return the login if the user is authenticated.
+   */
+  @GetMapping("/authenticate")
+  public String isAuthenticated(HttpServletRequest request) {
+    log.debug("REST request to check if the current user is authenticated");
+    return request.getRemoteUser();
+  }
+
+  /**
+   * {@code GET  /account} : get the current user.
+   *
+   * @return the current user.
+   * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be returned.
+   */
+  @GetMapping("/account")
+  public UserDTO getAccount() {
+    return userService
+      .getUserWithAuthorities()
+      .map(UserDTO::new)
+      .orElseThrow(() -> new AccountResourceException("User could not be found"));
+  }
+
+  /**
+   * {@code POST  /account} : update the current user information.
+   *
+   * @param userDTO the current user information.
+   * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used.
+   * @throws RuntimeException {@code 500 (Internal Server Error)} if the user login wasn't found.
+   */
+  @PostMapping("/account")
+  public void saveAccount(@Valid @RequestBody UserDTO userDTO) {
+    String userLogin = SecurityUtils.getCurrentUserLogin().orElseThrow(() -> new AccountResourceException("Current user login not found"));
+    Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail());
+    if (existingUser.isPresent() && (!existingUser.get().getLogin().equalsIgnoreCase(userLogin))) {
+      throw new EmailAlreadyUsedException();
+    }
+    Optional<User> user = userRepository.findOneByLogin(userLogin);
+    if (!user.isPresent()) {
+      throw new AccountResourceException("User could not be found");
+    }
+    userService.updateUser(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), userDTO.getLangKey(), userDTO.getImageUrl());
+  }
+
+  /**
+   * {@code POST  /account/change-password} : changes the current user's password.
+   *
+   * @param passwordChangeDto current and new password.
+   * @throws InvalidPasswordException {@code 400 (Bad Request)} if the new password is incorrect.
+   */
+  @PostMapping(path = "/account/change-password")
+  public void changePassword(@RequestBody PasswordChangeDTO passwordChangeDto) {
+    if (!checkPasswordLength(passwordChangeDto.getNewPassword())) {
+      throw new InvalidPasswordException();
+    }
+    userService.changePassword(passwordChangeDto.getCurrentPassword(), passwordChangeDto.getNewPassword());
+  }
+
+  /**
+   * {@code POST   /account/reset-password/init} : Send an email to reset the password of the user.
+   *
+   * @param mail the mail of the user.
+   */
+  @PostMapping(path = "/account/reset-password/init")
+  public void requestPasswordReset(@RequestBody String mail) {
+    Optional<User> user = userService.requestPasswordReset(mail);
+    if (user.isPresent()) {
+      mailService.sendPasswordResetMail(user.get());
+    } else {
+      // Pretend the request has been successful to prevent checking which emails really exist
+      // but log that an invalid attempt has been made
+      log.warn("Password reset requested for non existing mail");
+    }
+  }
+
+  /**
+   * {@code POST   /account/reset-password/finish} : Finish to reset the password of the user.
+   *
+   * @param keyAndPassword the generated key and the new password.
+   * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect.
+   * @throws RuntimeException {@code 500 (Internal Server Error)} if the password could not be reset.
+   */
+  @PostMapping(path = "/account/reset-password/finish")
+  public void finishPasswordReset(@RequestBody KeyAndPasswordVM keyAndPassword) {
+    if (!checkPasswordLength(keyAndPassword.getNewPassword())) {
+      throw new InvalidPasswordException();
+    }
+    Optional<User> user = userService.completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey());
+
+    if (!user.isPresent()) {
+      throw new AccountResourceException("No user was found for this reset key");
+    }
+  }
+
+  private static boolean checkPasswordLength(String password) {
+    return (
+      !StringUtils.isEmpty(password) &&
+      password.length() >= ManagedUserVM.PASSWORD_MIN_LENGTH &&
+      password.length() <= ManagedUserVM.PASSWORD_MAX_LENGTH
+    );
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..eadb1438eea9e1948c1a2d0cdb96a66f4054dd0b
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java
@@ -0,0 +1,76 @@
+package com.ippon.borestop.web.rest;
+
+import com.ippon.borestop.service.AuditEventService;
+import io.github.jhipster.web.util.PaginationUtil;
+import io.github.jhipster.web.util.ResponseUtil;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.List;
+import org.springframework.boot.actuate.audit.AuditEvent;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+/**
+ * REST controller for getting the {@link AuditEvent}s.
+ */
+@RestController
+@RequestMapping("/management/audits")
+public class AuditResource {
+  private final AuditEventService auditEventService;
+
+  public AuditResource(AuditEventService auditEventService) {
+    this.auditEventService = auditEventService;
+  }
+
+  /**
+   * {@code GET /audits} : get a page of {@link AuditEvent}s.
+   *
+   * @param pageable the pagination information.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent}s in body.
+   */
+  @GetMapping
+  public ResponseEntity<List<AuditEvent>> getAll(Pageable pageable) {
+    Page<AuditEvent> page = auditEventService.findAll(pageable);
+    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
+    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
+  }
+
+  /**
+   * {@code GET  /audits} : get a page of {@link AuditEvent} between the {@code fromDate} and {@code toDate}.
+   *
+   * @param fromDate the start of the time period of {@link AuditEvent} to get.
+   * @param toDate the end of the time period of {@link AuditEvent} to get.
+   * @param pageable the pagination information.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent} in body.
+   */
+  @GetMapping(params = { "fromDate", "toDate" })
+  public ResponseEntity<List<AuditEvent>> getByDates(
+    @RequestParam(value = "fromDate") LocalDate fromDate,
+    @RequestParam(value = "toDate") LocalDate toDate,
+    Pageable pageable
+  ) {
+    Instant from = fromDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
+    Instant to = toDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant();
+
+    Page<AuditEvent> page = auditEventService.findByDates(from, to, pageable);
+    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
+    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
+  }
+
+  /**
+   * {@code GET  /audits/:id} : get an {@link AuditEvent} by id.
+   *
+   * @param id the id of the entity to get.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the {@link AuditEvent} in body, or status {@code 404 (Not Found)}.
+   */
+  @GetMapping("/{id:.+}")
+  public ResponseEntity<AuditEvent> get(@PathVariable Long id) {
+    return ResponseUtil.wrapOrNotFound(auditEventService.find(id));
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5ea63d4351c545a3481dc30b20b753f131299c9
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java
@@ -0,0 +1,17 @@
+package com.ippon.borestop.web.rest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class ClientForwardController {
+
+  /**
+   * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}.
+   * @return forward to client {@code index.html}.
+   */
+  @GetMapping(value = "/**/{path:[^\\.]*}")
+  public String forward() {
+    return "forward:/";
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2a6aa375e71cc745bd8b3d334b6fcd9e9b3b486
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java
@@ -0,0 +1,67 @@
+package com.ippon.borestop.web.rest;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ippon.borestop.security.jwt.JWTFilter;
+import com.ippon.borestop.security.jwt.TokenProvider;
+import com.ippon.borestop.web.rest.vm.LoginVM;
+import javax.validation.Valid;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Controller to authenticate users.
+ */
+@RestController
+@RequestMapping("/api")
+public class UserJWTController {
+  private final TokenProvider tokenProvider;
+
+  private final AuthenticationManagerBuilder authenticationManagerBuilder;
+
+  public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) {
+    this.tokenProvider = tokenProvider;
+    this.authenticationManagerBuilder = authenticationManagerBuilder;
+  }
+
+  @PostMapping("/authenticate")
+  public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {
+    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
+      loginVM.getUsername(),
+      loginVM.getPassword()
+    );
+
+    Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
+    SecurityContextHolder.getContext().setAuthentication(authentication);
+    boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
+    String jwt = tokenProvider.createToken(authentication, rememberMe);
+    HttpHeaders httpHeaders = new HttpHeaders();
+    httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
+    return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
+  }
+
+  /**
+   * Object to return as body in JWT Authentication.
+   */
+  static class JWTToken {
+    private String idToken;
+
+    JWTToken(String idToken) {
+      this.idToken = idToken;
+    }
+
+    @JsonProperty("id_token")
+    String getIdToken() {
+      return idToken;
+    }
+
+    void setIdToken(String idToken) {
+      this.idToken = idToken;
+    }
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f84615baa86387bfadb16c271a1944d94cf0ffa
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java
@@ -0,0 +1,183 @@
+package com.ippon.borestop.web.rest;
+
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.security.AuthoritiesConstants;
+import com.ippon.borestop.service.MailService;
+import com.ippon.borestop.service.UserService;
+import com.ippon.borestop.service.dto.UserDTO;
+import com.ippon.borestop.web.rest.errors.BadRequestAlertException;
+import com.ippon.borestop.web.rest.errors.EmailAlreadyUsedException;
+import com.ippon.borestop.web.rest.errors.LoginAlreadyUsedException;
+import io.github.jhipster.web.util.HeaderUtil;
+import io.github.jhipster.web.util.PaginationUtil;
+import io.github.jhipster.web.util.ResponseUtil;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.*;
+import javax.validation.Valid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+/**
+ * REST controller for managing users.
+ * <p>
+ * This class accesses the {@link User} entity, and needs to fetch its collection of authorities.
+ * <p>
+ * For a normal use-case, it would be better to have an eager relationship between User and Authority,
+ * and send everything to the client side: there would be no View Model and DTO, a lot less code, and an outer-join
+ * which would be good for performance.
+ * <p>
+ * We use a View Model and a DTO for 3 reasons:
+ * <ul>
+ * <li>We want to keep a lazy association between the user and the authorities, because people will
+ * quite often do relationships with the user, and we don't want them to get the authorities all
+ * the time for nothing (for performance reasons). This is the #1 goal: we should not impact our users'
+ * application because of this use-case.</li>
+ * <li> Not having an outer join causes n+1 requests to the database. This is not a real issue as
+ * we have by default a second-level cache. This means on the first HTTP call we do the n+1 requests,
+ * but then all authorities come from the cache, so in fact it's much better than doing an outer join
+ * (which will get lots of data from the database, for each HTTP call).</li>
+ * <li> As this manages users, for security reasons, we'd rather have a DTO layer.</li>
+ * </ul>
+ * <p>
+ * Another option would be to have a specific JPA entity graph to handle this case.
+ */
+@RestController
+@RequestMapping("/api")
+public class UserResource {
+  private final Logger log = LoggerFactory.getLogger(UserResource.class);
+
+  @Value("${jhipster.clientApp.name}")
+  private String applicationName;
+
+  private final UserService userService;
+
+  private final UserRepository userRepository;
+
+  private final MailService mailService;
+
+  public UserResource(UserService userService, UserRepository userRepository, MailService mailService) {
+    this.userService = userService;
+    this.userRepository = userRepository;
+    this.mailService = mailService;
+  }
+
+  /**
+   * {@code POST  /users}  : Creates a new user.
+   * <p>
+   * Creates a new user if the login and email are not already used, and sends an
+   * mail with an activation link.
+   * The user needs to be activated on creation.
+   *
+   * @param userDTO the user to create.
+   * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new user, or with status {@code 400 (Bad Request)} if the login or email is already in use.
+   * @throws URISyntaxException if the Location URI syntax is incorrect.
+   * @throws BadRequestAlertException {@code 400 (Bad Request)} if the login or email is already in use.
+   */
+  @PostMapping("/users")
+  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
+  public ResponseEntity<User> createUser(@Valid @RequestBody UserDTO userDTO) throws URISyntaxException {
+    log.debug("REST request to save User : {}", userDTO);
+
+    if (userDTO.getId() != null) {
+      throw new BadRequestAlertException("A new user cannot already have an ID", "userManagement", "idexists");
+    // Lowercase the user login before comparing with database
+    } else if (userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).isPresent()) {
+      throw new LoginAlreadyUsedException();
+    } else if (userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).isPresent()) {
+      throw new EmailAlreadyUsedException();
+    } else {
+      User newUser = userService.createUser(userDTO);
+      mailService.sendCreationEmail(newUser);
+      return ResponseEntity
+        .created(new URI("/api/users/" + newUser.getLogin()))
+        .headers(HeaderUtil.createAlert(applicationName, "userManagement.created", newUser.getLogin()))
+        .body(newUser);
+    }
+  }
+
+  /**
+   * {@code PUT /users} : Updates an existing User.
+   *
+   * @param userDTO the user to update.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated user.
+   * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already in use.
+   * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already in use.
+   */
+  @PutMapping("/users")
+  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
+  public ResponseEntity<UserDTO> updateUser(@Valid @RequestBody UserDTO userDTO) {
+    log.debug("REST request to update User : {}", userDTO);
+    Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail());
+    if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) {
+      throw new EmailAlreadyUsedException();
+    }
+    existingUser = userRepository.findOneByLogin(userDTO.getLogin().toLowerCase());
+    if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) {
+      throw new LoginAlreadyUsedException();
+    }
+    Optional<UserDTO> updatedUser = userService.updateUser(userDTO);
+
+    return ResponseUtil.wrapOrNotFound(updatedUser, HeaderUtil.createAlert(applicationName, "userManagement.updated", userDTO.getLogin()));
+  }
+
+  /**
+   * {@code GET /users} : get all users.
+   *
+   * @param pageable the pagination information.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body all users.
+   */
+  @GetMapping("/users")
+  public ResponseEntity<List<UserDTO>> getAllUsers(Pageable pageable) {
+    final Page<UserDTO> page = userService.getAllManagedUsers(pageable);
+    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
+    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
+  }
+
+  /**
+   * Gets a list of all roles.
+   * @return a string list of all roles.
+   */
+  @GetMapping("/users/authorities")
+  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
+  public List<String> getAuthorities() {
+    return userService.getAuthorities();
+  }
+
+  /**
+   * {@code GET /users/:login} : get the "login" user.
+   *
+   * @param login the login of the user to find.
+   * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the "login" user, or with status {@code 404 (Not Found)}.
+   */
+  @GetMapping("/users/{login:" + Constants.LOGIN_REGEX + "}")
+  public ResponseEntity<UserDTO> getUser(@PathVariable String login) {
+    log.debug("REST request to get User : {}", login);
+    return ResponseUtil.wrapOrNotFound(userService.getUserWithAuthoritiesByLogin(login).map(UserDTO::new));
+  }
+
+  /**
+   * {@code DELETE /users/:login} : delete the "login" User.
+   *
+   * @param login the login of the user to delete.
+   * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
+   */
+  @DeleteMapping("/users/{login:" + Constants.LOGIN_REGEX + "}")
+  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
+  public ResponseEntity<Void> deleteUser(@PathVariable String login) {
+    log.debug("REST request to delete User: {}", login);
+    userService.deleteUser(login);
+    return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, "userManagement.deleted", login)).build();
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java
new file mode 100644
index 0000000000000000000000000000000000000000..2dab39d05a5ba732ed40c98db8b499e89c7c5653
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java
@@ -0,0 +1,40 @@
+package com.ippon.borestop.web.rest.errors;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import org.zalando.problem.AbstractThrowableProblem;
+import org.zalando.problem.Status;
+
+public class BadRequestAlertException extends AbstractThrowableProblem {
+  private static final long serialVersionUID = 1L;
+
+  private final String entityName;
+
+  private final String errorKey;
+
+  public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) {
+    this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey);
+  }
+
+  public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) {
+    super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey));
+    this.entityName = entityName;
+    this.errorKey = errorKey;
+  }
+
+  public String getEntityName() {
+    return entityName;
+  }
+
+  public String getErrorKey() {
+    return errorKey;
+  }
+
+  private static Map<String, Object> getAlertParameters(String entityName, String errorKey) {
+    Map<String, Object> parameters = new HashMap<>();
+    parameters.put("message", "error." + errorKey);
+    parameters.put("params", entityName);
+    return parameters;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d061fed270a8a4a405d8a342734eb48c0a2c86c
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.web.rest.errors;
+
+public class EmailAlreadyUsedException extends BadRequestAlertException {
+  private static final long serialVersionUID = 1L;
+
+  public EmailAlreadyUsedException() {
+    super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f88c93009852551ac7d1c3db0e8e4835cf3b45a
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java
@@ -0,0 +1,16 @@
+package com.ippon.borestop.web.rest.errors;
+
+import java.net.URI;
+
+public final class ErrorConstants {
+  public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure";
+  public static final String ERR_VALIDATION = "error.validation";
+  public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem";
+  public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message");
+  public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation");
+  public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password");
+  public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used");
+  public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used");
+
+  private ErrorConstants() {}
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b63464c5cbf10c6fddd9dc8548c47aea5fcbe7bd
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java
@@ -0,0 +1,134 @@
+package com.ippon.borestop.web.rest.errors;
+
+import io.github.jhipster.web.util.HeaderUtil;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.dao.ConcurrencyFailureException;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.zalando.problem.DefaultProblem;
+import org.zalando.problem.Problem;
+import org.zalando.problem.ProblemBuilder;
+import org.zalando.problem.Status;
+import org.zalando.problem.spring.web.advice.ProblemHandling;
+import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
+import org.zalando.problem.violations.ConstraintViolationProblem;
+
+/**
+ * Controller advice to translate the server side exceptions to client-friendly json structures.
+ * The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807).
+ */
+@ControllerAdvice
+public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait {
+  private static final String FIELD_ERRORS_KEY = "fieldErrors";
+  private static final String MESSAGE_KEY = "message";
+  private static final String PATH_KEY = "path";
+  private static final String VIOLATIONS_KEY = "violations";
+
+  @Value("${jhipster.clientApp.name}")
+  private String applicationName;
+
+  /**
+   * Post-process the Problem payload to add the message key for the front-end if needed.
+   */
+  @Override
+  public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
+    if (entity == null) {
+      return entity;
+    }
+    Problem problem = entity.getBody();
+    if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
+      return entity;
+    }
+    ProblemBuilder builder = Problem
+      .builder()
+      .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
+      .withStatus(problem.getStatus())
+      .withTitle(problem.getTitle())
+      .with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI());
+
+    if (problem instanceof ConstraintViolationProblem) {
+      builder.with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()).with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION);
+    } else {
+      builder.withCause(((DefaultProblem) problem).getCause()).withDetail(problem.getDetail()).withInstance(problem.getInstance());
+      problem.getParameters().forEach(builder::with);
+      if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) {
+        builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode());
+      }
+    }
+    return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
+  }
+
+  @Override
+  public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) {
+    BindingResult result = ex.getBindingResult();
+    List<FieldErrorVM> fieldErrors = result
+      .getFieldErrors()
+      .stream()
+      .map(f -> new FieldErrorVM(f.getObjectName().replaceFirst("DTO$", ""), f.getField(), f.getCode()))
+      .collect(Collectors.toList());
+
+    Problem problem = Problem
+      .builder()
+      .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE)
+      .withTitle("Method argument not valid")
+      .withStatus(defaultConstraintViolationStatus())
+      .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION)
+      .with(FIELD_ERRORS_KEY, fieldErrors)
+      .build();
+    return create(ex, problem, request);
+  }
+
+  @ExceptionHandler
+  public ResponseEntity<Problem> handleEmailAlreadyUsedException(
+    com.ippon.borestop.service.EmailAlreadyUsedException ex,
+    NativeWebRequest request
+  ) {
+    EmailAlreadyUsedException problem = new EmailAlreadyUsedException();
+    return create(
+      problem,
+      request,
+      HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage())
+    );
+  }
+
+  @ExceptionHandler
+  public ResponseEntity<Problem> handleUsernameAlreadyUsedException(
+    com.ippon.borestop.service.UsernameAlreadyUsedException ex,
+    NativeWebRequest request
+  ) {
+    LoginAlreadyUsedException problem = new LoginAlreadyUsedException();
+    return create(
+      problem,
+      request,
+      HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage())
+    );
+  }
+
+  @ExceptionHandler
+  public ResponseEntity<Problem> handleInvalidPasswordException(
+    com.ippon.borestop.service.InvalidPasswordException ex,
+    NativeWebRequest request
+  ) {
+    return create(new InvalidPasswordException(), request);
+  }
+
+  @ExceptionHandler
+  public ResponseEntity<Problem> handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) {
+    return create(ex, request, HeaderUtil.createFailureAlert(applicationName, true, ex.getEntityName(), ex.getErrorKey(), ex.getMessage()));
+  }
+
+  @ExceptionHandler
+  public ResponseEntity<Problem> handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) {
+    Problem problem = Problem.builder().withStatus(Status.CONFLICT).with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE).build();
+    return create(ex, problem, request);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java
new file mode 100644
index 0000000000000000000000000000000000000000..46a2bf76275a328b62743daabc5c8d1d809782f7
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java
@@ -0,0 +1,31 @@
+package com.ippon.borestop.web.rest.errors;
+
+import java.io.Serializable;
+
+public class FieldErrorVM implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private final String objectName;
+
+  private final String field;
+
+  private final String message;
+
+  public FieldErrorVM(String dto, String field, String message) {
+    this.objectName = dto;
+    this.field = field;
+    this.message = message;
+  }
+
+  public String getObjectName() {
+    return objectName;
+  }
+
+  public String getField() {
+    return field;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d5ae4664736d947cf067d36c603cab48dced293
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java
@@ -0,0 +1,12 @@
+package com.ippon.borestop.web.rest.errors;
+
+import org.zalando.problem.AbstractThrowableProblem;
+import org.zalando.problem.Status;
+
+public class InvalidPasswordException extends AbstractThrowableProblem {
+  private static final long serialVersionUID = 1L;
+
+  public InvalidPasswordException() {
+    super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST);
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c22b6c952067501a40990f378628dfc463cfaa8
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java
@@ -0,0 +1,9 @@
+package com.ippon.borestop.web.rest.errors;
+
+public class LoginAlreadyUsedException extends BadRequestAlertException {
+  private static final long serialVersionUID = 1L;
+
+  public LoginAlreadyUsedException() {
+    super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists");
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..a55530291e9e1deeb220117049070985b0403fcc
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * Specific errors used with Zalando's "problem-spring-web" library.
+ *
+ * More information on https://github.com/zalando/problem-spring-web
+ */
+package com.ippon.borestop.web.rest.errors;
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef7b35134f5dd3a608dcd2a83df386cca7f1bc66
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Spring MVC REST controllers.
+ */
+package com.ippon.borestop.web.rest;
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java
new file mode 100644
index 0000000000000000000000000000000000000000..72f6d0a0e851b973b7c2741804a83aecbdb6e34f
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java
@@ -0,0 +1,26 @@
+package com.ippon.borestop.web.rest.vm;
+
+/**
+ * View Model object for storing the user's key and password.
+ */
+public class KeyAndPasswordVM {
+  private String key;
+
+  private String newPassword;
+
+  public String getKey() {
+    return key;
+  }
+
+  public void setKey(String key) {
+    this.key = key;
+  }
+
+  public String getNewPassword() {
+    return newPassword;
+  }
+
+  public void setNewPassword(String newPassword) {
+    this.newPassword = newPassword;
+  }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e1b8bb8fb611886ad1636a0af44d7413a7a6efe
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java
@@ -0,0 +1,52 @@
+package com.ippon.borestop.web.rest.vm;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+/**
+ * View Model object for storing a user's credentials.
+ */
+public class LoginVM {
+  @NotNull
+  @Size(min = 1, max = 50)
+  private String username;
+
+  @NotNull
+  @Size(min = 4, max = 100)
+  private String password;
+
+  private Boolean rememberMe;
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  public Boolean isRememberMe() {
+    return rememberMe;
+  }
+
+  public void setRememberMe(Boolean rememberMe) {
+    this.rememberMe = rememberMe;
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "LoginVM{" +
+            "username='" + username + '\'' +
+            ", rememberMe=" + rememberMe +
+            '}';
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e3482cdc24aabd5440d458f653b838bf6efd378
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java
@@ -0,0 +1,34 @@
+package com.ippon.borestop.web.rest.vm;
+
+import com.ippon.borestop.service.dto.UserDTO;
+import javax.validation.constraints.Size;
+
+/**
+ * View Model extending the UserDTO, which is meant to be used in the user management UI.
+ */
+public class ManagedUserVM extends UserDTO {
+  public static final int PASSWORD_MIN_LENGTH = 4;
+
+  public static final int PASSWORD_MAX_LENGTH = 100;
+
+  @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH)
+  private String password;
+
+  public ManagedUserVM() {
+    // Empty constructor needed for Jackson.
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "ManagedUserVM{" + super.toString() + "} ";
+    }
+}
diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..02e5124959c9b40cb8d6546baf49fd02cd8ac1ce
--- /dev/null
+++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * View Models used by Spring MVC REST controllers.
+ */
+package com.ippon.borestop.web.rest.vm;
diff --git a/borestop/src/main/jib/entrypoint.sh b/borestop/src/main/jib/entrypoint.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ab662b400c11b93ee349c457ae18508b76225083
--- /dev/null
+++ b/borestop/src/main/jib/entrypoint.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP}
+exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.ippon.borestop.BorestopApp"  "$@"
diff --git a/borestop/src/main/resources/.h2.server.properties b/borestop/src/main/resources/.h2.server.properties
new file mode 100644
index 0000000000000000000000000000000000000000..da85d0d2da4fb27002fc171e08a6788870a5f6e6
--- /dev/null
+++ b/borestop/src/main/resources/.h2.server.properties
@@ -0,0 +1,5 @@
+#H2 Server Properties
+0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./target/h2db/db/borestop|borestop
+webAllowOthers=true
+webPort=8082
+webSSL=false
diff --git a/borestop/src/main/resources/banner.txt b/borestop/src/main/resources/banner.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e0bc55aaffa9b6c51d63a1a67ecf8d533f51e0d2
--- /dev/null
+++ b/borestop/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+
+  ${AnsiColor.GREEN}      ██╗${AnsiColor.RED} ██╗   ██╗ ████████╗ ███████╗   ██████╗ ████████╗ ████████╗ ███████╗
+  ${AnsiColor.GREEN}      ██║${AnsiColor.RED} ██║   ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗
+  ${AnsiColor.GREEN}      ██║${AnsiColor.RED} ████████║    ██║    ███████╔╝ ╚█████╗     ██║    ██████╗   ███████╔╝
+  ${AnsiColor.GREEN}██╗   ██║${AnsiColor.RED} ██╔═══██║    ██║    ██╔════╝   ╚═══██╗    ██║    ██╔═══╝   ██╔══██║
+  ${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║   ██║ ████████╗ ██║       ██████╔╝    ██║    ████████╗ ██║  ╚██╗
+  ${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝   ╚═╝ ╚═══════╝ ╚═╝       ╚═════╝     ╚═╝    ╚═══════╝ ╚═╝   ╚═╝
+
+${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓  :: Running Spring Boot ${spring-boot.version} ::
+:: https://www.jhipster.tech ::${AnsiColor.DEFAULT}
diff --git a/borestop/src/main/resources/config/application-dev.yml b/borestop/src/main/resources/config/application-dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a98fd1a45beb2af743b8519979c44d6aa07834fd
--- /dev/null
+++ b/borestop/src/main/resources/config/application-dev.yml
@@ -0,0 +1,116 @@
+# ===================================================================
+# Spring Boot configuration for the "dev" profile.
+#
+# This configuration overrides the application.yml file.
+#
+# More information on profiles: https://www.jhipster.tech/profiles/
+# More information on configuration properties: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# ===================================================================
+# Standard Spring Boot properties.
+# Full reference is available at:
+# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
+# ===================================================================
+
+logging:
+  level:
+    ROOT: DEBUG
+    io.github.jhipster: DEBUG
+    com.ippon.borestop: DEBUG
+
+spring:
+  profiles:
+    active: dev
+    include:
+      - swagger
+      # Uncomment to activate TLS for the dev profile
+      #- tls
+  devtools:
+    restart:
+      enabled: true
+      additional-exclude: static/**,.h2.server.properties
+    livereload:
+      enabled: false # we use Webpack dev server + BrowserSync for livereload
+  jackson:
+    serialization:
+      indent-output: true
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    url: jdbc:h2:file:./target/h2db/db/borestop;DB_CLOSE_DELAY=-1
+    username: borestop
+    password:
+    hikari:
+      poolName: Hikari
+      auto-commit: false
+  h2:
+    console:
+      enabled: false
+  jpa:
+    database-platform: io.github.jhipster.domain.util.FixedH2Dialect
+    show-sql: true
+  liquibase:
+    # Remove 'faker' if you do not want the sample data to be loaded automatically
+    contexts: dev, faker
+  mail:
+    host: localhost
+    port: 25
+    username:
+    password:
+  messages:
+    cache-duration: PT1S # 1 second, see the ISO 8601 standard
+  thymeleaf:
+    cache: false
+
+server:
+  port: 8080
+
+# ===================================================================
+# JHipster specific properties
+#
+# Full reference is available at: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+jhipster:
+  # CORS is only enabled by default with the "dev" profile, so BrowserSync can access the API
+  cors:
+    allowed-origins: '*'
+    allowed-methods: '*'
+    allowed-headers: '*'
+    exposed-headers: 'Authorization,Link,X-Total-Count'
+    allow-credentials: true
+    max-age: 1800
+  security:
+    authentication:
+      jwt:
+        # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one)
+        base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=
+        # Token is valid 24 hours
+        token-validity-in-seconds: 86400
+        token-validity-in-seconds-for-remember-me: 2592000
+  mail: # specific JHipster mail property, for standard properties see MailProperties
+    base-url: http://127.0.0.1:8080
+  metrics:
+    logs: # Reports metrics in the logs
+      enabled: false
+      report-frequency: 60 # in seconds
+  logging:
+    use-json-format: false # By default, logs are not in Json format
+    logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration
+      enabled: false
+      host: localhost
+      port: 5000
+      queue-size: 512
+  audit-events:
+    retention-period: 30 # Number of days before audit events are deleted.
+
+# ===================================================================
+# Application specific properties
+# Add your own application properties here, see the ApplicationProperties class
+# to have type-safe configuration, like in the JHipsterProperties above
+#
+# More documentation is available at:
+# https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# application:
diff --git a/borestop/src/main/resources/config/application-prod.yml b/borestop/src/main/resources/config/application-prod.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e57f6a806c396da0459c16dc418871f33d90b2a1
--- /dev/null
+++ b/borestop/src/main/resources/config/application-prod.yml
@@ -0,0 +1,129 @@
+# ===================================================================
+# Spring Boot configuration for the "prod" profile.
+#
+# This configuration overrides the application.yml file.
+#
+# More information on profiles: https://www.jhipster.tech/profiles/
+# More information on configuration properties: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# ===================================================================
+# Standard Spring Boot properties.
+# Full reference is available at:
+# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
+# ===================================================================
+
+logging:
+  level:
+    ROOT: INFO
+    io.github.jhipster: INFO
+    com.ippon.borestop: INFO
+
+management:
+  metrics:
+    export:
+      prometheus:
+        enabled: false
+
+spring:
+  devtools:
+    restart:
+      enabled: false
+    livereload:
+      enabled: false
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    url: jdbc:postgresql://localhost:5432/borestop
+    username: borestop
+    password:
+    hikari:
+      poolName: Hikari
+      auto-commit: false
+  jpa:
+    database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect
+    show-sql: false
+  # Replace by 'prod, faker' to add the faker context and have sample data loaded in production
+  liquibase:
+    contexts: prod
+  mail:
+    host: localhost
+    port: 25
+    username:
+    password:
+  thymeleaf:
+    cache: true
+
+# ===================================================================
+# To enable TLS in production, generate a certificate using:
+# keytool -genkey -alias borestop -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
+#
+# You can also use Let's Encrypt:
+# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm
+#
+# Then, modify the server.ssl properties so your "server" configuration looks like:
+#
+# server:
+#   port: 443
+#   ssl:
+#     key-store: classpath:config/tls/keystore.p12
+#     key-store-password: password
+#     key-store-type: PKCS12
+#     key-alias: selfsigned
+#     # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/)
+#     ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
+# ===================================================================
+server:
+  port: 8080
+  compression:
+    enabled: true
+    mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json
+    min-response-size: 1024
+
+# ===================================================================
+# JHipster specific properties
+#
+# Full reference is available at: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+jhipster:
+  http:
+    cache: # Used by the CachingHttpHeadersFilter
+      timeToLiveInDays: 1461
+  security:
+    authentication:
+      jwt:
+        # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one)
+        # As this is the PRODUCTION configuration, you MUST change the default key, and store it securely:
+        # - In the JHipster Registry (which includes a Spring Cloud Config server)
+        # - In a separate `application-prod.yml` file, in the same folder as your executable JAR file
+        # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable
+        base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=
+        # Token is valid 24 hours
+        token-validity-in-seconds: 86400
+        token-validity-in-seconds-for-remember-me: 2592000
+  mail: # specific JHipster mail property, for standard properties see MailProperties
+    base-url: http://my-server-url-to-change # Modify according to your server's URL
+  metrics:
+    logs: # Reports metrics in the logs
+      enabled: false
+      report-frequency: 60 # in seconds
+  logging:
+    use-json-format: false # By default, logs are not in Json format
+    logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration
+      enabled: false
+      host: localhost
+      port: 5000
+      queue-size: 512
+  audit-events:
+    retention-period: 30 # Number of days before audit events are deleted.
+
+# ===================================================================
+# Application specific properties
+# Add your own application properties here, see the ApplicationProperties class
+# to have type-safe configuration, like in the JHipsterProperties above
+#
+# More documentation is available at:
+# https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# application:
diff --git a/borestop/src/main/resources/config/application-tls.yml b/borestop/src/main/resources/config/application-tls.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27c9cd85745ff819f3fc60c6d37a203af3d111c5
--- /dev/null
+++ b/borestop/src/main/resources/config/application-tls.yml
@@ -0,0 +1,19 @@
+# ===================================================================
+# Activate this profile to enable TLS and HTTP/2.
+#
+# JHipster has generated a self-signed certificate, which will be used to encrypt traffic.
+# As your browser will not understand this certificate, you will need to import it.
+#
+# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag
+# at chrome://flags/#allow-insecure-localhost
+# ===================================================================
+server:
+  ssl:
+    key-store: classpath:config/tls/keystore.p12
+    key-store-password: password
+    key-store-type: PKCS12
+    key-alias: selfsigned
+    ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
+    enabled-protocols: TLSv1.2
+  http2:
+    enabled: true
diff --git a/borestop/src/main/resources/config/application.yml b/borestop/src/main/resources/config/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aac8814b92c7641cfdb3d3f47e9d6aab2341b2fc
--- /dev/null
+++ b/borestop/src/main/resources/config/application.yml
@@ -0,0 +1,165 @@
+# ===================================================================
+# Spring Boot configuration.
+#
+# This configuration will be overridden by the Spring profile you use,
+# for example application-dev.yml if you use the "dev" profile.
+#
+# More information on profiles: https://www.jhipster.tech/profiles/
+# More information on configuration properties: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# ===================================================================
+# Standard Spring Boot properties.
+# Full reference is available at:
+# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
+# ===================================================================
+
+management:
+  endpoints:
+    web:
+      base-path: /management
+      exposure:
+        include: ['configprops', 'env', 'health', 'info', 'jhimetrics', 'logfile', 'loggers', 'prometheus', 'threaddump']
+  endpoint:
+    health:
+      show-details: when_authorized
+      roles: 'ROLE_ADMIN'
+    jhimetrics:
+      enabled: true
+  info:
+    git:
+      mode: full
+  health:
+    mail:
+      enabled: false # When using the MailService, configure an SMTP server and set this to true
+  metrics:
+    export:
+      # Prometheus is the default metrics backend
+      prometheus:
+        enabled: true
+        step: 60
+    enable:
+      http: true
+      jvm: true
+      logback: true
+      process: true
+      system: true
+    distribution:
+      percentiles-histogram:
+        all: true
+      percentiles:
+        all: 0, 0.5, 0.75, 0.95, 0.99, 1.0
+    tags:
+      application: ${spring.application.name}
+    web:
+      server:
+        request:
+          autotime:
+            enabled: true
+
+spring:
+  application:
+    name: borestop
+  profiles:
+    # The commented value for `active` can be replaced with valid Spring profiles to load.
+    # Otherwise, it will be filled in by maven when building the JAR file
+    # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS`
+    active: #spring.profiles.active#
+  jmx:
+    enabled: false
+  data:
+    jpa:
+      repositories:
+        bootstrap-mode: deferred
+  jpa:
+    open-in-view: false
+    properties:
+      hibernate.jdbc.time_zone: UTC
+      hibernate.id.new_generator_mappings: true
+      hibernate.connection.provider_disables_autocommit: true
+      hibernate.cache.use_second_level_cache: false
+      hibernate.cache.use_query_cache: false
+      hibernate.generate_statistics: false
+      # modify batch size as necessary
+      hibernate.jdbc.batch_size: 25
+      hibernate.order_inserts: true
+      hibernate.order_updates: true
+      hibernate.query.fail_on_pagination_over_collection_fetch: true
+      hibernate.query.in_clause_parameter_padding: true
+    hibernate:
+      ddl-auto: none
+      naming:
+        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
+        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
+  messages:
+    basename: i18n/messages
+  main:
+    allow-bean-definition-overriding: true
+  task:
+    execution:
+      thread-name-prefix: borestop-task-
+      pool:
+        core-size: 2
+        max-size: 50
+        queue-capacity: 10000
+    scheduling:
+      thread-name-prefix: borestop-scheduling-
+      pool:
+        size: 2
+  thymeleaf:
+    mode: HTML
+  output:
+    ansi:
+      console-available: true
+
+server:
+  servlet:
+    session:
+      cookie:
+        http-only: true
+
+# Properties to be exposed on the /info management endpoint
+info:
+  # Comma separated list of profiles that will trigger the ribbon to show
+  display-ribbon-on-profiles: 'dev'
+
+# ===================================================================
+# JHipster specific properties
+#
+# Full reference is available at: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+jhipster:
+  clientApp:
+    name: 'borestopApp'
+  # By default CORS is disabled. Uncomment to enable.
+  # cors:
+  #     allowed-origins: "*"
+  #     allowed-methods: "*"
+  #     allowed-headers: "*"
+  #     exposed-headers: "Authorization,Link,X-Total-Count"
+  #     allow-credentials: true
+  #     max-age: 1800
+  mail:
+    from: borestop@localhost
+  swagger:
+    default-include-pattern: /api/.*
+    title: borestop API
+    description: borestop API documentation
+    version: 0.0.1
+    terms-of-service-url:
+    contact-name:
+    contact-url:
+    contact-email:
+    license: unlicensed
+    license-url:
+# ===================================================================
+# Application specific properties
+# Add your own application properties here, see the ApplicationProperties class
+# to have type-safe configuration, like in the JHipsterProperties above
+#
+# More documentation is available at:
+# https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# application:
diff --git a/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e2762c962f11cf7f57c4ebb9cf671ce09d02e842
--- /dev/null
+++ b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+        <changeSet id="00000000000000" author="jhipster">
+        <createSequence sequenceName="sequence_generator" startValue="1050" incrementBy="50"/>
+    </changeSet>
+
+    <!--
+        JHipster core tables.
+        The initial schema has the '00000000000001' id, so that it is over-written if we re-generate it.
+    -->
+    <changeSet id="00000000000001" author="jhipster">
+        <createTable tableName="jhi_user">
+            <column name="id" type="bigint" >
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="login" type="varchar(50)">
+                <constraints unique="true" nullable="false" uniqueConstraintName="ux_user_login"/>
+            </column>
+            <column name="password_hash" type="varchar(60)"/>
+            <column name="first_name" type="varchar(50)"/>
+            <column name="last_name" type="varchar(50)"/>
+            <column name="email" type="varchar(191)">
+                <constraints unique="true" nullable="true" uniqueConstraintName="ux_user_email"/>
+            </column>
+            <column name="image_url" type="varchar(256)"/>
+            <column name="activated" type="boolean" valueBoolean="false">
+                <constraints nullable="false" />
+            </column>
+            <column name="lang_key" type="varchar(10)"/>
+            <column name="activation_key" type="varchar(20)"/>
+            <column name="reset_key" type="varchar(20)"/>
+            <column name="created_by" type="varchar(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="created_date" type="timestamp"/>
+            <column name="reset_date" type="timestamp">
+                <constraints nullable="true"/>
+            </column>
+            <column name="last_modified_by" type="varchar(50)"/>
+            <column name="last_modified_date" type="timestamp"/>
+        </createTable>
+
+        <createTable tableName="jhi_authority">
+            <column name="name" type="varchar(50)">
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+        </createTable>
+
+        <createTable tableName="jhi_user_authority">
+            <column name="user_id" type="bigint">
+                <constraints nullable="false"/>
+            </column>
+            <column name="authority_name" type="varchar(50)">
+                <constraints nullable="false"/>
+            </column>
+        </createTable>
+
+        <addPrimaryKey columnNames="user_id, authority_name" tableName="jhi_user_authority"/>
+
+        <addForeignKeyConstraint baseColumnNames="authority_name"
+                                 baseTableName="jhi_user_authority"
+                                 constraintName="fk_authority_name"
+                                 referencedColumnNames="name"
+                                 referencedTableName="jhi_authority"/>
+
+        <addForeignKeyConstraint baseColumnNames="user_id"
+                                 baseTableName="jhi_user_authority"
+                                 constraintName="fk_user_id"
+                                 referencedColumnNames="id"
+                                 referencedTableName="jhi_user"/>
+
+        <addNotNullConstraint   columnName="password_hash"
+                                columnDataType="varchar(60)"
+                                tableName="jhi_user"/>
+        <loadData
+                  file="config/liquibase/data/user.csv"
+                  separator=";"
+                  tableName="jhi_user">
+            <column name="id" type="numeric"/>
+            <column name="activated" type="boolean"/>
+            <column name="created_date" type="timestamp"/>
+        </loadData>
+        <dropDefaultValue tableName="jhi_user" columnName="created_date" columnDataType="datetime"/>
+        <loadData
+                  file="config/liquibase/data/authority.csv"
+                  separator=";"
+                  tableName="jhi_authority">
+            <column name="name" type="string"/>
+        </loadData>
+
+        <loadData
+                  file="config/liquibase/data/user_authority.csv"
+                  separator=";"
+                  tableName="jhi_user_authority">
+            <column name="user_id" type="numeric"/>
+        </loadData>
+        <createTable tableName="jhi_persistent_audit_event">
+            <column name="event_id" type="bigint" >
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="principal" type="varchar(50)">
+                <constraints nullable="false" />
+            </column>
+            <column name="event_date" type="timestamp"/>
+            <column name="event_type" type="varchar(255)"/>
+        </createTable>
+
+        <createTable tableName="jhi_persistent_audit_evt_data">
+            <column name="event_id" type="bigint">
+                <constraints nullable="false"/>
+            </column>
+            <column name="name" type="varchar(150)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="value" type="varchar(255)"/>
+        </createTable>
+        <addPrimaryKey columnNames="event_id, name" tableName="jhi_persistent_audit_evt_data"/>
+
+        <createIndex indexName="idx_persistent_audit_event"
+                     tableName="jhi_persistent_audit_event"
+                     unique="false">
+            <column name="principal" type="varchar(50)"/>
+            <column name="event_date" type="timestamp"/>
+        </createIndex>
+
+        <createIndex indexName="idx_persistent_audit_evt_data"
+                     tableName="jhi_persistent_audit_evt_data"
+                     unique="false">
+            <column name="event_id" type="bigint"/>
+        </createIndex>
+
+        <addForeignKeyConstraint baseColumnNames="event_id"
+                                 baseTableName="jhi_persistent_audit_evt_data"
+                                 constraintName="fk_evt_pers_audit_evt_data"
+                                 referencedColumnNames="event_id"
+                                 referencedTableName="jhi_persistent_audit_event"/>
+    </changeSet>
+
+    <changeSet author="jhipster" id="00000000000002" context="test">
+        <createTable tableName="jhi_date_time_wrapper">
+            <column  name="id" type="BIGINT">
+                <constraints primaryKey="true" primaryKeyName="jhi_date_time_wrapperPK"/>
+            </column>
+            <column name="instant" type="timestamp"/>
+            <column name="local_date_time" type="timestamp"/>
+            <column name="offset_date_time" type="timestamp"/>
+            <column name="zoned_date_time" type="timestamp"/>
+            <column name="local_time" type="time"/>
+            <column name="offset_time" type="time"/>
+            <column name="local_date" type="date"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/borestop/src/main/resources/config/liquibase/data/authority.csv b/borestop/src/main/resources/config/liquibase/data/authority.csv
new file mode 100644
index 0000000000000000000000000000000000000000..af5c6dfa186d3b5de3b3eb854ea9a044c222459e
--- /dev/null
+++ b/borestop/src/main/resources/config/liquibase/data/authority.csv
@@ -0,0 +1,3 @@
+name
+ROLE_ADMIN
+ROLE_USER
diff --git a/borestop/src/main/resources/config/liquibase/data/user.csv b/borestop/src/main/resources/config/liquibase/data/user.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b25922b69906608d69e4bc7df7fbe8c156f28cf5
--- /dev/null
+++ b/borestop/src/main/resources/config/liquibase/data/user.csv
@@ -0,0 +1,5 @@
+id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by
+1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system
+2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system
+3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system
+4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system
diff --git a/borestop/src/main/resources/config/liquibase/data/user_authority.csv b/borestop/src/main/resources/config/liquibase/data/user_authority.csv
new file mode 100644
index 0000000000000000000000000000000000000000..06c5feeeeace8bb0cb9ea59256a3bdb777caad62
--- /dev/null
+++ b/borestop/src/main/resources/config/liquibase/data/user_authority.csv
@@ -0,0 +1,6 @@
+user_id;authority_name
+1;ROLE_ADMIN
+1;ROLE_USER
+3;ROLE_ADMIN
+3;ROLE_USER
+4;ROLE_USER
diff --git a/borestop/src/main/resources/config/liquibase/master.xml b/borestop/src/main/resources/config/liquibase/master.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ed94bf4b45a84c855650be7e0f83f0272765bd0a
--- /dev/null
+++ b/borestop/src/main/resources/config/liquibase/master.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
+
+    <property name="now" value="now()" dbms="h2"/>
+    <property name="now" value="current_timestamp" dbms="postgresql"/>
+
+    <property name="floatType" value="float4" dbms="postgresql, h2"/>
+    <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/>
+    <property name="clobType" value="longvarchar" dbms="h2"/>
+    <property name="clobType" value="clob" dbms="mysql, oracle, mssql, mariadb, postgresql"/>
+    <property name="uuidType" value="uuid" dbms="h2, postgresql"/>
+
+    <include file="config/liquibase/changelog/00000000000000_initial_schema.xml" relativeToChangelogFile="false"/>
+    <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here -->
+    <!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here -->
+    <!-- jhipster-needle-liquibase-add-incremental-changelog - JHipster will add incremental liquibase changelogs here -->
+</databaseChangeLog>
diff --git a/borestop/src/main/resources/config/tls/keystore.p12 b/borestop/src/main/resources/config/tls/keystore.p12
new file mode 100644
index 0000000000000000000000000000000000000000..ef47ed6c55c3757c2659d62308309cc0387489d4
Binary files /dev/null and b/borestop/src/main/resources/config/tls/keystore.p12 differ
diff --git a/borestop/src/main/resources/i18n/messages.properties b/borestop/src/main/resources/i18n/messages.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ea138657422f978c7c15c07e8e2dd1b3eb759bf1
--- /dev/null
+++ b/borestop/src/main/resources/i18n/messages.properties
@@ -0,0 +1,21 @@
+# Error page
+error.title=Your request cannot be processed
+error.subtitle=Sorry, an error has occurred.
+error.status=Status:
+error.message=Message:
+
+# Activation email
+email.activation.title=borestop account activation is required
+email.activation.greeting=Dear {0}
+email.activation.text1=Your borestop account has been created, please click on the URL below to activate it:
+email.activation.text2=Regards,
+email.signature=borestop Team.
+
+# Creation email
+email.creation.text1=Your borestop account has been created, please click on the URL below to access it:
+
+# Reset email
+email.reset.title=borestop password reset
+email.reset.greeting=Dear {0}
+email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it:
+email.reset.text2=Regards,
diff --git a/borestop/src/main/resources/i18n/messages_en.properties b/borestop/src/main/resources/i18n/messages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..73f69f64e6e476df57aa9ad5e3b718f279e2ee8f
--- /dev/null
+++ b/borestop/src/main/resources/i18n/messages_en.properties
@@ -0,0 +1,21 @@
+# Error page
+error.title=Your request cannot be processed
+error.subtitle=Sorry, an error has occurred.
+error.status=Status:
+error.message=Message:
+
+# Activation email
+email.activation.title=borestop account activation
+email.activation.greeting=Dear {0}
+email.activation.text1=Your borestop account has been created, please click on the URL below to activate it:
+email.activation.text2=Regards,
+email.signature=borestop Team.
+
+# Creation email
+email.creation.text1=Your borestop account has been created, please click on the URL below to access it:
+
+# Reset email
+email.reset.title=borestop password reset
+email.reset.greeting=Dear {0}
+email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it:
+email.reset.text2=Regards,
diff --git a/borestop/src/main/resources/logback-spring.xml b/borestop/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000000000000000000000000000000000000..46f66b0e9466ce3866dbaaea9f7743a0fadcadec
--- /dev/null
+++ b/borestop/src/main/resources/logback-spring.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration>
+
+<configuration scan="true">
+    <include resource="org/springframework/boot/logging/logback/base.xml"/>
+
+<!-- The FILE and ASYNC appenders are here as examples for a production configuration -->
+<!--
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <charset>utf-8</charset>
+            <Pattern>%d %-5level [%thread] %logger{0}: %msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+        <queueSize>512</queueSize>
+        <appender-ref ref="FILE"/>
+    </appender>
+
+    <root level="${logging.level.root}">
+        <appender-ref ref="ASYNC"/>
+    </root>
+-->
+
+    <logger name="javax.activation" level="WARN"/>
+    <logger name="javax.mail" level="WARN"/>
+    <logger name="javax.management.remote" level="WARN"/>
+    <logger name="javax.xml.bind" level="WARN"/>
+    <logger name="ch.qos.logback" level="WARN"/>
+    <logger name="com.ryantenney" level="WARN"/>
+    <logger name="com.sun" level="WARN"/>
+    <logger name="com.zaxxer" level="WARN"/>
+    <logger name="io.undertow" level="WARN"/>
+    <logger name="io.undertow.websockets.jsr" level="ERROR"/>
+    <logger name="org.apache" level="WARN"/>
+    <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
+    <logger name="org.bson" level="WARN"/>
+    <logger name="org.hibernate.validator" level="WARN"/>
+    <logger name="org.hibernate" level="WARN"/>
+    <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
+    <logger name="org.postgresql" level="WARN"/>
+    <logger name="org.springframework" level="WARN"/>
+    <logger name="org.springframework.web" level="WARN"/>
+    <logger name="org.springframework.security" level="WARN"/>
+    <logger name="org.springframework.cache" level="WARN"/>
+    <logger name="org.thymeleaf" level="WARN"/>
+    <logger name="org.xnio" level="WARN"/>
+    <logger name="springfox" level="WARN"/>
+    <logger name="sun.rmi" level="WARN"/>
+    <logger name="liquibase" level="WARN"/>
+    <logger name="LiquibaseSchemaResolver" level="INFO"/>
+    <logger name="springfox.documentation.schema.property" level="ERROR"/>
+    <logger name="sun.rmi.transport" level="WARN"/>
+    <!-- jhipster-needle-logback-add-log - JHipster will add a new log with level -->
+
+    <!-- https://logback.qos.ch/manual/configuration.html#shutdownHook and https://jira.qos.ch/browse/LOGBACK-1090 -->
+    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+
+    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
+        <resetJUL>true</resetJUL>
+    </contextListener>
+
+</configuration>
diff --git a/borestop/src/main/resources/templates/error.html b/borestop/src/main/resources/templates/error.html
new file mode 100644
index 0000000000000000000000000000000000000000..a421bd26bead9e6802a3a93b06e0c654fc084eef
--- /dev/null
+++ b/borestop/src/main/resources/templates/error.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <link rel="icon" href="${baseUrl}/favicon.ico" />
+    <title>Your request cannot be processed</title>
+    <style>
+        ::-moz-selection {
+            background: #b3d4fc;
+            text-shadow: none;
+        }
+
+        ::selection {
+            background: #b3d4fc;
+            text-shadow: none;
+        }
+
+        html {
+            padding: 30px 10px;
+            font-size: 20px;
+            line-height: 1.4;
+            color: #737373;
+            background: #3E8ACC;
+            -webkit-text-size-adjust: 100%;
+            -ms-text-size-adjust: 100%;
+        }
+
+        html,
+        input {
+            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+        }
+
+        body {
+            max-width: 1000px;
+            _width: 500px;
+            padding: 30px 20px 50px;
+            border: 1px solid #b3b3b3;
+            border-radius: 4px;
+            margin: 0 auto;
+            box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
+            background: #fcfcfc;
+        }
+
+        h1 {
+            margin: 0 10px;
+            font-size: 50px;
+            text-align: center;
+        }
+
+        h1 span {
+            color: #bbb;
+        }
+
+        h3 {
+            margin: 1.5em 0 0.5em;
+        }
+
+        p {
+            margin: 1em 0;
+        }
+
+        ul {
+            padding: 0 0 0 40px;
+            margin: 1em 0;
+        }
+
+        .container {
+            max-width: 800px;
+            _width: 380px;
+            margin: 0 auto;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <h1 th:text="#{error.title}">Your request cannot be processed <span>:(</span></h1>
+
+    <p th:text="#{error.subtitle}">Sorry, an error has occurred.</p>
+
+    <span th:text="#{error.status}">Status:</span>&nbsp;<span th:text="${error}"></span>&nbsp;(<span th:text="${error}"></span>)<br/>
+    <span th:if="${!#strings.isEmpty(message)}">
+        <span th:text="#{error.message}">Message:</span>&nbsp;<span th:text="${message}"></span><br/>
+    </span>
+</div>
+</body>
+</html>
diff --git a/borestop/src/main/resources/templates/mail/activationEmail.html b/borestop/src/main/resources/templates/mail/activationEmail.html
new file mode 100644
index 0000000000000000000000000000000000000000..07d8d3b13b752bd29c151c83996c2f34e96df441
--- /dev/null
+++ b/borestop/src/main/resources/templates/mail/activationEmail.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
+    <head>
+        <title th:text="#{email.activation.title}">JHipster activation</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
+    </head>
+    <body>
+        <p th:text="#{email.activation.greeting(${user.login})}">
+            Dear
+        </p>
+        <p th:text="#{email.activation.text1}">
+            Your JHipster account has been created, please click on the URL below to activate it:
+        </p>
+        <p>
+            <a th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}"
+            th:text="${url}">Activation link</a>
+        </p>
+        <p>
+            <span th:text="#{email.activation.text2}">Regards, </span>
+            <br/>
+            <em th:text="#{email.signature}">JHipster.</em>
+        </p>
+    </body>
+</html>
diff --git a/borestop/src/main/resources/templates/mail/creationEmail.html b/borestop/src/main/resources/templates/mail/creationEmail.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d9276e3fce9072b6ea8441d5f1aff3415fdec4f
--- /dev/null
+++ b/borestop/src/main/resources/templates/mail/creationEmail.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
+    <head>
+        <title th:text="#{email.activation.title}">JHipster creation</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
+    </head>
+    <body>
+        <p th:text="#{email.activation.greeting(${user.login})}">
+            Dear
+        </p>
+        <p th:text="#{email.creation.text1}">
+            Your JHipster account has been created, please click on the URL below to access it:
+        </p>
+        <p>
+            <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}"
+            th:text="${url}">Login link</a>
+        </p>
+        <p>
+            <span th:text="#{email.activation.text2}">Regards, </span>
+            <br/>
+            <em th:text="#{email.signature}">JHipster.</em>
+        </p>
+    </body>
+</html>
diff --git a/borestop/src/main/resources/templates/mail/passwordResetEmail.html b/borestop/src/main/resources/templates/mail/passwordResetEmail.html
new file mode 100644
index 0000000000000000000000000000000000000000..4e709cf05af969fb016a96fff127bea21cc29be7
--- /dev/null
+++ b/borestop/src/main/resources/templates/mail/passwordResetEmail.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
+    <head>
+        <title th:text="#{email.reset.title}">JHipster password reset</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
+    </head>
+    <body>
+        <p th:text="#{email.reset.greeting(${user.login})}">
+            Dear
+        </p>
+        <p th:text="#{email.reset.text1}">
+            For your JHipster account a password reset was requested, please click on the URL below to reset it:
+        </p>
+        <p>
+            <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}"
+            th:text="${url}">Login link</a>
+        </p>
+        <p>
+            <span th:text="#{email.reset.text2}">Regards, </span>
+            <br/>
+            <em th:text="#{email.signature}">JHipster.</em>
+        </p>
+    </body>
+</html>
diff --git a/borestop/src/main/webapp/404.html b/borestop/src/main/webapp/404.html
new file mode 100644
index 0000000000000000000000000000000000000000..21a47e54db2b9d144919d9342c5a3daacccedc0b
--- /dev/null
+++ b/borestop/src/main/webapp/404.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Page Not Found</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="icon" href="favicon.ico" />
+    <style>
+
+        * {
+            line-height: 1.2;
+            margin: 0;
+        }
+
+        html {
+            color: #888;
+            display: table;
+            font-family: sans-serif;
+            height: 100%;
+            text-align: center;
+            width: 100%;
+        }
+
+        body {
+            display: table-cell;
+            vertical-align: middle;
+            margin: 2em auto;
+        }
+
+        h1 {
+            color: #555;
+            font-size: 2em;
+            font-weight: 400;
+        }
+
+        p {
+            margin: 0 auto;
+            width: 280px;
+        }
+
+        @media only screen and (max-width: 280px) {
+
+            body, p {
+                width: 95%;
+            }
+
+            h1 {
+                font-size: 1.5em;
+                margin: 0 0 0.3em;
+            }
+
+        }
+
+    </style>
+</head>
+<body>
+    <h1>Page Not Found</h1>
+    <p>Sorry, but the page you were trying to view does not exist.</p>
+</body>
+</html>
+<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx -->
diff --git a/borestop/src/main/webapp/WEB-INF/web.xml b/borestop/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f1611b515aed4372086d7ba19567fe5f895a4775
--- /dev/null
+++ b/borestop/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app
+    xmlns="http://java.sun.com/xml/ns/javaee"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+    version="3.0">
+
+    <mime-mapping>
+        <extension>html</extension>
+        <mime-type>text/html;charset=utf-8</mime-type>
+    </mime-mapping>
+
+</web-app>
diff --git a/borestop/src/main/webapp/app/account/account.module.ts b/borestop/src/main/webapp/app/account/account.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..179347b4c0e98e7af220e9b44f434e73a7e50c1a
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/account.module.ts
@@ -0,0 +1,27 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { PasswordStrengthBarComponent } from './password/password-strength-bar.component';
+import { RegisterComponent } from './register/register.component';
+import { ActivateComponent } from './activate/activate.component';
+import { PasswordComponent } from './password/password.component';
+import { PasswordResetInitComponent } from './password-reset/init/password-reset-init.component';
+import { PasswordResetFinishComponent } from './password-reset/finish/password-reset-finish.component';
+import { SettingsComponent } from './settings/settings.component';
+import { accountState } from './account.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild(accountState)],
+  declarations: [
+    ActivateComponent,
+    RegisterComponent,
+    PasswordComponent,
+    PasswordStrengthBarComponent,
+    PasswordResetInitComponent,
+    PasswordResetFinishComponent,
+    SettingsComponent
+  ]
+})
+export class AccountModule {}
diff --git a/borestop/src/main/webapp/app/account/account.route.ts b/borestop/src/main/webapp/app/account/account.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c15bb74c15c66b38fa44df746cdfaba6d6cfeac
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/account.route.ts
@@ -0,0 +1,17 @@
+import { Routes } from '@angular/router';
+
+import { activateRoute } from './activate/activate.route';
+import { passwordRoute } from './password/password.route';
+import { passwordResetFinishRoute } from './password-reset/finish/password-reset-finish.route';
+import { passwordResetInitRoute } from './password-reset/init/password-reset-init.route';
+import { registerRoute } from './register/register.route';
+import { settingsRoute } from './settings/settings.route';
+
+const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute];
+
+export const accountState: Routes = [
+  {
+    path: '',
+    children: ACCOUNT_ROUTES
+  }
+];
diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.html b/borestop/src/main/webapp/app/account/activate/activate.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..92b942b2e2740f64b4459ecc164e389f70a11751
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/activate/activate.component.html
@@ -0,0 +1,16 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <h1 jhiTranslate="activate.title">Activation</h1>
+
+            <div class="alert alert-success" *ngIf="success">
+                <span jhiTranslate="activate.messages.success"><strong>Your user account has been activated.</strong> Please </span>
+                <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="error" jhiTranslate="activate.messages.error">
+                <strong>Your user could not be activated.</strong> Please use the registration form to sign up.
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.ts b/borestop/src/main/webapp/app/account/activate/activate.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8020af1df27c5b18b1f58eed9a09d39601072f51
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/activate/activate.component.ts
@@ -0,0 +1,28 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { flatMap } from 'rxjs/operators';
+
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { ActivateService } from './activate.service';
+
+@Component({
+  selector: 'jhi-activate',
+  templateUrl: './activate.component.html'
+})
+export class ActivateComponent implements OnInit {
+  error = false;
+  success = false;
+
+  constructor(private activateService: ActivateService, private loginModalService: LoginModalService, private route: ActivatedRoute) {}
+
+  ngOnInit(): void {
+    this.route.queryParams.pipe(flatMap(params => this.activateService.get(params.key))).subscribe(
+      () => (this.success = true),
+      () => (this.error = true)
+    );
+  }
+
+  login(): void {
+    this.loginModalService.open();
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/activate/activate.route.ts b/borestop/src/main/webapp/app/account/activate/activate.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a988352daf89b923f6a3fd9de0ae2e9435e00633
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/activate/activate.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { ActivateComponent } from './activate.component';
+
+export const activateRoute: Route = {
+  path: 'activate',
+  component: ActivateComponent,
+  data: {
+    authorities: [],
+    pageTitle: 'activate.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/account/activate/activate.service.ts b/borestop/src/main/webapp/app/account/activate/activate.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9cac51ef184b760fd7c5c2698e0542c33cd544ee
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/activate/activate.service.ts
@@ -0,0 +1,16 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpParams } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+@Injectable({ providedIn: 'root' })
+export class ActivateService {
+  constructor(private http: HttpClient) {}
+
+  get(key: string): Observable<{}> {
+    return this.http.get(SERVER_API_URL + 'api/activate', {
+      params: new HttpParams().set('key', key)
+    });
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..61c54ad63c490e162c8b8e80e383b17d29c425a7
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html
@@ -0,0 +1,90 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-4">
+            <h1 jhiTranslate="reset.finish.title">Reset password</h1>
+
+            <div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key">
+                <strong>The password reset key is missing.</strong>
+            </div>
+
+            <div class="alert alert-warning" *ngIf="key && !success">
+                <span jhiTranslate="reset.finish.messages.info">Choose a new password</span>
+            </div>
+
+            <div class="alert alert-danger" *ngIf="error">
+                <span jhiTranslate="reset.finish.messages.error">Your password couldn't be reset. Remember a password request is only valid for 24 hours.</span>
+            </div>
+
+            <div class="alert alert-success" *ngIf="success">
+                <span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong> Please </span>
+                <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch">
+                The password and its confirmation do not match!
+            </div>
+
+            <div *ngIf="key && !success">
+                <form name="form" role="form" (ngSubmit)="finishReset()" [formGroup]="passwordForm">
+                    <div class="form-group">
+                        <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label>
+                        <input type="password" class="form-control" id="newPassword" name="newPassword"
+                               placeholder="{{ 'global.form.newpassword.placeholder' | translate }}"
+                               formControlName="newPassword" #newPassword>
+
+                        <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)">
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('newPassword')?.errors?.required"
+                                   jhiTranslate="global.messages.validate.newpassword.required">
+                                Your password is required.
+                            </small>
+
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('newPassword')?.errors?.minlength"
+                                   jhiTranslate="global.messages.validate.newpassword.minlength">
+                                Your password is required to be at least 4 characters.
+                            </small>
+
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('newPassword')?.errors?.maxlength"
+                                   jhiTranslate="global.messages.validate.newpassword.maxlength">
+                                Your password cannot be longer than 50 characters.
+                            </small>
+                        </div>
+
+                        <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label>
+                        <input type="password" class="form-control" id="confirmPassword" name="confirmPassword"
+                               placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}"
+                               formControlName="confirmPassword">
+
+                        <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)">
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('confirmPassword')?.errors?.required"
+                                   jhiTranslate="global.messages.validate.confirmpassword.required">
+                                Your password confirmation is required.
+                            </small>
+
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength"
+                                   jhiTranslate="global.messages.validate.confirmpassword.minlength">
+                                Your password confirmation is required to be at least 4 characters.
+                            </small>
+
+                            <small class="form-text text-danger"
+                                   *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength"
+                                   jhiTranslate="global.messages.validate.confirmpassword.maxlength">
+                                Your password confirmation cannot be longer than 50 characters.
+                            </small>
+                        </div>
+                    </div>
+
+                    <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="reset.finish.form.button">Reset Password</button>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..579d141e0c1e0d54a6c16d7cc3e38292c7443efa
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts
@@ -0,0 +1,69 @@
+import { Component, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
+import { FormBuilder, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { PasswordResetFinishService } from './password-reset-finish.service';
+
+@Component({
+  selector: 'jhi-password-reset-finish',
+  templateUrl: './password-reset-finish.component.html'
+})
+export class PasswordResetFinishComponent implements OnInit, AfterViewInit {
+  @ViewChild('newPassword', { static: false })
+  newPassword?: ElementRef;
+
+  initialized = false;
+  doNotMatch = false;
+  error = false;
+  success = false;
+  key = '';
+
+  passwordForm = this.fb.group({
+    newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]],
+    confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]]
+  });
+
+  constructor(
+    private passwordResetFinishService: PasswordResetFinishService,
+    private loginModalService: LoginModalService,
+    private route: ActivatedRoute,
+    private fb: FormBuilder
+  ) {}
+
+  ngOnInit(): void {
+    this.route.queryParams.subscribe(params => {
+      if (params['key']) {
+        this.key = params['key'];
+      }
+      this.initialized = true;
+    });
+  }
+
+  ngAfterViewInit(): void {
+    if (this.newPassword) {
+      this.newPassword.nativeElement.focus();
+    }
+  }
+
+  finishReset(): void {
+    this.doNotMatch = false;
+    this.error = false;
+
+    const newPassword = this.passwordForm.get(['newPassword'])!.value;
+    const confirmPassword = this.passwordForm.get(['confirmPassword'])!.value;
+
+    if (newPassword !== confirmPassword) {
+      this.doNotMatch = true;
+    } else {
+      this.passwordResetFinishService.save(this.key, newPassword).subscribe(
+        () => (this.success = true),
+        () => (this.error = true)
+      );
+    }
+  }
+
+  login(): void {
+    this.loginModalService.open();
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0cff2b0744bd6b1b31fb206b0eca2110e1106ebe
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { PasswordResetFinishComponent } from './password-reset-finish.component';
+
+export const passwordResetFinishRoute: Route = {
+  path: 'reset/finish',
+  component: PasswordResetFinishComponent,
+  data: {
+    authorities: [],
+    pageTitle: 'global.menu.account.password'
+  }
+};
diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24736292014875ba61d02e1f81e1c99344a5da27
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts
@@ -0,0 +1,14 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+@Injectable({ providedIn: 'root' })
+export class PasswordResetFinishService {
+  constructor(private http: HttpClient) {}
+
+  save(key: string, newPassword: string): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'api/account/reset-password/finish', { key, newPassword });
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..3c05c6d972e089142010b463fd90a145d5ff6568
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html
@@ -0,0 +1,53 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <h1 jhiTranslate="reset.request.title">Reset your password</h1>
+
+            <jhi-alert-error></jhi-alert-error>
+
+            <div class="alert alert-warning" *ngIf="!success">
+                <span jhiTranslate="reset.request.messages.info">Enter the email address you used to register.</span>
+            </div>
+
+            <div class="alert alert-success" *ngIf="success">
+                <span jhiTranslate="reset.request.messages.success">Check your emails for details on how to reset your password.</span>
+            </div>
+
+            <form *ngIf="!success" name="form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm">
+                <div class="form-group">
+                    <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
+                    <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}"
+                           formControlName="email" #email>
+
+                    <div *ngIf="resetRequestForm.get('email')!.invalid && (resetRequestForm.get('email')!.dirty || resetRequestForm.get('email')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="resetRequestForm.get('email')?.errors?.required"
+                               jhiTranslate="global.messages.validate.email.required">
+                            Your email is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="resetRequestForm.get('email')?.errors?.email"
+                               jhiTranslate="global.messages.validate.email.invalid">
+                            Your email is invalid.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="resetRequestForm.get('email')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.email.minlength">
+                            Your email is required to be at least 5 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="resetRequestForm.get('email')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.email.maxlength">
+                            Your email cannot be longer than 100 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <button type="submit" [disabled]="resetRequestForm.invalid" class="btn btn-primary" jhiTranslate="reset.request.form.button">Reset</button>
+            </form>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e8d4fb403f7fbcaf868dc471d9d062fc73cf3ef8
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts
@@ -0,0 +1,30 @@
+import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
+import { FormBuilder, Validators } from '@angular/forms';
+
+import { PasswordResetInitService } from './password-reset-init.service';
+
+@Component({
+  selector: 'jhi-password-reset-init',
+  templateUrl: './password-reset-init.component.html'
+})
+export class PasswordResetInitComponent implements AfterViewInit {
+  @ViewChild('email', { static: false })
+  email?: ElementRef;
+
+  success = false;
+  resetRequestForm = this.fb.group({
+    email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]]
+  });
+
+  constructor(private passwordResetInitService: PasswordResetInitService, private fb: FormBuilder) {}
+
+  ngAfterViewInit(): void {
+    if (this.email) {
+      this.email.nativeElement.focus();
+    }
+  }
+
+  requestReset(): void {
+    this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true));
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..887c77bc24e2e5b4231eef5640d148c246bc64d7
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { PasswordResetInitComponent } from './password-reset-init.component';
+
+export const passwordResetInitRoute: Route = {
+  path: 'reset/request',
+  component: PasswordResetInitComponent,
+  data: {
+    authorities: [],
+    pageTitle: 'global.menu.account.password'
+  }
+};
diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..368500c39b1b268e4af7bbade8cc44d5ef54bd77
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts
@@ -0,0 +1,14 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+@Injectable({ providedIn: 'root' })
+export class PasswordResetInitService {
+  constructor(private http: HttpClient) {}
+
+  save(mail: string): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'api/account/reset-password/init', mail);
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ebeca9296e02aa38771c8fc4a3b7245c2b3ac031
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts
@@ -0,0 +1,85 @@
+import { Component, ElementRef, Input, Renderer2 } from '@angular/core';
+
+@Component({
+  selector: 'jhi-password-strength-bar',
+  template: `
+    <div id="strength">
+      <small jhiTranslate="global.messages.validate.newpassword.strength">Password strength:</small>
+      <ul id="strengthBar">
+        <li class="point"></li>
+        <li class="point"></li>
+        <li class="point"></li>
+        <li class="point"></li>
+        <li class="point"></li>
+      </ul>
+    </div>
+  `,
+  styleUrls: ['password-strength-bar.scss']
+})
+export class PasswordStrengthBarComponent {
+  colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];
+
+  constructor(private renderer: Renderer2, private elementRef: ElementRef) {}
+
+  measureStrength(p: string): number {
+    let force = 0;
+    const regex = /[$-/:-?{-~!"^_`[\]]/g; // "
+    const lowerLetters = /[a-z]+/.test(p);
+    const upperLetters = /[A-Z]+/.test(p);
+    const numbers = /[0-9]+/.test(p);
+    const symbols = regex.test(p);
+
+    const flags = [lowerLetters, upperLetters, numbers, symbols];
+    const passedMatches = flags.filter((isMatchedFlag: boolean) => {
+      return isMatchedFlag === true;
+    }).length;
+
+    force += 2 * p.length + (p.length >= 10 ? 1 : 0);
+    force += passedMatches * 10;
+
+    // penalty (short password)
+    force = p.length <= 6 ? Math.min(force, 10) : force;
+
+    // penalty (poor variety of characters)
+    force = passedMatches === 1 ? Math.min(force, 10) : force;
+    force = passedMatches === 2 ? Math.min(force, 20) : force;
+    force = passedMatches === 3 ? Math.min(force, 40) : force;
+
+    return force;
+  }
+
+  getColor(s: number): { idx: number; color: string } {
+    let idx = 0;
+    if (s <= 10) {
+      idx = 0;
+    } else if (s <= 20) {
+      idx = 1;
+    } else if (s <= 30) {
+      idx = 2;
+    } else if (s <= 40) {
+      idx = 3;
+    } else {
+      idx = 4;
+    }
+    return { idx: idx + 1, color: this.colors[idx] };
+  }
+
+  @Input()
+  set passwordToCheck(password: string) {
+    if (password) {
+      const c = this.getColor(this.measureStrength(password));
+      const element = this.elementRef.nativeElement;
+      if (element.className) {
+        this.renderer.removeClass(element, element.className);
+      }
+      const lis = element.getElementsByTagName('li');
+      for (let i = 0; i < lis.length; i++) {
+        if (i < c.idx) {
+          this.renderer.setStyle(lis[i], 'backgroundColor', c.color);
+        } else {
+          this.renderer.setStyle(lis[i], 'backgroundColor', '#DDD');
+        }
+      }
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.scss b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..67ce4687a3527ee38673fd320516072fcd67ce55
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss
@@ -0,0 +1,23 @@
+/* ==========================================================================
+start Password strength bar style
+========================================================================== */
+ul#strength {
+  display: inline;
+  list-style: none;
+  margin: 0;
+  margin-left: 15px;
+  padding: 0;
+  vertical-align: 2px;
+}
+
+.point {
+  background: #ddd;
+  border-radius: 2px;
+  display: inline-block;
+  height: 5px;
+  margin-right: 1px;
+  width: 20px;
+  &:last-child {
+    margin: 0 !important;
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password/password.component.html b/borestop/src/main/webapp/app/account/password/password.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..020d32f4f64ad338e378457df33a92550557e57d
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password.component.html
@@ -0,0 +1,94 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-8" *ngIf="account$ | async as account">
+            <h2 jhiTranslate="password.title" [translateValues]="{ username: account.login }">Password for [<strong>{{ account.login }}</strong>]</h2>
+
+            <div class="alert alert-success" *ngIf="success" jhiTranslate="password.messages.success">
+                <strong>Password changed!</strong>
+            </div>
+
+            <div class="alert alert-danger" *ngIf="error" jhiTranslate="password.messages.error">
+                <strong>An error has occurred!</strong> The password could not be changed.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch">
+                The password and its confirmation do not match!
+            </div>
+
+            <form name="form" role="form" (ngSubmit)="changePassword()" [formGroup]="passwordForm">
+                <div class="form-group">
+                    <label class="form-control-label" for="currentPassword" jhiTranslate="global.form.currentpassword.label">Current password</label>
+                    <input type="password" class="form-control" id="currentPassword" name="currentPassword"
+                           placeholder="{{ 'global.form.currentpassword.placeholder' | translate }}"
+                           formControlName="currentPassword">
+
+                    <div *ngIf="passwordForm.get('currentPassword')!.invalid && (passwordForm.get('currentPassword')!.dirty || passwordForm.get('currentPassword')!.touched)" >
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('currentPassword')?.errors?.required"
+                               jhiTranslate="global.messages.validate.newpassword.required">
+                            Your password is required.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label>
+                    <input type="password" class="form-control" id="newPassword" name="newPassword"
+                           placeholder="{{ 'global.form.newpassword.placeholder' | translate }}"
+                           formControlName="newPassword">
+
+                    <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('newPassword')?.errors?.required"
+                               jhiTranslate="global.messages.validate.newpassword.required">
+                            Your password is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('newPassword')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.newpassword.minlength">
+                            Your password is required to be at least 4 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('newPassword')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.newpassword.maxlength">
+                            Your password cannot be longer than 50 characters.
+                        </small>
+                    </div>
+
+                    <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label>
+                    <input type="password" class="form-control" id="confirmPassword" name="confirmPassword"
+                           placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}"
+                           formControlName="confirmPassword">
+
+                    <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('confirmPassword')?.errors?.required"
+                               jhiTranslate="global.messages.validate.confirmpassword.required">
+                            Your confirmation password is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.confirmpassword.minlength">
+                            Your confirmation password is required to be at least 4 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.confirmpassword.maxlength">
+                            Your confirmation password cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="password.form.button">Save</button>
+            </form>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/password/password.component.ts b/borestop/src/main/webapp/app/account/password/password.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5ceca30344db1e3ba9fc6fae708a746b0e91ba99
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password.component.ts
@@ -0,0 +1,45 @@
+import { Component, OnInit } from '@angular/core';
+import { FormBuilder, Validators } from '@angular/forms';
+import { Observable } from 'rxjs';
+
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+import { PasswordService } from './password.service';
+
+@Component({
+  selector: 'jhi-password',
+  templateUrl: './password.component.html'
+})
+export class PasswordComponent implements OnInit {
+  doNotMatch = false;
+  error = false;
+  success = false;
+  account$?: Observable<Account | null>;
+  passwordForm = this.fb.group({
+    currentPassword: ['', [Validators.required]],
+    newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]],
+    confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]]
+  });
+
+  constructor(private passwordService: PasswordService, private accountService: AccountService, private fb: FormBuilder) {}
+
+  ngOnInit(): void {
+    this.account$ = this.accountService.identity();
+  }
+
+  changePassword(): void {
+    this.error = false;
+    this.success = false;
+    this.doNotMatch = false;
+
+    const newPassword = this.passwordForm.get(['newPassword'])!.value;
+    if (newPassword !== this.passwordForm.get(['confirmPassword'])!.value) {
+      this.doNotMatch = true;
+    } else {
+      this.passwordService.save(newPassword, this.passwordForm.get(['currentPassword'])!.value).subscribe(
+        () => (this.success = true),
+        () => (this.error = true)
+      );
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/password/password.route.ts b/borestop/src/main/webapp/app/account/password/password.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab3b6264f7d23584c3e031db26f50a9d862f5cd4
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password.route.ts
@@ -0,0 +1,15 @@
+import { Route } from '@angular/router';
+
+import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
+import { PasswordComponent } from './password.component';
+import { Authority } from 'app/shared/constants/authority.constants';
+
+export const passwordRoute: Route = {
+  path: 'password',
+  component: PasswordComponent,
+  data: {
+    authorities: [Authority.USER],
+    pageTitle: 'global.menu.account.password'
+  },
+  canActivate: [UserRouteAccessService]
+};
diff --git a/borestop/src/main/webapp/app/account/password/password.service.ts b/borestop/src/main/webapp/app/account/password/password.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..13017f8ce4ecd00d681b6b4bf796e7d09a00caa3
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/password/password.service.ts
@@ -0,0 +1,14 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+@Injectable({ providedIn: 'root' })
+export class PasswordService {
+  constructor(private http: HttpClient) {}
+
+  save(newPassword: string, currentPassword: string): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'api/account/change-password', { currentPassword, newPassword });
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/register/register.component.html b/borestop/src/main/webapp/app/account/register/register.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..7f8c8136cd399a31557c01dc3bd7baaba370daef
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/register/register.component.html
@@ -0,0 +1,158 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <h1 jhiTranslate="register.title">Registration</h1>
+
+            <div class="alert alert-success" *ngIf="success" jhiTranslate="register.messages.success">
+                <strong>Registration saved!</strong> Please check your email for confirmation.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="error" jhiTranslate="register.messages.error.fail">
+                <strong>Registration failed!</strong> Please try again later.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="errorUserExists" jhiTranslate="register.messages.error.userexists">
+                <strong>Login name already registered!</strong> Please choose another one.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="errorEmailExists" jhiTranslate="register.messages.error.emailexists">
+                <strong>Email is already in use!</strong> Please choose another one.
+            </div>
+
+            <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch">
+                The password and its confirmation do not match!
+            </div>
+        </div>
+    </div>
+
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <form name="form" role="form" (ngSubmit)="register()" [formGroup]="registerForm" *ngIf="!success">
+                <div class="form-group">
+                    <label class="form-control-label" for="login" jhiTranslate="global.form.username.label">Username</label>
+                    <input type="text" class="form-control" id="login" name="login" placeholder="{{ 'global.form.username.placeholder' | translate }}"
+                           formControlName="login" #login>
+
+                    <div *ngIf="registerForm.get('login')!.invalid && (registerForm.get('login')!.dirty || registerForm.get('login')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('login')?.errors?.required"
+                               jhiTranslate="register.messages.validate.login.required">
+                            Your username is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('login')?.errors?.minlength"
+                               jhiTranslate="register.messages.validate.login.minlength">
+                            Your username is required to be at least 1 character.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('login')?.errors?.maxlength"
+                               jhiTranslate="register.messages.validate.login.maxlength">
+                            Your username cannot be longer than 50 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('login')?.errors?.pattern"
+                               jhiTranslate="register.messages.validate.login.pattern">
+                            Your username can only contain letters and digits.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
+                    <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}"
+                             formControlName="email">
+
+                    <div *ngIf="registerForm.get('email')!.invalid && (registerForm.get('email')!.dirty || registerForm.get('email')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('email')?.errors?.required"
+                               jhiTranslate="global.messages.validate.email.required">
+                            Your email is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('email')?.errors?.invalid"
+                               jhiTranslate="global.messages.validate.email.invalid">
+                            Your email is invalid.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('email')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.email.minlength">
+                            Your email is required to be at least 5 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('email')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.email.maxlength">
+                            Your email cannot be longer than 100 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="password" jhiTranslate="global.form.newpassword.label">New password</label>
+                    <input type="password" class="form-control" id="password" name="password" placeholder="{{ 'global.form.newpassword.placeholder' | translate }}"
+                            formControlName="password">
+
+                    <div *ngIf="registerForm.get('password')!.invalid && (registerForm.get('password')!.dirty || registerForm.get('password')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('password')?.errors?.required"
+                               jhiTranslate="global.messages.validate.newpassword.required">
+                            Your password is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('password')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.newpassword.minlength">
+                            Your password is required to be at least 4 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('password')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.newpassword.maxlength">
+                            Your password cannot be longer than 50 characters.
+                        </small>
+                    </div>
+
+                    <jhi-password-strength-bar [passwordToCheck]="registerForm.get('password')!.value"></jhi-password-strength-bar>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label>
+                    <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}"
+                            formControlName="confirmPassword">
+
+                    <div *ngIf="registerForm.get('confirmPassword')!.invalid && (registerForm.get('confirmPassword')!.dirty || registerForm.get('confirmPassword')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('confirmPassword')?.errors?.required"
+                               jhiTranslate="global.messages.validate.confirmpassword.required">
+                            Your confirmation password is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('confirmPassword')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.confirmpassword.minlength">
+                            Your confirmation password is required to be at least 4 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="registerForm.get('confirmPassword')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.confirmpassword.maxlength">
+                            Your confirmation password cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <button type="submit" [disabled]="registerForm.invalid" class="btn btn-primary" jhiTranslate="register.form.button">Register</button>
+            </form>
+
+            <div class="mt-3 alert alert-warning">
+                <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span>
+                <a class="alert-link" (click)="openLogin()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/register/register.component.ts b/borestop/src/main/webapp/app/account/register/register.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c54223facd2a81f1c24bd02d9cd448eec23b273
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/register/register.component.ts
@@ -0,0 +1,84 @@
+import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
+import { HttpErrorResponse } from '@angular/common/http';
+import { FormBuilder, Validators } from '@angular/forms';
+import { JhiLanguageService } from 'ng-jhipster';
+
+import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { RegisterService } from './register.service';
+
+@Component({
+  selector: 'jhi-register',
+  templateUrl: './register.component.html'
+})
+export class RegisterComponent implements AfterViewInit {
+  @ViewChild('login', { static: false })
+  login?: ElementRef;
+
+  doNotMatch = false;
+  error = false;
+  errorEmailExists = false;
+  errorUserExists = false;
+  success = false;
+
+  registerForm = this.fb.group({
+    login: [
+      '',
+      [
+        Validators.required,
+        Validators.minLength(1),
+        Validators.maxLength(50),
+        Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$')
+      ]
+    ],
+    email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]],
+    password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]],
+    confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]]
+  });
+
+  constructor(
+    private languageService: JhiLanguageService,
+    private loginModalService: LoginModalService,
+    private registerService: RegisterService,
+    private fb: FormBuilder
+  ) {}
+
+  ngAfterViewInit(): void {
+    if (this.login) {
+      this.login.nativeElement.focus();
+    }
+  }
+
+  register(): void {
+    this.doNotMatch = false;
+    this.error = false;
+    this.errorEmailExists = false;
+    this.errorUserExists = false;
+
+    const password = this.registerForm.get(['password'])!.value;
+    if (password !== this.registerForm.get(['confirmPassword'])!.value) {
+      this.doNotMatch = true;
+    } else {
+      const login = this.registerForm.get(['login'])!.value;
+      const email = this.registerForm.get(['email'])!.value;
+      this.registerService.save({ login, email, password, langKey: this.languageService.getCurrentLanguage() }).subscribe(
+        () => (this.success = true),
+        response => this.processError(response)
+      );
+    }
+  }
+
+  openLogin(): void {
+    this.loginModalService.open();
+  }
+
+  private processError(response: HttpErrorResponse): void {
+    if (response.status === 400 && response.error.type === LOGIN_ALREADY_USED_TYPE) {
+      this.errorUserExists = true;
+    } else if (response.status === 400 && response.error.type === EMAIL_ALREADY_USED_TYPE) {
+      this.errorEmailExists = true;
+    } else {
+      this.error = true;
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/register/register.route.ts b/borestop/src/main/webapp/app/account/register/register.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f4ede9d3ab68c2a93b76c78c373177938d9871d7
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/register/register.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { RegisterComponent } from './register.component';
+
+export const registerRoute: Route = {
+  path: 'register',
+  component: RegisterComponent,
+  data: {
+    authorities: [],
+    pageTitle: 'register.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/account/register/register.service.ts b/borestop/src/main/webapp/app/account/register/register.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9a519152bc2a4e34fb111949b59d78c709fcd1fb
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/register/register.service.ts
@@ -0,0 +1,15 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { IUser } from 'app/core/user/user.model';
+
+@Injectable({ providedIn: 'root' })
+export class RegisterService {
+  constructor(private http: HttpClient) {}
+
+  save(account: IUser): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'api/register', account);
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.html b/borestop/src/main/webapp/app/account/settings/settings.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..e7665a3edcc9bdebd175e5969a68928846a0026a
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/settings/settings.component.html
@@ -0,0 +1,108 @@
+<div>
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <h2 jhiTranslate="settings.title" [translateValues]="{ username: account.login }" *ngIf="account">User settings for [<b>{{ account.login }}</b>]</h2>
+
+            <div class="alert alert-success" *ngIf="success" jhiTranslate="settings.messages.success">
+                <strong>Settings saved!</strong>
+            </div>
+
+            <jhi-alert-error></jhi-alert-error>
+
+            <form name="form" role="form" (ngSubmit)="save()" [formGroup]="settingsForm" *ngIf="account" novalidate>
+                <div class="form-group">
+                    <label class="form-control-label" for="firstName" jhiTranslate="settings.form.firstname">First Name</label>
+                    <input type="text" class="form-control" id="firstName" name="firstName" placeholder="{{ 'settings.form.firstname.placeholder' | translate }}"
+                           formControlName="firstName">
+
+                    <div *ngIf="settingsForm.get('firstName')!.invalid && (settingsForm.get('firstName')!.dirty || settingsForm.get('firstName')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('firstName')?.errors?.required"
+                               jhiTranslate="settings.messages.validate.firstname.required">
+                            Your first name is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('firstName')?.errors?.minlength"
+                               jhiTranslate="settings.messages.validate.firstname.minlength">
+                            Your first name is required to be at least 1 character.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('firstName')?.errors?.maxlength"
+                               jhiTranslate="settings.messages.validate.firstname.maxlength">
+                            Your first name cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="lastName" jhiTranslate="settings.form.lastname">Last Name</label>
+                    <input type="text" class="form-control" id="lastName" name="lastName" placeholder="{{ 'settings.form.lastname.placeholder' | translate }}"
+                           formControlName="lastName">
+
+                    <div *ngIf="settingsForm.get('lastName')!.invalid && (settingsForm.get('lastName')!.dirty || settingsForm.get('lastName')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('lastName')?.errors?.required"
+                               jhiTranslate="settings.messages.validate.lastname.required">
+                            Your last name is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('lastName')?.errors?.minlength"
+                               jhiTranslate="settings.messages.validate.lastname.minlength">
+                            Your last name is required to be at least 1 character.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('lastName')?.errors?.maxlength"
+                               jhiTranslate="settings.messages.validate.lastname.maxlength">
+                            Your last name cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
+                    <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}"
+                           formControlName="email">
+
+                    <div *ngIf="settingsForm.get('email')!.invalid && (settingsForm.get('email')!.dirty || settingsForm.get('email')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('email')?.errors?.required"
+                               jhiTranslate="global.messages.validate.email.required">
+                            Your email is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('email')?.errors?.email"
+                               jhiTranslate="global.messages.validate.email.invalid">
+                            Your email is invalid.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('email')?.errors?.minlength"
+                               jhiTranslate="global.messages.validate.email.minlength">
+                            Your email is required to be at least 5 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="settingsForm.get('email')?.errors?.maxlength"
+                               jhiTranslate="global.messages.validate.email.maxlength">
+                            Your email cannot be longer than 100 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group" *ngIf="languages && languages.length > 0">
+                    <label for="langKey" jhiTranslate="settings.form.language">Language</label>
+                    <select class="form-control" id="langKey" name="langKey" formControlName="langKey">
+                        <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option>
+                    </select>
+                </div>
+
+                <button type="submit" [disabled]="settingsForm.invalid" class="btn btn-primary" jhiTranslate="settings.form.button">Save</button>
+            </form>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.ts b/borestop/src/main/webapp/app/account/settings/settings.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b40197f600106c6eac6eefd4e5f03d0616b9a229
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/settings/settings.component.ts
@@ -0,0 +1,59 @@
+import { Component, OnInit } from '@angular/core';
+import { FormBuilder, Validators } from '@angular/forms';
+import { JhiLanguageService } from 'ng-jhipster';
+
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+import { LANGUAGES } from 'app/core/language/language.constants';
+
+@Component({
+  selector: 'jhi-settings',
+  templateUrl: './settings.component.html'
+})
+export class SettingsComponent implements OnInit {
+  account!: Account;
+  success = false;
+  languages = LANGUAGES;
+  settingsForm = this.fb.group({
+    firstName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]],
+    lastName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]],
+    email: [undefined, [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]],
+    langKey: [undefined]
+  });
+
+  constructor(private accountService: AccountService, private fb: FormBuilder, private languageService: JhiLanguageService) {}
+
+  ngOnInit(): void {
+    this.accountService.identity().subscribe(account => {
+      if (account) {
+        this.settingsForm.patchValue({
+          firstName: account.firstName,
+          lastName: account.lastName,
+          email: account.email,
+          langKey: account.langKey
+        });
+
+        this.account = account;
+      }
+    });
+  }
+
+  save(): void {
+    this.success = false;
+
+    this.account.firstName = this.settingsForm.get('firstName')!.value;
+    this.account.lastName = this.settingsForm.get('lastName')!.value;
+    this.account.email = this.settingsForm.get('email')!.value;
+    this.account.langKey = this.settingsForm.get('langKey')!.value;
+
+    this.accountService.save(this.account).subscribe(() => {
+      this.success = true;
+
+      this.accountService.authenticate(this.account);
+
+      if (this.account.langKey !== this.languageService.getCurrentLanguage()) {
+        this.languageService.changeLanguage(this.account.langKey);
+      }
+    });
+  }
+}
diff --git a/borestop/src/main/webapp/app/account/settings/settings.route.ts b/borestop/src/main/webapp/app/account/settings/settings.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2deeda95d1afb75b36ac753d176fc8988d67fbed
--- /dev/null
+++ b/borestop/src/main/webapp/app/account/settings/settings.route.ts
@@ -0,0 +1,15 @@
+import { Route } from '@angular/router';
+
+import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
+import { SettingsComponent } from './settings.component';
+import { Authority } from 'app/shared/constants/authority.constants';
+
+export const settingsRoute: Route = {
+  path: 'settings',
+  component: SettingsComponent,
+  data: {
+    authorities: [Authority.USER],
+    pageTitle: 'global.menu.account.settings'
+  },
+  canActivate: [UserRouteAccessService]
+};
diff --git a/borestop/src/main/webapp/app/admin/admin-routing.module.ts b/borestop/src/main/webapp/app/admin/admin-routing.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f10ae6846ca3020da5476dfd174249da86bfcc50
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/admin-routing.module.ts
@@ -0,0 +1,44 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+/* jhipster-needle-add-admin-module-import - JHipster will add admin modules imports here */
+
+@NgModule({
+  imports: [
+    /* jhipster-needle-add-admin-module - JHipster will add admin modules here */
+    RouterModule.forChild([
+      {
+        path: 'user-management',
+        loadChildren: () => import('./user-management/user-management.module').then(m => m.UserManagementModule),
+        data: {
+          pageTitle: 'userManagement.home.title'
+        }
+      },
+      {
+        path: 'audits',
+        loadChildren: () => import('./audits/audits.module').then(m => m.AuditsModule)
+      },
+      {
+        path: 'configuration',
+        loadChildren: () => import('./configuration/configuration.module').then(m => m.ConfigurationModule)
+      },
+      {
+        path: 'docs',
+        loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
+      },
+      {
+        path: 'health',
+        loadChildren: () => import('./health/health.module').then(m => m.HealthModule)
+      },
+      {
+        path: 'logs',
+        loadChildren: () => import('./logs/logs.module').then(m => m.LogsModule)
+      },
+      {
+        path: 'metrics',
+        loadChildren: () => import('./metrics/metrics.module').then(m => m.MetricsModule)
+      }
+      /* jhipster-needle-add-admin-route - JHipster will add admin routes here */
+    ])
+  ]
+})
+export class AdminRoutingModule {}
diff --git a/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7d5bef460e5d83729cd0793261c6b5780c2cf444
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts
@@ -0,0 +1,3 @@
+export class AuditData {
+  constructor(public remoteAddress?: string, public sessionId?: string, public message?: string) {}
+}
diff --git a/borestop/src/main/webapp/app/admin/audits/audit.model.ts b/borestop/src/main/webapp/app/admin/audits/audit.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c6410745e87174adb42c7398cc5640e10ea0fc3
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audit.model.ts
@@ -0,0 +1,5 @@
+import { AuditData } from './audit-data.model';
+
+export class Audit {
+  constructor(public data: AuditData, public principal: string, public timestamp: string, public type: string) {}
+}
diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.html b/borestop/src/main/webapp/app/admin/audits/audits.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..4884222333e0231d2c02272f01840f682b675db8
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audits.component.html
@@ -0,0 +1,67 @@
+<div>
+    <h2 id="audits-page-heading" jhiTranslate="audits.title">Audits</h2>
+
+    <jhi-alert-error></jhi-alert-error>
+
+    <div class="row">
+        <div class="col-md-5">
+            <h4 jhiTranslate="audits.filter.title">Filter by date</h4>
+
+            <div class="input-group mb-3">
+                <div class="input-group-prepend">
+                    <span class="input-group-text" jhiTranslate="audits.filter.from">from</span>
+                </div>
+                <input type="date" class="form-control" name="start" [(ngModel)]="fromDate" (ngModelChange)="transition()" required/>
+
+                <div class="input-group-append">
+                    <span class="input-group-text" jhiTranslate="audits.filter.to">To</span>
+                </div>
+                <input type="date" class="form-control" name="end" [(ngModel)]="toDate" (ngModelChange)="transition()" required/>
+            </div>
+        </div>
+    </div>
+
+    <div class="alert alert-warning" *ngIf="audits?.length === 0">
+        <span jhiTranslate="audits.notFound">No audit found</span>
+    </div>
+
+    <div class="table-responsive" *ngIf="audits && audits.length > 0">
+        <table class="table table-sm table-striped" aria-describedby="audits-page-heading">
+            <thead [ngSwitch]="canLoad()">
+                <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)" *ngSwitchCase="true">
+                    <th scope="col" jhiSortBy="auditEventDate"><span jhiTranslate="audits.table.header.date">Date</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col" jhiSortBy="principal"><span jhiTranslate="audits.table.header.principal">User</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col" jhiSortBy="auditEventType"><span jhiTranslate="audits.table.header.status">State</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th>
+                </tr>
+                <tr *ngSwitchCase="false">
+                    <th scope="col"><span jhiTranslate="audits.table.header.date">Date</span></th>
+                    <th scope="col"><span jhiTranslate="audits.table.header.principal">User</span></th>
+                    <th scope="col"><span jhiTranslate="audits.table.header.status">State</span></th>
+                    <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr *ngFor="let audit of audits">
+                    <td><span>{{ audit.timestamp | date:'medium' }}</span></td>
+                    <td><small>{{ audit.principal }}</small></td>
+                    <td>{{ audit.type }}</td>
+                    <td>
+                        <span *ngIf="audit.data?.message">{{ audit.data.message }}</span>
+                        <span *ngIf="audit.data?.remoteAddress"><span jhiTranslate="audits.table.data.remoteAddress">Remote Address</span> {{ audit.data.remoteAddress }}</span>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+
+    <div *ngIf="audits && audits.length > 0">
+        <div class="row justify-content-center">
+            <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count>
+        </div>
+
+        <div class="row justify-content-center">
+            <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()" [disabled]="!canLoad()"></ngb-pagination>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.ts b/borestop/src/main/webapp/app/admin/audits/audits.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f9683c18a2729537e9c74fa8eb539cdfa6593f7b
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audits.component.ts
@@ -0,0 +1,115 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpResponse, HttpHeaders } from '@angular/common/http';
+import { DatePipe } from '@angular/common';
+import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router';
+import { combineLatest } from 'rxjs';
+
+import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants';
+import { Audit } from './audit.model';
+import { AuditsService } from './audits.service';
+
+@Component({
+  selector: 'jhi-audit',
+  templateUrl: './audits.component.html'
+})
+export class AuditsComponent implements OnInit {
+  audits?: Audit[];
+  fromDate = '';
+  itemsPerPage = ITEMS_PER_PAGE;
+  page!: number;
+  predicate!: string;
+  ascending!: boolean;
+  toDate = '';
+  totalItems = 0;
+
+  private dateFormat = 'yyyy-MM-dd';
+
+  constructor(
+    private auditsService: AuditsService,
+    private activatedRoute: ActivatedRoute,
+    private datePipe: DatePipe,
+    private router: Router
+  ) {}
+
+  ngOnInit(): void {
+    this.toDate = this.today();
+    this.fromDate = this.previousMonth();
+    this.handleNavigation();
+  }
+
+  canLoad(): boolean {
+    return this.fromDate !== '' && this.toDate !== '';
+  }
+
+  transition(): void {
+    if (this.canLoad()) {
+      this.router.navigate(['/admin/audits'], {
+        queryParams: {
+          page: this.page,
+          sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc'),
+          from: this.fromDate,
+          to: this.toDate
+        }
+      });
+    }
+  }
+
+  private previousMonth(): string {
+    let date = new Date();
+    if (date.getMonth() === 0) {
+      date = new Date(date.getFullYear() - 1, 11, date.getDate());
+    } else {
+      date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
+    }
+    return this.datePipe.transform(date, this.dateFormat)!;
+  }
+
+  private today(): string {
+    // Today + 1 day - needed if the current day must be included
+    const date = new Date();
+    date.setDate(date.getDate() + 1);
+    return this.datePipe.transform(date, this.dateFormat)!;
+  }
+
+  private handleNavigation(): void {
+    combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => {
+      const page = params.get('page');
+      this.page = page !== null ? +page : 1;
+      const sort = (params.get('sort') ?? data['defaultSort']).split(',');
+      this.predicate = sort[0];
+      this.ascending = sort[1] === 'asc';
+      if (params.get('from')) {
+        this.fromDate = this.datePipe.transform(params.get('from'), this.dateFormat)!;
+      }
+      if (params.get('to')) {
+        this.toDate = this.datePipe.transform(params.get('to'), this.dateFormat)!;
+      }
+      this.loadData();
+    }).subscribe();
+  }
+
+  private loadData(): void {
+    this.auditsService
+      .query({
+        page: this.page - 1,
+        size: this.itemsPerPage,
+        sort: this.sort(),
+        fromDate: this.fromDate,
+        toDate: this.toDate
+      })
+      .subscribe((res: HttpResponse<Audit[]>) => this.onSuccess(res.body, res.headers));
+  }
+
+  private sort(): string[] {
+    const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')];
+    if (this.predicate !== 'id') {
+      result.push('id');
+    }
+    return result;
+  }
+
+  private onSuccess(audits: Audit[] | null, headers: HttpHeaders): void {
+    this.totalItems = Number(headers.get('X-Total-Count'));
+    this.audits = audits || [];
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/audits/audits.module.ts b/borestop/src/main/webapp/app/admin/audits/audits.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..15d1fbe6090ea14d45d1bad34cb4efa8c97be227
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audits.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { AuditsComponent } from './audits.component';
+
+import { auditsRoute } from './audits.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([auditsRoute])],
+  declarations: [AuditsComponent]
+})
+export class AuditsModule {}
diff --git a/borestop/src/main/webapp/app/admin/audits/audits.route.ts b/borestop/src/main/webapp/app/admin/audits/audits.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..14e86977f2c1b08efd8957d78293c53b99e1d401
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audits.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { AuditsComponent } from './audits.component';
+
+export const auditsRoute: Route = {
+  path: '',
+  component: AuditsComponent,
+  data: {
+    pageTitle: 'audits.title',
+    defaultSort: 'auditEventDate,desc'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/audits/audits.service.ts b/borestop/src/main/webapp/app/admin/audits/audits.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d86bf47bd3f98c069e0e2114981cf29822839345
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/audits/audits.service.ts
@@ -0,0 +1,28 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { createRequestOption, Pagination } from 'app/shared/util/request-util';
+import { SERVER_API_URL } from 'app/app.constants';
+import { Audit } from './audit.model';
+
+export interface AuditsQuery extends Pagination {
+  fromDate: string;
+  toDate: string;
+}
+
+@Injectable({ providedIn: 'root' })
+export class AuditsService {
+  constructor(private http: HttpClient) {}
+
+  query(req: AuditsQuery): Observable<HttpResponse<Audit[]>> {
+    const params: HttpParams = createRequestOption(req);
+
+    const requestURL = SERVER_API_URL + 'management/audits';
+
+    return this.http.get<Audit[]>(requestURL, {
+      params,
+      observe: 'response'
+    });
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.html b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..1002f7a0aabf465339496dc931af304414bc41d6
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html
@@ -0,0 +1,50 @@
+<div *ngIf="allBeans">
+    <h2 id="configuration-page-heading" jhiTranslate="configuration.title">Configuration</h2>
+
+    <span jhiTranslate="configuration.filter">Filter (by prefix)</span> <input type="text" [(ngModel)]="beansFilter" (ngModelChange)="filterAndSortBeans()" class="form-control">
+
+    <h3 id="spring-configuration">Spring configuration</h3>
+
+    <table class="table table-striped table-bordered table-responsive d-table" aria-describedby="spring-configuration">
+        <thead>
+            <tr jhiSort predicate="prefix" [(ascending)]="beansAscending" [callback]="filterAndSortBeans.bind(this)">
+                <th jhiSortBy="prefix" scope="col" class="w-40"><span jhiTranslate="configuration.table.prefix">Prefix</span> <fa-icon icon="sort"></fa-icon></th>
+                <th scope="col" class="w-60"><span jhiTranslate="configuration.table.properties">Properties</span></th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr *ngFor="let bean of beans">
+                <td><span>{{ bean.prefix }}</span></td>
+                <td>
+                    <div class="row" *ngFor="let property of bean.properties | keys">
+                        <div class="col-md-4">{{ property.key }}</div>
+                        <div class="col-md-8">
+                            <span class="float-right badge-secondary break">{{ property.value | json }}</span>
+                        </div>
+                    </div>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+
+    <div *ngFor="let propertySource of propertySources; let i = index">
+        <h4 [id]="'property-source-' + i"><span>{{ propertySource.name }}</span></h4>
+
+        <table class="table table-sm table-striped table-bordered table-responsive d-table" [attr.aria-describedby]="'property-source-' + i"><!-- //NOSONAR -->
+            <thead>
+                <tr>
+                    <th scope="col" class="w-40">Property</th>
+                    <th scope="col" class="w-60">Value</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr *ngFor="let property of propertySource.properties | keys">
+                    <td class="break">{{ property.key }}</td>
+                    <td class="break">
+                        <span class="float-right badge-secondary break">{{ property.value.value }}</span>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..679e71abe7de34a20dbbd21b19a103dffd9639b4
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts
@@ -0,0 +1,32 @@
+import { Component, OnInit } from '@angular/core';
+
+import { ConfigurationService, Bean, PropertySource } from './configuration.service';
+
+@Component({
+  selector: 'jhi-configuration',
+  templateUrl: './configuration.component.html'
+})
+export class ConfigurationComponent implements OnInit {
+  allBeans!: Bean[];
+  beans: Bean[] = [];
+  beansFilter = '';
+  beansAscending = true;
+  propertySources: PropertySource[] = [];
+
+  constructor(private configurationService: ConfigurationService) {}
+
+  ngOnInit(): void {
+    this.configurationService.getBeans().subscribe(beans => {
+      this.allBeans = beans;
+      this.filterAndSortBeans();
+    });
+
+    this.configurationService.getPropertySources().subscribe(propertySources => (this.propertySources = propertySources));
+  }
+
+  filterAndSortBeans(): void {
+    this.beans = this.allBeans
+      .filter(bean => !this.beansFilter || bean.prefix.toLowerCase().includes(this.beansFilter.toLowerCase()))
+      .sort((a, b) => (a.prefix < b.prefix ? (this.beansAscending ? -1 : 1) : this.beansAscending ? 1 : -1));
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab8f02c8c9e0b56662875844cc4cb24cd163c895
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { ConfigurationComponent } from './configuration.component';
+
+import { configurationRoute } from './configuration.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([configurationRoute])],
+  declarations: [ConfigurationComponent]
+})
+export class ConfigurationModule {}
diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..17238c9312ecf3ee46bb28a819d1acc057dd6e84
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts
@@ -0,0 +1,11 @@
+import { Route } from '@angular/router';
+
+import { ConfigurationComponent } from './configuration.component';
+
+export const configurationRoute: Route = {
+  path: '',
+  component: ConfigurationComponent,
+  data: {
+    pageTitle: 'configuration.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..69ea43a0408d09fb6884ec368c3310a7100ba2cb
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts
@@ -0,0 +1,68 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+export interface ConfigProps {
+  contexts: Contexts;
+}
+
+export interface Contexts {
+  [key: string]: Context;
+}
+
+export interface Context {
+  beans: Beans;
+  parentId?: any;
+}
+
+export interface Beans {
+  [key: string]: Bean;
+}
+
+export interface Bean {
+  prefix: string;
+  properties: any;
+}
+
+export interface Env {
+  activeProfiles?: string[];
+  propertySources: PropertySource[];
+}
+
+export interface PropertySource {
+  name: string;
+  properties: Properties;
+}
+
+export interface Properties {
+  [key: string]: Property;
+}
+
+export interface Property {
+  value: string;
+  origin?: string;
+}
+
+@Injectable({ providedIn: 'root' })
+export class ConfigurationService {
+  constructor(private http: HttpClient) {}
+
+  getBeans(): Observable<Bean[]> {
+    return this.http.get<ConfigProps>(SERVER_API_URL + 'management/configprops').pipe(
+      map(configProps =>
+        Object.values(
+          Object.values(configProps.contexts)
+            .map(context => context.beans)
+            .reduce((allBeans: Beans, contextBeans: Beans) => ({ ...allBeans, ...contextBeans }))
+        )
+      )
+    );
+  }
+
+  getPropertySources(): Observable<PropertySource[]> {
+    return this.http.get<Env>(SERVER_API_URL + 'management/env').pipe(map(env => env.propertySources));
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.html b/borestop/src/main/webapp/app/admin/docs/docs.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9d1600b88ccbadb1a5bf544fc14697b0d2a2962c
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/docs/docs.component.html
@@ -0,0 +1,2 @@
+<iframe src="swagger-ui/index.html" width="100%" height="900" seamless
+        target="_top" title="Swagger UI" class="border-0"></iframe>
diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.ts b/borestop/src/main/webapp/app/admin/docs/docs.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8942f1a4594b1a60d6e56d43cbc84dfaeb90305c
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/docs/docs.component.ts
@@ -0,0 +1,8 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'jhi-docs',
+  templateUrl: './docs.component.html',
+  styleUrls: ['docs.scss']
+})
+export class DocsComponent {}
diff --git a/borestop/src/main/webapp/app/admin/docs/docs.module.ts b/borestop/src/main/webapp/app/admin/docs/docs.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0ddab0ba0946058ee28d0b6374f45b86a0179f95
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/docs/docs.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { DocsComponent } from './docs.component';
+
+import { docsRoute } from './docs.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([docsRoute])],
+  declarations: [DocsComponent]
+})
+export class DocsModule {}
diff --git a/borestop/src/main/webapp/app/admin/docs/docs.route.ts b/borestop/src/main/webapp/app/admin/docs/docs.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b2aead9d5fef3849cc0a0dc4d9aaadbcbbb769a4
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/docs/docs.route.ts
@@ -0,0 +1,11 @@
+import { Route } from '@angular/router';
+
+import { DocsComponent } from './docs.component';
+
+export const docsRoute: Route = {
+  path: '',
+  component: DocsComponent,
+  data: {
+    pageTitle: 'global.menu.admin.apidocs'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/docs/docs.scss b/borestop/src/main/webapp/app/admin/docs/docs.scss
new file mode 100644
index 0000000000000000000000000000000000000000..541c3d79be70938e96e7ab9d36815538f71af1cc
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/docs/docs.scss
@@ -0,0 +1,6 @@
+@import '~bootstrap/scss/functions';
+@import '~bootstrap/scss/variables';
+
+iframe {
+  background: white;
+}
diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.html b/borestop/src/main/webapp/app/admin/health/health-modal.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..5556f47d3c9475db4ab64427e4c013783f8c7316
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.html
@@ -0,0 +1,36 @@
+<div class="modal-header">
+    <h4 class="modal-title" id="showHealthLabel" *ngIf="health">
+        {{ 'health.indicator.' + health.key | translate }}
+    </h4>
+
+    <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="dismiss()">
+        <span aria-hidden="true">&times;</span>
+    </button>
+</div>
+
+<div class="modal-body pad">
+    <div *ngIf="health">
+        <h5 jhiTranslate="health.details.properties">Properties</h5>
+
+        <div class="table-responsive">
+            <table class="table table-striped" aria-describedby="showHealthLabel">
+                <thead>
+                    <tr>
+                        <th scope="col" class="text-left" jhiTranslate="health.details.name">Name</th>
+                        <th scope="col" class="text-left" jhiTranslate="health.details.value">Value</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr *ngFor="let healthDetail of health.value.details | keys">
+                        <td class="text-left">{{ healthDetail.key }}</td>
+                        <td class="text-left">{{ readableValue(healthDetail.value) }}</td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+<div class="modal-footer">
+    <button data-dismiss="modal" class="btn btn-secondary float-left" type="button" (click)="dismiss()">Done</button>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.ts b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..54f360f95c740b6539f5aaab637a2375c5384876
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts
@@ -0,0 +1,37 @@
+import { Component } from '@angular/core';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { HealthKey, HealthDetails } from './health.service';
+
+@Component({
+  selector: 'jhi-health-modal',
+  templateUrl: './health-modal.component.html'
+})
+export class HealthModalComponent {
+  health?: { key: HealthKey; value: HealthDetails };
+
+  constructor(public activeModal: NgbActiveModal) {}
+
+  readableValue(value: any): string {
+    if (this.health && this.health.key === 'diskSpace') {
+      // Should display storage space in an human readable unit
+      const val = value / 1073741824;
+      if (val > 1) {
+        // Value
+        return val.toFixed(2) + ' GB';
+      } else {
+        return (value / 1048576).toFixed(2) + ' MB';
+      }
+    }
+
+    if (typeof value === 'object') {
+      return JSON.stringify(value);
+    } else {
+      return value.toString();
+    }
+  }
+
+  dismiss(): void {
+    this.activeModal.dismiss();
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/health/health.component.html b/borestop/src/main/webapp/app/admin/health/health.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..b686fcbb2c62a80fcdb049bc512fd6c3f61d0e27
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health.component.html
@@ -0,0 +1,38 @@
+<div>
+    <h2>
+        <span id="health-page-heading" jhiTranslate="health.title">Health Checks</span>
+
+        <button class="btn btn-primary float-right" (click)="refresh()">
+            <fa-icon icon="sync"></fa-icon> <span jhiTranslate="health.refresh.button">Refresh</span>
+        </button>
+    </h2>
+
+    <div class="table-responsive">
+        <table id="healthCheck" class="table table-striped" aria-describedby="health-page-heading">
+            <thead>
+                <tr>
+                    <th scope="col" jhiTranslate="health.table.service">Service Name</th>
+                    <th scope="col" class="text-center" jhiTranslate="health.table.status">Status</th>
+                    <th scope="col" class="text-center" jhiTranslate="health.details.details">Details</th>
+                </tr>
+            </thead>
+            <tbody *ngIf="health">
+                <tr *ngFor="let componentHealth of health.components | keys">
+                    <td>
+                        {{ 'health.indicator.' + componentHealth.key | translate }}
+                    </td>
+                    <td class="text-center">
+                        <span class="badge" [ngClass]="getBadgeClass(componentHealth.value.status)" jhiTranslate="{{ 'health.status.' + componentHealth.value.status }}">
+                            {{ componentHealth.value.status }}
+                        </span>
+                    </td>
+                    <td class="text-center">
+                        <a class="hand" (click)="showHealth(componentHealth)" *ngIf="componentHealth.value.details">
+                            <fa-icon icon="eye"></fa-icon>
+                        </a>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/health/health.component.ts b/borestop/src/main/webapp/app/admin/health/health.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d33b6322f02b27a0706690a39c7f1fe4dc12c25f
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health.component.ts
@@ -0,0 +1,44 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpErrorResponse } from '@angular/common/http';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { HealthService, HealthStatus, Health, HealthKey, HealthDetails } from './health.service';
+import { HealthModalComponent } from './health-modal.component';
+
+@Component({
+  selector: 'jhi-health',
+  templateUrl: './health.component.html'
+})
+export class HealthComponent implements OnInit {
+  health?: Health;
+
+  constructor(private modalService: NgbModal, private healthService: HealthService) {}
+
+  ngOnInit(): void {
+    this.refresh();
+  }
+
+  getBadgeClass(statusState: HealthStatus): string {
+    if (statusState === 'UP') {
+      return 'badge-success';
+    } else {
+      return 'badge-danger';
+    }
+  }
+
+  refresh(): void {
+    this.healthService.checkHealth().subscribe(
+      health => (this.health = health),
+      (error: HttpErrorResponse) => {
+        if (error.status === 503) {
+          this.health = error.error;
+        }
+      }
+    );
+  }
+
+  showHealth(health: { key: HealthKey; value: HealthDetails }): void {
+    const modalRef = this.modalService.open(HealthModalComponent);
+    modalRef.componentInstance.health = health;
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/health/health.module.ts b/borestop/src/main/webapp/app/admin/health/health.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24fdd6b34556c77235c11f15248cffa9aeca9739
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health.module.ts
@@ -0,0 +1,15 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { HealthComponent } from './health.component';
+import { HealthModalComponent } from './health-modal.component';
+
+import { healthRoute } from './health.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([healthRoute])],
+  declarations: [HealthComponent, HealthModalComponent],
+  entryComponents: [HealthModalComponent]
+})
+export class HealthModule {}
diff --git a/borestop/src/main/webapp/app/admin/health/health.route.ts b/borestop/src/main/webapp/app/admin/health/health.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1055dcc0733f8a2af297ff41946c41b74613093b
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health.route.ts
@@ -0,0 +1,11 @@
+import { Route } from '@angular/router';
+
+import { HealthComponent } from './health.component';
+
+export const healthRoute: Route = {
+  path: '',
+  component: HealthComponent,
+  data: {
+    pageTitle: 'health.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/health/health.service.ts b/borestop/src/main/webapp/app/admin/health/health.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..25005f64aca274c49cd182226bcac1aaf18658a5
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/health/health.service.ts
@@ -0,0 +1,30 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE';
+
+export type HealthKey = 'diskSpace' | 'mail' | 'ping' | 'db';
+
+export interface Health {
+  status: HealthStatus;
+  components: {
+    [key in HealthKey]?: HealthDetails;
+  };
+}
+
+export interface HealthDetails {
+  status: HealthStatus;
+  details: any;
+}
+
+@Injectable({ providedIn: 'root' })
+export class HealthService {
+  constructor(private http: HttpClient) {}
+
+  checkHealth(): Observable<Health> {
+    return this.http.get<Health>(SERVER_API_URL + 'management/health');
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/logs/log.model.ts b/borestop/src/main/webapp/app/admin/logs/log.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..83f2e154a961d4aae3799eea827dfe5ac1ee5f39
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/log.model.ts
@@ -0,0 +1,15 @@
+export type Level = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'OFF';
+
+export interface Logger {
+  configuredLevel: Level | null;
+  effectiveLevel: Level;
+}
+
+export interface LoggersResponse {
+  levels: Level[];
+  loggers: { [key: string]: Logger };
+}
+
+export class Log {
+  constructor(public name: string, public level: Level) {}
+}
diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.html b/borestop/src/main/webapp/app/admin/logs/logs.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..b0473e3a9df4a099cad7333aba266dccd04edabc
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/logs.component.html
@@ -0,0 +1,28 @@
+<div class="table-responsive" *ngIf="loggers">
+    <h2 id="logs-page-heading" jhiTranslate="logs.title">Logs</h2>
+
+    <p jhiTranslate="logs.nbloggers" [translateValues]="{ total: loggers.length }">There are {{ loggers.length }} loggers.</p>
+
+    <span jhiTranslate="logs.filter">Filter</span> <input type="text" [(ngModel)]="filter" class="form-control">
+
+    <table class="table table-sm table-striped table-bordered" aria-describedby="logs-page-heading">
+        <thead>
+            <tr title="click to order">
+                <th scope="col" (click)="orderProp = 'name'; reverse=!reverse"><span jhiTranslate="logs.table.name">Name</span></th>
+                <th scope="col" (click)="orderProp = 'level'; reverse=!reverse"><span jhiTranslate="logs.table.level">Level</span></th>
+            </tr>
+        </thead>
+
+        <tr *ngFor="let logger of (loggers | pureFilter:filter:'name' | orderBy:orderProp:reverse)">
+            <td><small>{{ logger.name | slice:0:140 }}</small></td>
+            <td>
+                <button (click)="changeLevel(logger.name, 'TRACE')" [ngClass]="(logger.level=='TRACE') ? 'btn-primary' : 'btn-light'" class="btn btn-sm">TRACE</button>
+                <button (click)="changeLevel(logger.name, 'DEBUG')" [ngClass]="(logger.level=='DEBUG') ? 'btn-success' : 'btn-light'" class="btn btn-sm">DEBUG</button>
+                <button (click)="changeLevel(logger.name, 'INFO')" [ngClass]="(logger.level=='INFO') ? 'btn-info' : 'btn-light'" class="btn btn-sm">INFO</button>
+                <button (click)="changeLevel(logger.name, 'WARN')" [ngClass]="(logger.level=='WARN') ? 'btn-warning' : 'btn-light'" class="btn btn-sm">WARN</button>
+                <button (click)="changeLevel(logger.name, 'ERROR')" [ngClass]="(logger.level=='ERROR') ? 'btn-danger' : 'btn-light'" class="btn btn-sm">ERROR</button>
+                <button (click)="changeLevel(logger.name, 'OFF')" [ngClass]="(logger.level=='OFF') ? 'btn-secondary' : 'btn-light'" class="btn btn-sm">OFF</button>
+            </td>
+        </tr>
+    </table>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.ts b/borestop/src/main/webapp/app/admin/logs/logs.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..13b7102ce771b4f428a91220028a5083a9a1f04a
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/logs.component.ts
@@ -0,0 +1,34 @@
+import { Component, OnInit } from '@angular/core';
+
+import { Log, LoggersResponse, Logger, Level } from './log.model';
+import { LogsService } from './logs.service';
+
+@Component({
+  selector: 'jhi-logs',
+  templateUrl: './logs.component.html'
+})
+export class LogsComponent implements OnInit {
+  loggers?: Log[];
+  filter = '';
+  orderProp = 'name';
+  reverse = false;
+
+  constructor(private logsService: LogsService) {}
+
+  ngOnInit(): void {
+    this.findAndExtractLoggers();
+  }
+
+  changeLevel(name: string, level: Level): void {
+    this.logsService.changeLevel(name, level).subscribe(() => this.findAndExtractLoggers());
+  }
+
+  private findAndExtractLoggers(): void {
+    this.logsService
+      .findAll()
+      .subscribe(
+        (response: LoggersResponse) =>
+          (this.loggers = Object.entries(response.loggers).map((logger: [string, Logger]) => new Log(logger[0], logger[1].effectiveLevel)))
+      );
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/logs/logs.module.ts b/borestop/src/main/webapp/app/admin/logs/logs.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ba914e1026bffd26b1a2d1e203469b291da2b59e
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/logs.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { LogsComponent } from './logs.component';
+
+import { logsRoute } from './logs.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([logsRoute])],
+  declarations: [LogsComponent]
+})
+export class LogsModule {}
diff --git a/borestop/src/main/webapp/app/admin/logs/logs.route.ts b/borestop/src/main/webapp/app/admin/logs/logs.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d1cf0241393e6fbcb0f8ac5b948b3b7274f4d2ed
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/logs.route.ts
@@ -0,0 +1,11 @@
+import { Route } from '@angular/router';
+
+import { LogsComponent } from './logs.component';
+
+export const logsRoute: Route = {
+  path: '',
+  component: LogsComponent,
+  data: {
+    pageTitle: 'logs.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/logs/logs.service.ts b/borestop/src/main/webapp/app/admin/logs/logs.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dc9956deea77b9033072dc409a83546e7678e43d
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/logs/logs.service.ts
@@ -0,0 +1,19 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { LoggersResponse, Level } from './log.model';
+
+@Injectable({ providedIn: 'root' })
+export class LogsService {
+  constructor(private http: HttpClient) {}
+
+  changeLevel(name: string, configuredLevel: Level): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'management/loggers/' + name, { configuredLevel });
+  }
+
+  findAll(): Observable<LoggersResponse> {
+    return this.http.get<LoggersResponse>(SERVER_API_URL + 'management/loggers');
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.html b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..731a7a9ec914f5cdc66060369754d65f743d981a
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html
@@ -0,0 +1,65 @@
+<div>
+    <h2>
+        <span id="metrics-page-heading" jhiTranslate="metrics.title">Application Metrics</span>
+
+        <button class="btn btn-primary float-right" (click)="refresh()">
+            <fa-icon icon="sync"></fa-icon> <span jhiTranslate="metrics.refresh.button">Refresh</span>
+        </button>
+    </h2>
+
+    <h3 jhiTranslate="metrics.jvm.title">JVM Metrics</h3>
+
+    <div class="row" *ngIf="metrics && !updatingMetrics">
+        <jhi-jvm-memory
+            class="col-md-4"
+            [updating]="updatingMetrics"
+            [jvmMemoryMetrics]="metrics.jvm">
+        </jhi-jvm-memory>
+
+        <jhi-jvm-threads
+            class="col-md-4"
+            [threadData]="threads">
+        </jhi-jvm-threads>
+
+        <jhi-metrics-system
+            class="col-md-4"
+            [updating]="updatingMetrics"
+            [systemMetrics]="metrics.processMetrics">
+        </jhi-metrics-system>
+    </div>
+
+    <div *ngIf="metrics && metricsKeyExists('garbageCollector')">
+        <h3 jhiTranslate="metrics.jvm.gc.title">Garbage collector statistics</h3>
+
+        <jhi-metrics-garbagecollector
+            [updating]="updatingMetrics"
+            [garbageCollectorMetrics]="metrics.garbageCollector">
+        </jhi-metrics-garbagecollector>
+    </div>
+
+    <div class="well well-lg" *ngIf="updatingMetrics" jhiTranslate="metrics.updating">Updating...</div>
+
+    <jhi-metrics-request
+        *ngIf="metrics && metricsKeyExists('http.server.requests')"
+        [updating]="updatingMetrics"
+        [requestMetrics]="metrics['http.server.requests']">
+    </jhi-metrics-request>
+
+    <jhi-metrics-endpoints-requests
+        *ngIf="metrics && metricsKeyExists('services')"
+        [updating]="updatingMetrics"
+        [endpointsRequestsMetrics]="metrics.services">
+    </jhi-metrics-endpoints-requests>
+
+    <jhi-metrics-cache
+        *ngIf="metrics && metricsKeyExists('cache')"
+        [updating]="updatingMetrics"
+        [cacheMetrics]="metrics.cache">
+    </jhi-metrics-cache>
+
+    <jhi-metrics-datasource
+        *ngIf="metrics && metricsKeyExistsAndObjectNotEmpty('databases')"
+        [updating]="updatingMetrics"
+        [datasourceMetrics]="metrics.databases">
+    </jhi-metrics-datasource>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..130e65d635e434581414a367024742bb5f1769e9
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts
@@ -0,0 +1,47 @@
+import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
+import { flatMap } from 'rxjs/operators';
+
+import { MetricsService, Metrics, MetricsKey, ThreadDump, Thread } from './metrics.service';
+
+@Component({
+  selector: 'jhi-metrics',
+  templateUrl: './metrics.component.html',
+  changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class MetricsComponent implements OnInit {
+  metrics?: Metrics;
+  threads?: Thread[];
+  updatingMetrics = true;
+
+  constructor(private metricsService: MetricsService, private changeDetector: ChangeDetectorRef) {}
+
+  ngOnInit(): void {
+    this.refresh();
+  }
+
+  refresh(): void {
+    this.updatingMetrics = true;
+    this.metricsService
+      .getMetrics()
+      .pipe(
+        flatMap(
+          () => this.metricsService.threadDump(),
+          (metrics: Metrics, threadDump: ThreadDump) => {
+            this.metrics = metrics;
+            this.threads = threadDump.threads;
+            this.updatingMetrics = false;
+            this.changeDetector.detectChanges();
+          }
+        )
+      )
+      .subscribe();
+  }
+
+  metricsKeyExists(key: MetricsKey): boolean {
+    return this.metrics && this.metrics[key];
+  }
+
+  metricsKeyExistsAndObjectNotEmpty(key: MetricsKey): boolean {
+    return this.metrics && this.metrics[key] && JSON.stringify(this.metrics[key]) !== '{}';
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9cf7be4cd6c43e3992bbdcac8b063df553767260
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+
+import { MetricsComponent } from './metrics.component';
+
+import { metricsRoute } from './metrics.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([metricsRoute])],
+  declarations: [MetricsComponent]
+})
+export class MetricsModule {}
diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f85fd61d83b05a6353d53ce108d8eed7bc82b2d0
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts
@@ -0,0 +1,11 @@
+import { Route } from '@angular/router';
+
+import { MetricsComponent } from './metrics.component';
+
+export const metricsRoute: Route = {
+  path: '',
+  component: MetricsComponent,
+  data: {
+    pageTitle: 'metrics.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a8d0c99a7729f9303c97585bf73efd20f34b48e7
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts
@@ -0,0 +1,23 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+export type MetricsKey = 'jvm' | 'http.server.requests' | 'cache' | 'services' | 'databases' | 'garbageCollector' | 'processMetrics';
+export type Metrics = { [key in MetricsKey]: any };
+export type Thread = any;
+export type ThreadDump = { threads: Thread[] };
+
+@Injectable({ providedIn: 'root' })
+export class MetricsService {
+  constructor(private http: HttpClient) {}
+
+  getMetrics(): Observable<Metrics> {
+    return this.http.get<Metrics>(SERVER_API_URL + 'management/jhimetrics');
+  }
+
+  threadDump(): Observable<ThreadDump> {
+    return this.http.get<ThreadDump>(SERVER_API_URL + 'management/threaddump');
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..ad7d3cd421344c9fe5d9375e62102c40f28d777c
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html
@@ -0,0 +1,23 @@
+<form *ngIf="user" name="deleteForm" (ngSubmit)="confirmDelete(user?.login!)">
+    <div class="modal-header">
+        <h4 class="modal-title" jhiTranslate="entity.delete.title">Confirm delete operation</h4>
+
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">&times;</button>
+    </div>
+
+    <div class="modal-body">
+        <jhi-alert-error></jhi-alert-error>
+
+        <p jhiTranslate="userManagement.delete.question" [translateValues]="{ login: user.login }">Are you sure you want to delete this User?</p>
+    </div>
+
+    <div class="modal-footer">
+        <button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()">
+            <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+        </button>
+
+        <button type="submit" class="btn btn-danger">
+            <fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span>
+        </button>
+    </div>
+</form>
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fdda5fb5a24b8d1237b2555e9f6109e99d6b2c08
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts
@@ -0,0 +1,27 @@
+import { Component } from '@angular/core';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { JhiEventManager } from 'ng-jhipster';
+
+import { User } from 'app/core/user/user.model';
+import { UserService } from 'app/core/user/user.service';
+
+@Component({
+  selector: 'jhi-user-mgmt-delete-dialog',
+  templateUrl: './user-management-delete-dialog.component.html'
+})
+export class UserManagementDeleteDialogComponent {
+  user?: User;
+
+  constructor(private userService: UserService, public activeModal: NgbActiveModal, private eventManager: JhiEventManager) {}
+
+  cancel(): void {
+    this.activeModal.dismiss();
+  }
+
+  confirmDelete(login: string): void {
+    this.userService.delete(login).subscribe(() => {
+      this.eventManager.broadcast('userListModification');
+      this.activeModal.close();
+    });
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..7fda1fe36e8087ff83b06959d71a76f00ce86781
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html
@@ -0,0 +1,58 @@
+<div class="row justify-content-center">
+    <div class="col-8">
+        <div *ngIf="user">
+            <h2>
+                <span jhiTranslate="userManagement.detail.title">User</span> [<b>{{ user.login }}</b>]
+            </h2>
+
+            <dl class="row-md jh-entity-details">
+                <dt><span jhiTranslate="userManagement.login">Login</span></dt>
+                <dd>
+                    <span>{{ user.login }}</span>
+                    <jhi-boolean
+                        [value]="user.activated ? true : false"
+                        [textTrue]="'userManagement.activated' | translate"
+                        [textFalse]="'userManagement.deactivated' | translate">
+                    </jhi-boolean>
+                </dd>
+
+                <dt><span jhiTranslate="userManagement.firstName">First Name</span></dt>
+                <dd>{{ user.firstName }}</dd>
+
+                <dt><span jhiTranslate="userManagement.lastName">Last Name</span></dt>
+                <dd>{{ user.lastName }}</dd>
+
+                <dt><span jhiTranslate="userManagement.email">Email</span></dt>
+                <dd>{{ user.email }}</dd>
+
+                <dt><span jhiTranslate="userManagement.langKey">Lang Key</span></dt>
+                <dd>{{ user.langKey }}</dd>
+
+                <dt><span jhiTranslate="userManagement.createdBy">Created By</span></dt>
+                <dd>{{ user.createdBy }}</dd>
+
+                <dt><span jhiTranslate="userManagement.createdDate">Created Date</span></dt>
+                <dd>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</dd>
+
+                <dt><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span></dt>
+                <dd>{{ user.lastModifiedBy }}</dd>
+
+                <dt><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span></dt>
+                <dd>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</dd>
+
+                <dt><span jhiTranslate="userManagement.profiles">Profiles</span></dt>
+                <dd>
+                    <ul class="list-unstyled">
+                        <li *ngFor="let authority of user.authorities">
+                            <span class="badge badge-info">{{ authority }}</span>
+                        </li>
+                    </ul>
+                </dd>
+            </dl>
+
+            <button type="submit" routerLink="../../" class="btn btn-info">
+                <fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.back">Back</span>
+            </button>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..19cc78a32cb2f43f117c6af078e5ea3eac0150e7
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts
@@ -0,0 +1,18 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { User } from 'app/core/user/user.model';
+
+@Component({
+  selector: 'jhi-user-mgmt-detail',
+  templateUrl: './user-management-detail.component.html'
+})
+export class UserManagementDetailComponent implements OnInit {
+  user: User | null = null;
+
+  constructor(private route: ActivatedRoute) {}
+
+  ngOnInit(): void {
+    this.route.data.subscribe(({ user }) => (this.user = user));
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..41647a9a7771231186b5573c37757ed86ac64b78
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html
@@ -0,0 +1,140 @@
+<div class="row justify-content-center">
+    <div class="col-8">
+        <form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
+            <h2 id="myUserLabel" jhiTranslate="userManagement.home.createOrEditLabel">
+                Create or edit a User
+            </h2>
+
+            <div *ngIf="user">
+                <jhi-alert-error></jhi-alert-error>
+
+                <div class="form-group" [hidden]="!user.id">
+                    <label jhiTranslate="global.field.id">ID</label>
+                    <input type="text" class="form-control" name="id" formControlName="id" readonly>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="userManagement.login">Login</label>
+                    <input type="text" class="form-control" name="login"
+                           formControlName="login">
+
+                    <div *ngIf="editForm.get('login')!.invalid && (editForm.get('login')!.dirty || editForm.get('login')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('login')?.errors?.required"
+                               jhiTranslate="entity.validation.required">
+                            This field is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('login')?.errors?.maxlength"
+                               jhiTranslate="entity.validation.maxlength"
+                               [translateValues]="{ max: 50 }">
+                            This field cannot be longer than 50 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('login')?.errors?.pattern"
+                               jhiTranslate="entity.validation.patternLogin">
+                            This field can only contain letters, digits and e-mail addresses.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="userManagement.firstName">First Name</label>
+                    <input type="text" class="form-control" name="firstName"
+                           formControlName="firstName">
+
+                    <div *ngIf="editForm.get('firstName')!.invalid && (editForm.get('firstName')!.dirty || editForm.get('firstName')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('firstName')?.errors?.maxlength"
+                               jhiTranslate="entity.validation.maxlength"
+                               [translateValues]="{ max: 50 }">
+                            This field cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label jhiTranslate="userManagement.lastName">Last Name</label>
+                    <input type="text" class="form-control" name="lastName"
+                           formControlName="lastName">
+
+                    <div *ngIf="editForm.get('lastName')!.invalid && (editForm.get('lastName')!.dirty || editForm.get('lastName')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('lastName')?.errors?.maxlength"
+                               jhiTranslate="entity.validation.maxlength"
+                               [translateValues]="{ max: 50 }">
+                            This field cannot be longer than 50 characters.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="userManagement.email">Email</label>
+                    <input type="email" class="form-control" name="email" formControlName="email">
+
+                    <div *ngIf="editForm.get('email')!.invalid && (editForm.get('email')!.dirty || editForm.get('email')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('email')?.errors?.required"
+                               jhiTranslate="entity.validation.required">
+                            This field is required.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('email')?.errors?.maxlength"
+                               jhiTranslate="entity.validation.maxlength"
+                               [translateValues]="{ max: 100 }">
+                            This field cannot be longer than 100 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('email')?.errors?.minlength"
+                               jhiTranslate="entity.validation.minlength"
+                               [translateValues]="{ min: 5 }">
+                            This field is required to be at least 5 characters.
+                        </small>
+
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('email')?.errors?.email"
+                               jhiTranslate="global.messages.validate.email.invalid">
+                            Your email is invalid.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-check">
+                    <label class="form-check-label" for="activated">
+                        <input class="form-check-input" [attr.disabled]="user.id === undefined ? 'disabled' : null"
+                               type="checkbox" id="activated" name="activated" formControlName="activated">
+                        <span jhiTranslate="userManagement.activated">Activated</span>
+                    </label>
+                </div>
+
+                <div class="form-group" *ngIf="languages && languages.length > 0">
+                    <label jhiTranslate="userManagement.langKey">Lang Key</label>
+                    <select class="form-control" id="langKey" name="langKey" formControlName="langKey">
+                        <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option>
+                    </select>
+                </div>
+
+                <div class="form-group">
+                    <label jhiTranslate="userManagement.profiles">Profiles</label>
+                    <select class="form-control" multiple name="authority" formControlName="authorities">
+                        <option *ngFor="let authority of authorities" [value]="authority">{{ authority }}</option>
+                    </select>
+                </div>
+            </div>
+
+            <div *ngIf="user">
+                <button type="button" class="btn btn-secondary" (click)="previousState()">
+                    <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+                </button>
+
+                <button type="submit" [disabled]="editForm.invalid || isSaving" class="btn btn-primary">
+                    <fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span>
+                </button>
+            </div>
+        </form>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cefd387cb4ba64132922d4fda4bd6ef601ba829c
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts
@@ -0,0 +1,106 @@
+import { Component, OnInit } from '@angular/core';
+import { FormBuilder, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+
+import { LANGUAGES } from 'app/core/language/language.constants';
+import { User } from 'app/core/user/user.model';
+import { UserService } from 'app/core/user/user.service';
+
+@Component({
+  selector: 'jhi-user-mgmt-update',
+  templateUrl: './user-management-update.component.html'
+})
+export class UserManagementUpdateComponent implements OnInit {
+  user!: User;
+  languages = LANGUAGES;
+  authorities: string[] = [];
+  isSaving = false;
+
+  editForm = this.fb.group({
+    id: [],
+    login: [
+      '',
+      [
+        Validators.required,
+        Validators.minLength(1),
+        Validators.maxLength(50),
+        Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$')
+      ]
+    ],
+    firstName: ['', [Validators.maxLength(50)]],
+    lastName: ['', [Validators.maxLength(50)]],
+    email: ['', [Validators.minLength(5), Validators.maxLength(254), Validators.email]],
+    activated: [],
+    langKey: [],
+    authorities: []
+  });
+
+  constructor(private userService: UserService, private route: ActivatedRoute, private fb: FormBuilder) {}
+
+  ngOnInit(): void {
+    this.route.data.subscribe(({ user }) => {
+      if (user) {
+        this.user = user;
+        if (this.user.id === undefined) {
+          this.user.activated = true;
+        }
+        this.updateForm(user);
+      }
+    });
+    this.userService.authorities().subscribe(authorities => {
+      this.authorities = authorities;
+    });
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+
+  save(): void {
+    this.isSaving = true;
+    this.updateUser(this.user);
+    if (this.user.id !== undefined) {
+      this.userService.update(this.user).subscribe(
+        () => this.onSaveSuccess(),
+        () => this.onSaveError()
+      );
+    } else {
+      this.userService.create(this.user).subscribe(
+        () => this.onSaveSuccess(),
+        () => this.onSaveError()
+      );
+    }
+  }
+
+  private updateForm(user: User): void {
+    this.editForm.patchValue({
+      id: user.id,
+      login: user.login,
+      firstName: user.firstName,
+      lastName: user.lastName,
+      email: user.email,
+      activated: user.activated,
+      langKey: user.langKey,
+      authorities: user.authorities
+    });
+  }
+
+  private updateUser(user: User): void {
+    user.login = this.editForm.get(['login'])!.value;
+    user.firstName = this.editForm.get(['firstName'])!.value;
+    user.lastName = this.editForm.get(['lastName'])!.value;
+    user.email = this.editForm.get(['email'])!.value;
+    user.activated = this.editForm.get(['activated'])!.value;
+    user.langKey = this.editForm.get(['langKey'])!.value;
+    user.authorities = this.editForm.get(['authorities'])!.value;
+  }
+
+  private onSaveSuccess(): void {
+    this.isSaving = false;
+    this.previousState();
+  }
+
+  private onSaveError(): void {
+    this.isSaving = false;
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..751712b69cf04f98220362f6f5d958b81b0e4d29
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html
@@ -0,0 +1,88 @@
+<div>
+    <h2>
+        <span id="user-management-page-heading" jhiTranslate="userManagement.home.title">Users</span>
+
+        <button class="btn btn-primary float-right jh-create-entity" [routerLink]="['./new']">
+            <fa-icon icon="plus"></fa-icon> <span jhiTranslate="userManagement.home.createLabel">Create a new User</span>
+        </button>
+    </h2>
+
+    <jhi-alert-error></jhi-alert-error>
+
+    <jhi-alert></jhi-alert>
+
+    <div class="table-responsive" *ngIf="users">
+        <table class="table table-striped" aria-describedby="user-management-page-heading">
+            <thead>
+                <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)">
+                    <th scope="col"  jhiSortBy="id"><span jhiTranslate="global.field.id">ID</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"  jhiSortBy="login"><span jhiTranslate="userManagement.login">Login</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"  jhiSortBy="email"><span jhiTranslate="userManagement.email">Email</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"></th>
+                    <th scope="col"  jhiSortBy="langKey"> <span jhiTranslate="userManagement.langKey">Lang Key</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"><span jhiTranslate="userManagement.profiles">Profiles</span></th>
+                    <th scope="col" jhiSortBy="createdDate"><span jhiTranslate="userManagement.createdDate">Created Date</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col" jhiSortBy="lastModifiedBy"><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col" jhiSortBy="lastModifiedDate"><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"></th>
+                </tr>
+            </thead>
+            <tbody *ngIf="users">
+                <tr *ngFor="let user of users; trackBy: trackIdentity">
+                    <td><a [routerLink]="['./', user.login, 'view']">{{ user.id }}</a></td>
+                    <td>{{ user.login }}</td>
+                    <td>{{ user.email }}</td>
+                    <td>
+                        <button class="btn btn-danger btn-sm" (click)="setActive(user, true)" *ngIf="!user.activated"
+                                jhiTranslate="userManagement.deactivated">Deactivated</button>
+                        <button class="btn btn-success btn-sm" (click)="setActive(user, false)" *ngIf="user.activated"
+                                [disabled]="!currentAccount || currentAccount.login === user.login" jhiTranslate="userManagement.activated">Activated</button>
+                    </td>
+                    <td>{{ user.langKey }}</td>
+                    <td>
+                        <div *ngFor="let authority of user.authorities">
+                            <span class="badge badge-info">{{ authority }}</span>
+                        </div>
+                    </td>
+                    <td>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</td>
+                    <td>{{ user.lastModifiedBy }}</td>
+                    <td>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</td>
+                    <td class="text-right">
+                        <div class="btn-group">
+                            <button type="submit"
+                                    [routerLink]="['./', user.login, 'view']"
+                                    class="btn btn-info btn-sm">
+                                <fa-icon icon="eye"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span>
+                            </button>
+
+                            <button type="submit"
+                                    [routerLink]="['./', user.login, 'edit']"
+                                    queryParamsHandling="merge"
+                                    class="btn btn-primary btn-sm">
+                                <fa-icon icon="pencil-alt"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span>
+                            </button>
+
+                            <button type="button" (click)="deleteUser(user)"
+                                    class="btn btn-danger btn-sm" [disabled]="!currentAccount || currentAccount.login === user.login">
+                                <fa-icon icon="times"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span>
+                            </button>
+                        </div>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+
+    <div *ngIf="users">
+        <div class="row justify-content-center">
+            <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count>
+        </div>
+
+        <div class="row justify-content-center">
+            <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()"></ngb-pagination>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..68554e1fab11bc8441bf30aa5713aab00c0a209b
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts
@@ -0,0 +1,106 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { HttpResponse, HttpHeaders } from '@angular/common/http';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { Subscription, combineLatest } from 'rxjs';
+import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router';
+import { JhiEventManager } from 'ng-jhipster';
+
+import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants';
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+import { UserService } from 'app/core/user/user.service';
+import { User } from 'app/core/user/user.model';
+import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component';
+
+@Component({
+  selector: 'jhi-user-mgmt',
+  templateUrl: './user-management.component.html'
+})
+export class UserManagementComponent implements OnInit, OnDestroy {
+  currentAccount: Account | null = null;
+  users: User[] | null = null;
+  userListSubscription?: Subscription;
+  totalItems = 0;
+  itemsPerPage = ITEMS_PER_PAGE;
+  page!: number;
+  predicate!: string;
+  ascending!: boolean;
+
+  constructor(
+    private userService: UserService,
+    private accountService: AccountService,
+    private activatedRoute: ActivatedRoute,
+    private router: Router,
+    private eventManager: JhiEventManager,
+    private modalService: NgbModal
+  ) {}
+
+  ngOnInit(): void {
+    this.accountService.identity().subscribe(account => (this.currentAccount = account));
+    this.userListSubscription = this.eventManager.subscribe('userListModification', () => this.loadAll());
+    this.handleNavigation();
+  }
+
+  ngOnDestroy(): void {
+    if (this.userListSubscription) {
+      this.eventManager.destroy(this.userListSubscription);
+    }
+  }
+
+  setActive(user: User, isActivated: boolean): void {
+    this.userService.update({ ...user, activated: isActivated }).subscribe(() => this.loadAll());
+  }
+
+  trackIdentity(index: number, item: User): any {
+    return item.id;
+  }
+
+  deleteUser(user: User): void {
+    const modalRef = this.modalService.open(UserManagementDeleteDialogComponent, { size: 'lg', backdrop: 'static' });
+    modalRef.componentInstance.user = user;
+  }
+
+  transition(): void {
+    this.router.navigate(['./'], {
+      relativeTo: this.activatedRoute.parent,
+      queryParams: {
+        page: this.page,
+        sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc')
+      }
+    });
+  }
+
+  private handleNavigation(): void {
+    combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => {
+      const page = params.get('page');
+      this.page = page !== null ? +page : 1;
+      const sort = (params.get('sort') ?? data['defaultSort']).split(',');
+      this.predicate = sort[0];
+      this.ascending = sort[1] === 'asc';
+      this.loadAll();
+    }).subscribe();
+  }
+
+  private loadAll(): void {
+    this.userService
+      .query({
+        page: this.page - 1,
+        size: this.itemsPerPage,
+        sort: this.sort()
+      })
+      .subscribe((res: HttpResponse<User[]>) => this.onSuccess(res.body, res.headers));
+  }
+
+  private sort(): string[] {
+    const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')];
+    if (this.predicate !== 'id') {
+      result.push('id');
+    }
+    return result;
+  }
+
+  private onSuccess(users: User[] | null, headers: HttpHeaders): void {
+    this.totalItems = Number(headers.get('X-Total-Count'));
+    this.users = users;
+  }
+}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4967467f34c141d120957edfebfda35d3e0b8a5c
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { BorestopSharedModule } from 'app/shared/shared.module';
+import { UserManagementComponent } from './user-management.component';
+import { UserManagementDetailComponent } from './user-management-detail.component';
+import { UserManagementUpdateComponent } from './user-management-update.component';
+import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component';
+import { userManagementRoute } from './user-management.route';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild(userManagementRoute)],
+  declarations: [
+    UserManagementComponent,
+    UserManagementDetailComponent,
+    UserManagementUpdateComponent,
+    UserManagementDeleteDialogComponent
+  ],
+  entryComponents: [UserManagementDeleteDialogComponent]
+})
+export class UserManagementModule {}
diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e3dcab9a80569ecd22513222725dc4ffcf067ca
--- /dev/null
+++ b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts
@@ -0,0 +1,53 @@
+import { Injectable } from '@angular/core';
+import { Resolve, ActivatedRouteSnapshot, Routes } from '@angular/router';
+import { Observable, of } from 'rxjs';
+
+import { User, IUser } from 'app/core/user/user.model';
+import { UserService } from 'app/core/user/user.service';
+import { UserManagementComponent } from './user-management.component';
+import { UserManagementDetailComponent } from './user-management-detail.component';
+import { UserManagementUpdateComponent } from './user-management-update.component';
+
+@Injectable({ providedIn: 'root' })
+export class UserManagementResolve implements Resolve<IUser> {
+  constructor(private service: UserService) {}
+
+  resolve(route: ActivatedRouteSnapshot): Observable<IUser> {
+    const id = route.params['login'];
+    if (id) {
+      return this.service.find(id);
+    }
+    return of(new User());
+  }
+}
+
+export const userManagementRoute: Routes = [
+  {
+    path: '',
+    component: UserManagementComponent,
+    data: {
+      defaultSort: 'id,asc'
+    }
+  },
+  {
+    path: ':login/view',
+    component: UserManagementDetailComponent,
+    resolve: {
+      user: UserManagementResolve
+    }
+  },
+  {
+    path: 'new',
+    component: UserManagementUpdateComponent,
+    resolve: {
+      user: UserManagementResolve
+    }
+  },
+  {
+    path: ':login/edit',
+    component: UserManagementUpdateComponent,
+    resolve: {
+      user: UserManagementResolve
+    }
+  }
+];
diff --git a/borestop/src/main/webapp/app/app-routing.module.ts b/borestop/src/main/webapp/app/app-routing.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7876544764144d73bc5e5267f11a9ba0ab250258
--- /dev/null
+++ b/borestop/src/main/webapp/app/app-routing.module.ts
@@ -0,0 +1,35 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { errorRoute } from './layouts/error/error.route';
+import { navbarRoute } from './layouts/navbar/navbar.route';
+import { DEBUG_INFO_ENABLED } from 'app/app.constants';
+import { Authority } from 'app/shared/constants/authority.constants';
+
+import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
+
+const LAYOUT_ROUTES = [navbarRoute, ...errorRoute];
+
+@NgModule({
+  imports: [
+    RouterModule.forRoot(
+      [
+        {
+          path: 'admin',
+          data: {
+            authorities: [Authority.ADMIN]
+          },
+          canActivate: [UserRouteAccessService],
+          loadChildren: () => import('./admin/admin-routing.module').then(m => m.AdminRoutingModule)
+        },
+        {
+          path: 'account',
+          loadChildren: () => import('./account/account.module').then(m => m.AccountModule)
+        },
+        ...LAYOUT_ROUTES
+      ],
+      { enableTracing: DEBUG_INFO_ENABLED }
+    )
+  ],
+  exports: [RouterModule]
+})
+export class BorestopAppRoutingModule {}
diff --git a/borestop/src/main/webapp/app/app.constants.ts b/borestop/src/main/webapp/app/app.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4b34b657c80d92be0797d302220a460bf84767f6
--- /dev/null
+++ b/borestop/src/main/webapp/app/app.constants.ts
@@ -0,0 +1,8 @@
+// These constants are injected via webpack environment variables.
+// You can add more variables in webpack.common.js or in profile specific webpack.<dev|prod>.js files.
+// If you change the values in the webpack config files, you need to re run webpack to update the application
+
+export const VERSION = process.env.VERSION;
+export const DEBUG_INFO_ENABLED = Boolean(process.env.DEBUG_INFO_ENABLED);
+export const SERVER_API_URL = process.env.SERVER_API_URL;
+export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP;
diff --git a/borestop/src/main/webapp/app/app.main.ts b/borestop/src/main/webapp/app/app.main.ts
new file mode 100644
index 0000000000000000000000000000000000000000..533cd323125a09dd65bd8f256e50a5678e67b9b6
--- /dev/null
+++ b/borestop/src/main/webapp/app/app.main.ts
@@ -0,0 +1,16 @@
+import './polyfills';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { ProdConfig } from './blocks/config/prod.config';
+import { BorestopAppModule } from './app.module';
+
+ProdConfig();
+
+if (module['hot']) {
+  module['hot'].accept();
+}
+
+platformBrowserDynamic()
+  .bootstrapModule(BorestopAppModule, { preserveWhitespaces: true })
+  // eslint-disable-next-line no-console
+  .then(() => console.log('Application started'))
+  .catch(err => console.error(err));
diff --git a/borestop/src/main/webapp/app/app.module.ts b/borestop/src/main/webapp/app/app.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6af86dabcfba74bdb4d8203a2750e10aabc4d47e
--- /dev/null
+++ b/borestop/src/main/webapp/app/app.module.ts
@@ -0,0 +1,31 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+
+import './vendor';
+import { BorestopSharedModule } from 'app/shared/shared.module';
+import { BorestopCoreModule } from 'app/core/core.module';
+import { BorestopAppRoutingModule } from './app-routing.module';
+import { BorestopHomeModule } from './home/home.module';
+import { BorestopEntityModule } from './entities/entity.module';
+// jhipster-needle-angular-add-module-import JHipster will add new module here
+import { MainComponent } from './layouts/main/main.component';
+import { NavbarComponent } from './layouts/navbar/navbar.component';
+import { FooterComponent } from './layouts/footer/footer.component';
+import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component';
+import { ActiveMenuDirective } from './layouts/navbar/active-menu.directive';
+import { ErrorComponent } from './layouts/error/error.component';
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    BorestopSharedModule,
+    BorestopCoreModule,
+    BorestopHomeModule,
+    // jhipster-needle-angular-add-module JHipster will add new module here
+    BorestopEntityModule,
+    BorestopAppRoutingModule
+  ],
+  declarations: [MainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, ActiveMenuDirective, FooterComponent],
+  bootstrap: [MainComponent]
+})
+export class BorestopAppModule {}
diff --git a/borestop/src/main/webapp/app/blocks/config/prod.config.ts b/borestop/src/main/webapp/app/blocks/config/prod.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b1ccef11da56dc23d549134c80708def4fdc2530
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/config/prod.config.ts
@@ -0,0 +1,9 @@
+import { enableProdMode } from '@angular/core';
+import { DEBUG_INFO_ENABLED } from 'app/app.constants';
+
+export function ProdConfig(): void {
+  // disable debug data on prod profile to improve performance
+  if (!DEBUG_INFO_ENABLED) {
+    enableProdMode();
+  }
+}
diff --git a/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..002c5cf89e4f2751a6b0b42abeeaa9a4f0777ec3
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts
@@ -0,0 +1,13 @@
+import { Injectable } from '@angular/core';
+import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap';
+import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants';
+
+@Injectable({ providedIn: 'root' })
+export class PaginationConfig {
+  constructor(config: NgbPaginationConfig) {
+    config.boundaryLinks = true;
+    config.maxSize = 5;
+    config.pageSize = ITEMS_PER_PAGE;
+    config.size = 'sm';
+  }
+}
diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a9fa62b6452510040af99f2c0f6ce91bf89b3b6f
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts
@@ -0,0 +1,32 @@
+import { Injectable } from '@angular/core';
+import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { tap } from 'rxjs/operators';
+import { Router } from '@angular/router';
+
+import { LoginService } from 'app/core/login/login.service';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { StateStorageService } from 'app/core/auth/state-storage.service';
+
+@Injectable()
+export class AuthExpiredInterceptor implements HttpInterceptor {
+  constructor(
+    private loginService: LoginService,
+    private loginModalService: LoginModalService,
+    private stateStorageService: StateStorageService,
+    private router: Router
+  ) {}
+
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    return next.handle(request).pipe(
+      tap(null, (err: HttpErrorResponse) => {
+        if (err.status === 401 && err.url && !err.url.includes('api/account')) {
+          this.stateStorageService.storeUrl(this.router.routerState.snapshot.url);
+          this.loginService.logout();
+          this.router.navigate(['']);
+          this.loginModalService.open();
+        }
+      })
+    );
+  }
+}
diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3dd7aff09d4cda5d9eea38375a99056c676d0249
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts
@@ -0,0 +1,27 @@
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { LocalStorageService, SessionStorageService } from 'ngx-webstorage';
+import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+@Injectable()
+export class AuthInterceptor implements HttpInterceptor {
+  constructor(private localStorage: LocalStorageService, private sessionStorage: SessionStorageService) {}
+
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    if (!request || !request.url || (request.url.startsWith('http') && !(SERVER_API_URL && request.url.startsWith(SERVER_API_URL)))) {
+      return next.handle(request);
+    }
+
+    const token = this.localStorage.retrieve('authenticationToken') || this.sessionStorage.retrieve('authenticationToken');
+    if (token) {
+      request = request.clone({
+        setHeaders: {
+          Authorization: 'Bearer ' + token
+        }
+      });
+    }
+    return next.handle(request);
+  }
+}
diff --git a/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d8b147d89f2b4e322eb718a55701eb65d64c7b5a
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts
@@ -0,0 +1,20 @@
+import { Injectable } from '@angular/core';
+import { JhiEventManager, JhiEventWithContent } from 'ng-jhipster';
+import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { tap } from 'rxjs/operators';
+
+@Injectable()
+export class ErrorHandlerInterceptor implements HttpInterceptor {
+  constructor(private eventManager: JhiEventManager) {}
+
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    return next.handle(request).pipe(
+      tap(null, (err: HttpErrorResponse) => {
+        if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('api/account'))))) {
+          this.eventManager.broadcast(new JhiEventWithContent('borestopApp.httpError', err));
+        }
+      })
+    );
+  }
+}
diff --git a/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5eb735bd772ef9716cb0128a33fa47b748d015cf
--- /dev/null
+++ b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts
@@ -0,0 +1,33 @@
+import { JhiAlertService } from 'ng-jhipster';
+import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { tap } from 'rxjs/operators';
+
+@Injectable()
+export class NotificationInterceptor implements HttpInterceptor {
+  constructor(private alertService: JhiAlertService) {}
+
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    return next.handle(request).pipe(
+      tap((event: HttpEvent<any>) => {
+        if (event instanceof HttpResponse) {
+          let alert: string | null = null;
+          let alertParams: string | null = null;
+
+          event.headers.keys().forEach(entry => {
+            if (entry.toLowerCase().endsWith('app-alert')) {
+              alert = event.headers.get(entry);
+            } else if (entry.toLowerCase().endsWith('app-params')) {
+              alertParams = decodeURIComponent(event.headers.get(entry)!.replace(/\+/g, ' '));
+            }
+          });
+
+          if (alert) {
+            this.alertService.success(alert, { param: alertParams });
+          }
+        }
+      })
+    );
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/auth/account.service.ts b/borestop/src/main/webapp/app/core/auth/account.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8af48d39c1334c5ae8194c35644f0ee4c2d70c98
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/auth/account.service.ts
@@ -0,0 +1,97 @@
+import { Injectable } from '@angular/core';
+import { Router } from '@angular/router';
+import { HttpClient } from '@angular/common/http';
+import { JhiLanguageService } from 'ng-jhipster';
+import { SessionStorageService } from 'ngx-webstorage';
+import { Observable, ReplaySubject, of } from 'rxjs';
+import { shareReplay, tap, catchError } from 'rxjs/operators';
+import { StateStorageService } from 'app/core/auth/state-storage.service';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { Account } from 'app/core/user/account.model';
+
+@Injectable({ providedIn: 'root' })
+export class AccountService {
+  private userIdentity: Account | null = null;
+  private authenticationState = new ReplaySubject<Account | null>(1);
+  private accountCache$?: Observable<Account | null>;
+
+  constructor(
+    private languageService: JhiLanguageService,
+    private sessionStorage: SessionStorageService,
+    private http: HttpClient,
+    private stateStorageService: StateStorageService,
+    private router: Router
+  ) {}
+
+  save(account: Account): Observable<{}> {
+    return this.http.post(SERVER_API_URL + 'api/account', account);
+  }
+
+  authenticate(identity: Account | null): void {
+    this.userIdentity = identity;
+    this.authenticationState.next(this.userIdentity);
+  }
+
+  hasAnyAuthority(authorities: string[] | string): boolean {
+    if (!this.userIdentity || !this.userIdentity.authorities) {
+      return false;
+    }
+    if (!Array.isArray(authorities)) {
+      authorities = [authorities];
+    }
+    return this.userIdentity.authorities.some((authority: string) => authorities.includes(authority));
+  }
+
+  identity(force?: boolean): Observable<Account | null> {
+    if (!this.accountCache$ || force || !this.isAuthenticated()) {
+      this.accountCache$ = this.fetch().pipe(
+        catchError(() => {
+          return of(null);
+        }),
+        tap((account: Account | null) => {
+          this.authenticate(account);
+
+          // After retrieve the account info, the language will be changed to
+          // the user's preferred language configured in the account setting
+          if (account && account.langKey) {
+            const langKey = this.sessionStorage.retrieve('locale') || account.langKey;
+            this.languageService.changeLanguage(langKey);
+          }
+
+          if (account) {
+            this.navigateToStoredUrl();
+          }
+        }),
+        shareReplay()
+      );
+    }
+    return this.accountCache$;
+  }
+
+  isAuthenticated(): boolean {
+    return this.userIdentity !== null;
+  }
+
+  getAuthenticationState(): Observable<Account | null> {
+    return this.authenticationState.asObservable();
+  }
+
+  getImageUrl(): string {
+    return this.userIdentity ? this.userIdentity.imageUrl : '';
+  }
+
+  private fetch(): Observable<Account> {
+    return this.http.get<Account>(SERVER_API_URL + 'api/account');
+  }
+
+  private navigateToStoredUrl(): void {
+    // previousState can be set in the authExpiredInterceptor and in the userRouteAccessService
+    // if login is successful, go to stored previousState and clear previousState
+    const previousUrl = this.stateStorageService.getUrl();
+    if (previousUrl) {
+      this.stateStorageService.clearUrl();
+      this.router.navigateByUrl(previousUrl);
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5fb3e6f8e0cd68227f1c3deff604f6580d5b57c9
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts
@@ -0,0 +1,44 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { LocalStorageService, SessionStorageService } from 'ngx-webstorage';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { Login } from 'app/core/login/login.model';
+
+type JwtToken = {
+  id_token: string;
+};
+
+@Injectable({ providedIn: 'root' })
+export class AuthServerProvider {
+  constructor(private http: HttpClient, private $localStorage: LocalStorageService, private $sessionStorage: SessionStorageService) {}
+
+  getToken(): string {
+    return this.$localStorage.retrieve('authenticationToken') || this.$sessionStorage.retrieve('authenticationToken') || '';
+  }
+
+  login(credentials: Login): Observable<void> {
+    return this.http
+      .post<JwtToken>(SERVER_API_URL + 'api/authenticate', credentials)
+      .pipe(map(response => this.authenticateSuccess(response, credentials.rememberMe)));
+  }
+
+  logout(): Observable<void> {
+    return new Observable(observer => {
+      this.$localStorage.clear('authenticationToken');
+      this.$sessionStorage.clear('authenticationToken');
+      observer.complete();
+    });
+  }
+
+  private authenticateSuccess(response: JwtToken, rememberMe: boolean): void {
+    const jwt = response.id_token;
+    if (rememberMe) {
+      this.$localStorage.store('authenticationToken', jwt);
+    } else {
+      this.$sessionStorage.store('authenticationToken', jwt);
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/auth/csrf.service.ts b/borestop/src/main/webapp/app/core/auth/csrf.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0a491627abfa6cb9a7b86bb9bf2c7291fc15e3d3
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/auth/csrf.service.ts
@@ -0,0 +1,11 @@
+import { Injectable } from '@angular/core';
+import { CookieService } from 'ngx-cookie-service';
+
+@Injectable({ providedIn: 'root' })
+export class CSRFService {
+  constructor(private cookieService: CookieService) {}
+
+  getCSRF(name = 'XSRF-TOKEN'): string {
+    return this.cookieService.get(name);
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/auth/state-storage.service.ts b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5d8861de804251a07e85e8fdd6d192cdda3ac2b6
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts
@@ -0,0 +1,21 @@
+import { Injectable } from '@angular/core';
+import { SessionStorageService } from 'ngx-webstorage';
+
+@Injectable({ providedIn: 'root' })
+export class StateStorageService {
+  private previousUrlKey = 'previousUrl';
+
+  constructor(private $sessionStorage: SessionStorageService) {}
+
+  storeUrl(url: string): void {
+    this.$sessionStorage.store(this.previousUrlKey, url);
+  }
+
+  getUrl(): string | null | undefined {
+    return this.$sessionStorage.retrieve(this.previousUrlKey);
+  }
+
+  clearUrl(): void {
+    this.$sessionStorage.clear(this.previousUrlKey);
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..30d7b7ebf1ddadfc48a3bbcc675b5246e0e29211
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts
@@ -0,0 +1,53 @@
+import { Injectable, isDevMode } from '@angular/core';
+import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+
+import { AccountService } from 'app/core/auth/account.service';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { StateStorageService } from './state-storage.service';
+
+@Injectable({ providedIn: 'root' })
+export class UserRouteAccessService implements CanActivate {
+  constructor(
+    private router: Router,
+    private loginModalService: LoginModalService,
+    private accountService: AccountService,
+    private stateStorageService: StateStorageService
+  ) {}
+
+  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
+    const authorities = route.data['authorities'];
+    // We need to call the checkLogin / and so the accountService.identity() function, to ensure,
+    // that the client has a principal too, if they already logged in by the server.
+    // This could happen on a page refresh.
+    return this.checkLogin(authorities, state.url);
+  }
+
+  checkLogin(authorities: string[], url: string): Observable<boolean> {
+    return this.accountService.identity().pipe(
+      map(account => {
+        if (!authorities || authorities.length === 0) {
+          return true;
+        }
+
+        if (account) {
+          const hasAnyAuthority = this.accountService.hasAnyAuthority(authorities);
+          if (hasAnyAuthority) {
+            return true;
+          }
+          if (isDevMode()) {
+            console.error('User has not any of required authorities: ', authorities);
+          }
+          this.router.navigate(['accessdenied']);
+          return false;
+        }
+
+        this.stateStorageService.storeUrl(url);
+        this.router.navigate(['']);
+        this.loginModalService.open();
+        return false;
+      })
+    );
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/core.module.ts b/borestop/src/main/webapp/app/core/core.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3798d2a88cb1b840d1d0e541e207be803372f8f3
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/core.module.ts
@@ -0,0 +1,85 @@
+import { NgModule, LOCALE_ID } from '@angular/core';
+import { DatePipe, registerLocaleData } from '@angular/common';
+import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
+import { Title } from '@angular/platform-browser';
+import { FaIconLibrary } from '@fortawesome/angular-fontawesome';
+import { CookieService } from 'ngx-cookie-service';
+import { TranslateModule, TranslateLoader, MissingTranslationHandler } from '@ngx-translate/core';
+import { NgxWebstorageModule } from 'ngx-webstorage';
+import { NgJhipsterModule, translatePartialLoader, missingTranslationHandler, JhiConfigService, JhiLanguageService } from 'ng-jhipster';
+import locale from '@angular/common/locales/en';
+
+import * as moment from 'moment';
+import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap';
+import { NgbDateMomentAdapter } from 'app/shared/util/datepicker-adapter';
+
+import { AuthInterceptor } from 'app/blocks/interceptor/auth.interceptor';
+import { AuthExpiredInterceptor } from 'app/blocks/interceptor/auth-expired.interceptor';
+import { ErrorHandlerInterceptor } from 'app/blocks/interceptor/errorhandler.interceptor';
+import { NotificationInterceptor } from 'app/blocks/interceptor/notification.interceptor';
+
+import { fontAwesomeIcons } from './icons/font-awesome-icons';
+
+@NgModule({
+  imports: [
+    HttpClientModule,
+    NgxWebstorageModule.forRoot({ prefix: 'jhi', separator: '-' }),
+    NgJhipsterModule.forRoot({
+      // set below to true to make alerts look like toast
+      alertAsToast: false,
+      alertTimeout: 5000,
+      i18nEnabled: true,
+      defaultI18nLang: 'en'
+    }),
+    TranslateModule.forRoot({
+      loader: {
+        provide: TranslateLoader,
+        useFactory: translatePartialLoader,
+        deps: [HttpClient]
+      },
+      missingTranslationHandler: {
+        provide: MissingTranslationHandler,
+        useFactory: missingTranslationHandler,
+        deps: [JhiConfigService]
+      }
+    })
+  ],
+  providers: [
+    Title,
+    CookieService,
+    {
+      provide: LOCALE_ID,
+      useValue: 'en'
+    },
+    { provide: NgbDateAdapter, useClass: NgbDateMomentAdapter },
+    DatePipe,
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: AuthInterceptor,
+      multi: true
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: AuthExpiredInterceptor,
+      multi: true
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: ErrorHandlerInterceptor,
+      multi: true
+    },
+    {
+      provide: HTTP_INTERCEPTORS,
+      useClass: NotificationInterceptor,
+      multi: true
+    }
+  ]
+})
+export class BorestopCoreModule {
+  constructor(iconLibrary: FaIconLibrary, dpConfig: NgbDatepickerConfig, languageService: JhiLanguageService) {
+    registerLocaleData(locale);
+    iconLibrary.addIcons(...fontAwesomeIcons);
+    dpConfig.minDate = { year: moment().year() - 100, month: 1, day: 1 };
+    languageService.init();
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts
new file mode 100644
index 0000000000000000000000000000000000000000..96d0b13ef8fd5dd6a51b61831529974a0e0e0b46
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts
@@ -0,0 +1,75 @@
+import {
+  faUser,
+  faSort,
+  faSortUp,
+  faSortDown,
+  faSync,
+  faEye,
+  faBan,
+  faTimes,
+  faArrowLeft,
+  faSave,
+  faPlus,
+  faPencilAlt,
+  faBars,
+  faThList,
+  faUserPlus,
+  faRoad,
+  faTachometerAlt,
+  faHeart,
+  faList,
+  faBell,
+  faBook,
+  faHdd,
+  faFlag,
+  faWrench,
+  faLock,
+  faCloud,
+  faSignOutAlt,
+  faSignInAlt,
+  faCalendarAlt,
+  faSearch,
+  faTrashAlt,
+  faAsterisk,
+  faTasks,
+  // jhipster-needle-add-icon-import
+  faHome
+} from '@fortawesome/free-solid-svg-icons';
+
+export const fontAwesomeIcons = [
+  faUser,
+  faSort,
+  faSortUp,
+  faSortDown,
+  faSync,
+  faEye,
+  faBan,
+  faTimes,
+  faArrowLeft,
+  faSave,
+  faPlus,
+  faPencilAlt,
+  faBars,
+  faHome,
+  faThList,
+  faUserPlus,
+  faRoad,
+  faTachometerAlt,
+  faHeart,
+  faList,
+  faBell,
+  faTasks,
+  faBook,
+  faHdd,
+  faFlag,
+  faWrench,
+  faLock,
+  faCloud,
+  faSignOutAlt,
+  faSignInAlt,
+  faCalendarAlt,
+  faSearch,
+  faTrashAlt,
+  // jhipster-needle-add-icon-import
+  faAsterisk
+];
diff --git a/borestop/src/main/webapp/app/core/language/language.constants.ts b/borestop/src/main/webapp/app/core/language/language.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fb355fbdfcb99fd267a28669fe27c0965b1240f7
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/language/language.constants.ts
@@ -0,0 +1,8 @@
+/*
+    Languages codes are ISO_639-1 codes, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+    They are written in English to avoid character encoding issues (not a perfect solution)
+*/
+export const LANGUAGES: string[] = [
+  'en'
+  // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array
+];
diff --git a/borestop/src/main/webapp/app/core/login/login-modal.service.ts b/borestop/src/main/webapp/app/core/login/login-modal.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..73af6ae492d4450070380aac758dce07b0f9bb70
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/login/login-modal.service.ts
@@ -0,0 +1,20 @@
+import { Injectable } from '@angular/core';
+import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
+
+import { LoginModalComponent } from 'app/shared/login/login.component';
+
+@Injectable({ providedIn: 'root' })
+export class LoginModalService {
+  private isOpen = false;
+
+  constructor(private modalService: NgbModal) {}
+
+  open(): void {
+    if (this.isOpen) {
+      return;
+    }
+    this.isOpen = true;
+    const modalRef: NgbModalRef = this.modalService.open(LoginModalComponent);
+    modalRef.result.finally(() => (this.isOpen = false));
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/login/login.model.ts b/borestop/src/main/webapp/app/core/login/login.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..422fce9a08b3e65e9ef2c6109dbcfde3b9f6afe5
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/login/login.model.ts
@@ -0,0 +1,3 @@
+export class Login {
+  constructor(public username: string, public password: string, public rememberMe: boolean) {}
+}
diff --git a/borestop/src/main/webapp/app/core/login/login.service.ts b/borestop/src/main/webapp/app/core/login/login.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..600f4f7eec39ecc6fa968bcf181b0f5994cf593d
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/login/login.service.ts
@@ -0,0 +1,21 @@
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { flatMap } from 'rxjs/operators';
+
+import { Account } from 'app/core/user/account.model';
+import { AccountService } from 'app/core/auth/account.service';
+import { AuthServerProvider } from 'app/core/auth/auth-jwt.service';
+import { Login } from './login.model';
+
+@Injectable({ providedIn: 'root' })
+export class LoginService {
+  constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {}
+
+  login(credentials: Login): Observable<Account | null> {
+    return this.authServerProvider.login(credentials).pipe(flatMap(() => this.accountService.identity(true)));
+  }
+
+  logout(): void {
+    this.authServerProvider.logout().subscribe(null, null, () => this.accountService.authenticate(null));
+  }
+}
diff --git a/borestop/src/main/webapp/app/core/user/account.model.ts b/borestop/src/main/webapp/app/core/user/account.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4d2c8333525d9c1f9c8f157032ab9fbbfe615013
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/user/account.model.ts
@@ -0,0 +1,12 @@
+export class Account {
+  constructor(
+    public activated: boolean,
+    public authorities: string[],
+    public email: string,
+    public firstName: string,
+    public langKey: string,
+    public lastName: string,
+    public login: string,
+    public imageUrl: string
+  ) {}
+}
diff --git a/borestop/src/main/webapp/app/core/user/user.model.ts b/borestop/src/main/webapp/app/core/user/user.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..585f7eddab427954f845492a80c4782a55097da3
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/user/user.model.ts
@@ -0,0 +1,33 @@
+export interface IUser {
+  id?: any;
+  login?: string;
+  firstName?: string;
+  lastName?: string;
+  email?: string;
+  activated?: boolean;
+  langKey?: string;
+  authorities?: string[];
+  createdBy?: string;
+  createdDate?: Date;
+  lastModifiedBy?: string;
+  lastModifiedDate?: Date;
+  password?: string;
+}
+
+export class User implements IUser {
+  constructor(
+    public id?: any,
+    public login?: string,
+    public firstName?: string,
+    public lastName?: string,
+    public email?: string,
+    public activated?: boolean,
+    public langKey?: string,
+    public authorities?: string[],
+    public createdBy?: string,
+    public createdDate?: Date,
+    public lastModifiedBy?: string,
+    public lastModifiedDate?: Date,
+    public password?: string
+  ) {}
+}
diff --git a/borestop/src/main/webapp/app/core/user/user.service.ts b/borestop/src/main/webapp/app/core/user/user.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b5987698ef12e98bf9d66fb08463fb2e6c4e9171
--- /dev/null
+++ b/borestop/src/main/webapp/app/core/user/user.service.ts
@@ -0,0 +1,39 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { createRequestOption, Pagination } from 'app/shared/util/request-util';
+import { IUser } from './user.model';
+
+@Injectable({ providedIn: 'root' })
+export class UserService {
+  public resourceUrl = SERVER_API_URL + 'api/users';
+
+  constructor(private http: HttpClient) {}
+
+  create(user: IUser): Observable<IUser> {
+    return this.http.post<IUser>(this.resourceUrl, user);
+  }
+
+  update(user: IUser): Observable<IUser> {
+    return this.http.put<IUser>(this.resourceUrl, user);
+  }
+
+  find(login: string): Observable<IUser> {
+    return this.http.get<IUser>(`${this.resourceUrl}/${login}`);
+  }
+
+  query(req?: Pagination): Observable<HttpResponse<IUser[]>> {
+    const options = createRequestOption(req);
+    return this.http.get<IUser[]>(this.resourceUrl, { params: options, observe: 'response' });
+  }
+
+  delete(login: string): Observable<{}> {
+    return this.http.delete(`${this.resourceUrl}/${login}`);
+  }
+
+  authorities(): Observable<string[]> {
+    return this.http.get<string[]>(SERVER_API_URL + 'api/users/authorities');
+  }
+}
diff --git a/borestop/src/main/webapp/app/entities/entity.module.ts b/borestop/src/main/webapp/app/entities/entity.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..efd5534cf125fe579355d5021dea9a9cbe9bf424
--- /dev/null
+++ b/borestop/src/main/webapp/app/entities/entity.module.ts
@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+@NgModule({
+  imports: [
+    RouterModule.forChild([
+      /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */
+    ])
+  ]
+})
+export class BorestopEntityModule {}
diff --git a/borestop/src/main/webapp/app/home/home.component.html b/borestop/src/main/webapp/app/home/home.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..0f54094b0afe393a6b52aac284a0e2b3b0c0f5e7
--- /dev/null
+++ b/borestop/src/main/webapp/app/home/home.component.html
@@ -0,0 +1,44 @@
+<div class="row">
+    <div class="col-md-3">
+        <span class="hipster img-fluid rounded"></span>
+    </div>
+
+    <div class="col-md-9">
+        <h1 class="display-4" jhiTranslate="home.title">Welcome, Java Hipster!</h1>
+
+        <p class="lead" jhiTranslate="home.subtitle">This is your homepage</p>
+
+        <div [ngSwitch]="isAuthenticated()">
+            <div class="alert alert-success" *ngSwitchCase="true">
+                <span id="home-logged-message" *ngIf="account" jhiTranslate="home.logged.message"
+                    [translateValues]="{ username: account.login }">You are logged in as user "{{ account.login }}".</span>
+            </div>
+
+            <div class="alert alert-warning" *ngSwitchCase="false">
+                <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span>
+                <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span>
+            </div>
+
+            <div class="alert alert-warning" *ngSwitchCase="false">
+                <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span>&nbsp;
+                <a class="alert-link" routerLink="account/register" jhiTranslate="global.messages.info.register.link">Register a new account</a>
+            </div>
+        </div>
+
+        <p jhiTranslate="home.question">
+            If you have any question on JHipster:
+        </p>
+
+        <ul>
+            <li><a href="https://www.jhipster.tech/" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.homepage">JHipster homepage</a></li>
+            <li><a href="http://stackoverflow.com/tags/jhipster/info" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.stackoverflow">JHipster on Stack Overflow</a></li>
+            <li><a href="https://github.com/jhipster/generator-jhipster/issues?state=open" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.bugtracker">JHipster bug tracker</a></li>
+            <li><a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.chat">JHipster public chat room</a></li>
+            <li><a href="https://twitter.com/jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.follow">follow @jhipster on Twitter</a></li>
+        </ul>
+
+        <p>
+            <span jhiTranslate="home.like">If you like JHipster, don't forget to give us a star on</span> <a href="https://github.com/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.github">GitHub</a>!
+        </p>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/home/home.component.ts b/borestop/src/main/webapp/app/home/home.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d6f4469b08b2374b4caaceb4b881a348303bde46
--- /dev/null
+++ b/borestop/src/main/webapp/app/home/home.component.ts
@@ -0,0 +1,36 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { Subscription } from 'rxjs';
+
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+
+@Component({
+  selector: 'jhi-home',
+  templateUrl: './home.component.html',
+  styleUrls: ['home.scss']
+})
+export class HomeComponent implements OnInit, OnDestroy {
+  account: Account | null = null;
+  authSubscription?: Subscription;
+
+  constructor(private accountService: AccountService, private loginModalService: LoginModalService) {}
+
+  ngOnInit(): void {
+    this.authSubscription = this.accountService.getAuthenticationState().subscribe(account => (this.account = account));
+  }
+
+  isAuthenticated(): boolean {
+    return this.accountService.isAuthenticated();
+  }
+
+  login(): void {
+    this.loginModalService.open();
+  }
+
+  ngOnDestroy(): void {
+    if (this.authSubscription) {
+      this.authSubscription.unsubscribe();
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/home/home.module.ts b/borestop/src/main/webapp/app/home/home.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3cf8ccff98f26541b053fe85aed625670e4a4408
--- /dev/null
+++ b/borestop/src/main/webapp/app/home/home.module.ts
@@ -0,0 +1,12 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { BorestopSharedModule } from 'app/shared/shared.module';
+import { HOME_ROUTE } from './home.route';
+import { HomeComponent } from './home.component';
+
+@NgModule({
+  imports: [BorestopSharedModule, RouterModule.forChild([HOME_ROUTE])],
+  declarations: [HomeComponent]
+})
+export class BorestopHomeModule {}
diff --git a/borestop/src/main/webapp/app/home/home.route.ts b/borestop/src/main/webapp/app/home/home.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aefa2b7e0e947c1be14c3247332e1e4b931d9d79
--- /dev/null
+++ b/borestop/src/main/webapp/app/home/home.route.ts
@@ -0,0 +1,12 @@
+import { Route } from '@angular/router';
+
+import { HomeComponent } from './home.component';
+
+export const HOME_ROUTE: Route = {
+  path: '',
+  component: HomeComponent,
+  data: {
+    authorities: [],
+    pageTitle: 'home.title'
+  }
+};
diff --git a/borestop/src/main/webapp/app/home/home.scss b/borestop/src/main/webapp/app/home/home.scss
new file mode 100644
index 0000000000000000000000000000000000000000..066c9aa8f998c1f6b885321ea4cc80b569af536c
--- /dev/null
+++ b/borestop/src/main/webapp/app/home/home.scss
@@ -0,0 +1,23 @@
+/* ==========================================================================
+Main page styles
+========================================================================== */
+
+.hipster {
+  display: inline-block;
+  width: 347px;
+  height: 497px;
+  background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top;
+  background-size: contain;
+}
+
+/* wait autoprefixer update to allow simple generation of high pixel density media query */
+@media only screen and (-webkit-min-device-pixel-ratio: 2),
+  only screen and (-moz-min-device-pixel-ratio: 2),
+  only screen and (-o-min-device-pixel-ratio: 2/1),
+  only screen and (min-resolution: 192dpi),
+  only screen and (min-resolution: 2dppx) {
+  .hipster {
+    background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top;
+    background-size: contain;
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.html b/borestop/src/main/webapp/app/layouts/error/error.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..b51ae9d049ecb34163322b3401d9588b0b75db4c
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/error/error.component.html
@@ -0,0 +1,15 @@
+<div>
+    <div class="row">
+        <div class="col-md-4">
+            <span class="hipster img-fluid rounded"></span>
+        </div>
+
+        <div class="col-md-8">
+            <h1 jhiTranslate="error.title">Error Page!</h1>
+
+            <div *ngIf="errorMessage">
+                <div class="alert alert-danger">{{ errorMessage }}</div>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.ts b/borestop/src/main/webapp/app/layouts/error/error.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb3dfe2af500a8e1672083273d9e006fc9031ac6
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/error/error.component.ts
@@ -0,0 +1,39 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { Subscription } from 'rxjs';
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+  selector: 'jhi-error',
+  templateUrl: './error.component.html'
+})
+export class ErrorComponent implements OnInit, OnDestroy {
+  errorMessage?: string;
+  errorKey?: string;
+  langChangeSubscription?: Subscription;
+
+  constructor(private translateService: TranslateService, private route: ActivatedRoute) {}
+
+  ngOnInit(): void {
+    this.route.data.subscribe(routeData => {
+      if (routeData.errorMessage) {
+        this.errorKey = routeData.errorMessage;
+        this.getErrorMessageTranslation();
+        this.langChangeSubscription = this.translateService.onLangChange.subscribe(() => this.getErrorMessageTranslation());
+      }
+    });
+  }
+
+  ngOnDestroy(): void {
+    if (this.langChangeSubscription) {
+      this.langChangeSubscription.unsubscribe();
+    }
+  }
+
+  private getErrorMessageTranslation(): void {
+    this.errorMessage = '';
+    if (this.errorKey) {
+      this.translateService.get(this.errorKey).subscribe(translatedErrorMessage => (this.errorMessage = translatedErrorMessage));
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/error/error.route.ts b/borestop/src/main/webapp/app/layouts/error/error.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4828cc7dcc6ee31cefa2672fc8d03efc29773991
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/error/error.route.ts
@@ -0,0 +1,36 @@
+import { Routes } from '@angular/router';
+
+import { ErrorComponent } from './error.component';
+
+export const errorRoute: Routes = [
+  {
+    path: 'error',
+    component: ErrorComponent,
+    data: {
+      authorities: [],
+      pageTitle: 'error.title'
+    }
+  },
+  {
+    path: 'accessdenied',
+    component: ErrorComponent,
+    data: {
+      authorities: [],
+      pageTitle: 'error.title',
+      errorMessage: 'error.http.403'
+    }
+  },
+  {
+    path: '404',
+    component: ErrorComponent,
+    data: {
+      authorities: [],
+      pageTitle: 'error.title',
+      errorMessage: 'error.http.404'
+    }
+  },
+  {
+    path: '**',
+    redirectTo: '/404'
+  }
+];
diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.html b/borestop/src/main/webapp/app/layouts/footer/footer.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9312ad063e7128237bbe9738232612f5b35d1cce
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.html
@@ -0,0 +1,3 @@
+<div class="footer">
+    <p jhiTranslate="footer">This is your footer</p>
+</div>
diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.ts b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ac9a85ec9882db87570ce5486d8a9d743abb900e
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts
@@ -0,0 +1,7 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'jhi-footer',
+  templateUrl: './footer.component.html'
+})
+export class FooterComponent {}
diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.html b/borestop/src/main/webapp/app/layouts/main/main.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..d8bcc2219cc79f0d145395f71f2c309d7ae64153
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/main/main.component.html
@@ -0,0 +1,13 @@
+<jhi-page-ribbon></jhi-page-ribbon>
+
+<div>
+    <router-outlet name="navbar"></router-outlet>
+</div>
+
+<div class="container-fluid">
+    <div class="card jh-card">
+        <router-outlet></router-outlet>
+    </div>
+
+    <jhi-footer></jhi-footer>
+</div>
diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.ts b/borestop/src/main/webapp/app/layouts/main/main.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c1b21159f7709762b04e398a610fb7a44fc99d6
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/main/main.component.ts
@@ -0,0 +1,60 @@
+import { Component, OnInit, RendererFactory2, Renderer2 } from '@angular/core';
+import { Title } from '@angular/platform-browser';
+import { Router, ActivatedRouteSnapshot, NavigationEnd, NavigationError } from '@angular/router';
+import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
+
+import { AccountService } from 'app/core/auth/account.service';
+
+@Component({
+  selector: 'jhi-main',
+  templateUrl: './main.component.html'
+})
+export class MainComponent implements OnInit {
+  private renderer: Renderer2;
+
+  constructor(
+    private accountService: AccountService,
+    private titleService: Title,
+    private router: Router,
+    private translateService: TranslateService,
+    rootRenderer: RendererFactory2
+  ) {
+    this.renderer = rootRenderer.createRenderer(document.querySelector('html'), null);
+  }
+
+  ngOnInit(): void {
+    // try to log in automatically
+    this.accountService.identity().subscribe();
+
+    this.router.events.subscribe(event => {
+      if (event instanceof NavigationEnd) {
+        this.updateTitle();
+      }
+      if (event instanceof NavigationError && event.error.status === 404) {
+        this.router.navigate(['/404']);
+      }
+    });
+
+    this.translateService.onLangChange.subscribe((langChangeEvent: LangChangeEvent) => {
+      this.updateTitle();
+
+      this.renderer.setAttribute(document.querySelector('html'), 'lang', langChangeEvent.lang);
+    });
+  }
+
+  private getPageTitle(routeSnapshot: ActivatedRouteSnapshot): string {
+    let title: string = routeSnapshot.data && routeSnapshot.data['pageTitle'] ? routeSnapshot.data['pageTitle'] : '';
+    if (routeSnapshot.firstChild) {
+      title = this.getPageTitle(routeSnapshot.firstChild) || title;
+    }
+    return title;
+  }
+
+  private updateTitle(): void {
+    let pageTitle = this.getPageTitle(this.router.routerState.snapshot.root);
+    if (!pageTitle) {
+      pageTitle = 'global.title';
+    }
+    this.translateService.get(pageTitle).subscribe(title => this.titleService.setTitle(title));
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7e2a2f9de3255ac7808acad57af594e2e418f4d0
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts
@@ -0,0 +1,27 @@
+import { Directive, OnInit, ElementRef, Renderer2, Input } from '@angular/core';
+import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
+
+@Directive({
+  selector: '[jhiActiveMenu]'
+})
+export class ActiveMenuDirective implements OnInit {
+  @Input() jhiActiveMenu?: string;
+
+  constructor(private el: ElementRef, private renderer: Renderer2, private translateService: TranslateService) {}
+
+  ngOnInit(): void {
+    this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
+      this.updateActiveFlag(event.lang);
+    });
+
+    this.updateActiveFlag(this.translateService.currentLang);
+  }
+
+  updateActiveFlag(selectedLanguage: string): void {
+    if (this.jhiActiveMenu === selectedLanguage) {
+      this.renderer.addClass(this.el.nativeElement, 'active');
+    } else {
+      this.renderer.removeClass(this.el.nativeElement, 'active');
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9661ba9a8de3e54c3b9625f0fa805e55c43970c7
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html
@@ -0,0 +1,152 @@
+<nav class="navbar navbar-dark navbar-expand-md bg-dark">
+    <a class="navbar-brand logo" routerLink="/" (click)="collapseNavbar()">
+        <span class="logo-img"></span>
+        <span jhiTranslate="global.title" class="navbar-title">Borestop</span> <span class="navbar-version">{{ version }}</span>
+    </a>
+    <a class="navbar-toggler d-lg-none" href="javascript:void(0);" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation" (click)="toggleNavbar()">
+        <fa-icon icon="bars"></fa-icon>
+    </a>
+    <div class="navbar-collapse collapse" id="navbarResponsive" [ngbCollapse]="isNavbarCollapsed" [ngSwitch]="isAuthenticated()">
+        <ul class="navbar-nav ml-auto">
+            <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+                <a class="nav-link" routerLink="/" (click)="collapseNavbar()">
+                    <span>
+                        <fa-icon icon="home"></fa-icon>
+                        <span jhiTranslate="global.menu.home">Home</span>
+                    </span>
+                </a>
+            </li>
+            <!-- jhipster-needle-add-element-to-menu - JHipster will add new menu items here -->
+            <li *ngSwitchCase="true" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="entity-menu">
+                    <span>
+                        <fa-icon icon="th-list"></fa-icon>
+                        <span jhiTranslate="global.menu.entities.main">
+                            Entities
+                        </span>
+                    </span>
+                </a>
+                <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="entity-menu">
+                    <!-- jhipster-needle-add-entity-to-menu - JHipster will add entities to the menu here -->
+                </ul>
+            </li>
+            <li *jhiHasAnyAuthority="'ROLE_ADMIN'" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="admin-menu">
+                    <span>
+                        <fa-icon icon="user-plus"></fa-icon>
+                        <span jhiTranslate="global.menu.admin.main">Administration</span>
+                    </span>
+                </a>
+                <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="admin-menu">
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/user-management" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="user" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.userManagement">User management</span>
+                        </a>
+                    </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/metrics" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="tachometer-alt" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.metrics">Metrics</span>
+                        </a>
+                    </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/health" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="heart" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.health">Health</span>
+                        </a>
+                    </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/configuration" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="list" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.configuration">Configuration</span>
+                        </a>
+                    </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/audits" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="bell" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.audits">Audits</span>
+                        </a>
+                    </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="admin/logs" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="tasks" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.logs">Logs</span>
+                        </a>
+                    </li>
+                    <li *ngIf="swaggerEnabled">
+                        <a class="dropdown-item" routerLink="admin/docs" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="book" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.apidocs">API</span>
+                        </a>
+                    </li>
+                    <!-- jhipster-needle-add-element-to-admin-menu - JHipster will add entities to the admin menu here -->
+                    <li *ngIf="!inProduction">
+                        <a class="dropdown-item" href='./h2-console' target="_tab" (click)="collapseNavbar()">
+                            <fa-icon icon="hdd" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.admin.database">Database</span>
+                        </a>
+                    </li>
+                </ul>
+            </li>
+            <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" *ngIf="languages && languages.length > 1">
+                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="languagesnavBarDropdown">
+                    <span>
+                        <fa-icon icon="flag"></fa-icon>
+                        <span jhiTranslate="global.menu.language">Language</span>
+                    </span>
+                </a>
+                <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="languagesnavBarDropdown">
+                    <li *ngFor="let language of languages">
+                        <a class="dropdown-item" [jhiActiveMenu]="language" href="javascript:void(0);" (click)="changeLanguage(language);collapseNavbar();">{{ language | findLanguageFromKey }}</a>
+                    </li>
+                </ul>
+            </li>
+            <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="account-menu">
+                    <span *ngIf="!getImageUrl()">
+                        <fa-icon icon="user"></fa-icon>
+                        <span jhiTranslate="global.menu.account.main">
+                            Account
+                        </span>
+                    </span>
+                    <span *ngIf="getImageUrl()">
+                        <img [src]="getImageUrl()" class="profile-image rounded-circle" alt="Avatar">
+                    </span>
+                </a>
+                <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="account-menu">
+                    <li *ngSwitchCase="true">
+                        <a class="dropdown-item" routerLink="account/settings" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="wrench" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.account.settings">Settings</span>
+                        </a>
+                    </li>
+                    <li *ngSwitchCase="true">
+                        <a class="dropdown-item" routerLink="account/password" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="lock" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.account.password">Password</span>
+                        </a>
+                    </li>
+                    <li *ngSwitchCase="true">
+                        <a class="dropdown-item" (click)="logout()" id="logout">
+                            <fa-icon icon="sign-out-alt" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.account.logout">Sign out</span>
+                        </a>
+                    </li>
+                    <li *ngSwitchCase="false">
+                        <a class="dropdown-item" (click)="login()" id="login">
+                            <fa-icon icon="sign-in-alt" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.account.login">Sign in</span>
+                        </a>
+                    </li>
+                    <li *ngSwitchCase="false">
+                        <a class="dropdown-item" routerLink="account/register" routerLinkActive="active" (click)="collapseNavbar()">
+                            <fa-icon icon="user-plus" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.account.register">Register</span>
+                        </a>
+                    </li>
+                </ul>
+            </li>
+        </ul>
+    </div>
+</nav>
diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..52f8bafbb0e3b88f45f2a59a97dca161a4e47455
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts
@@ -0,0 +1,74 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { JhiLanguageService } from 'ng-jhipster';
+import { SessionStorageService } from 'ngx-webstorage';
+
+import { VERSION } from 'app/app.constants';
+import { LANGUAGES } from 'app/core/language/language.constants';
+import { AccountService } from 'app/core/auth/account.service';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { LoginService } from 'app/core/login/login.service';
+import { ProfileService } from 'app/layouts/profiles/profile.service';
+
+@Component({
+  selector: 'jhi-navbar',
+  templateUrl: './navbar.component.html',
+  styleUrls: ['navbar.scss']
+})
+export class NavbarComponent implements OnInit {
+  inProduction?: boolean;
+  isNavbarCollapsed = true;
+  languages = LANGUAGES;
+  swaggerEnabled?: boolean;
+  version: string;
+
+  constructor(
+    private loginService: LoginService,
+    private languageService: JhiLanguageService,
+    private sessionStorage: SessionStorageService,
+    private accountService: AccountService,
+    private loginModalService: LoginModalService,
+    private profileService: ProfileService,
+    private router: Router
+  ) {
+    this.version = VERSION ? (VERSION.toLowerCase().startsWith('v') ? VERSION : 'v' + VERSION) : '';
+  }
+
+  ngOnInit(): void {
+    this.profileService.getProfileInfo().subscribe(profileInfo => {
+      this.inProduction = profileInfo.inProduction;
+      this.swaggerEnabled = profileInfo.swaggerEnabled;
+    });
+  }
+
+  changeLanguage(languageKey: string): void {
+    this.sessionStorage.store('locale', languageKey);
+    this.languageService.changeLanguage(languageKey);
+  }
+
+  collapseNavbar(): void {
+    this.isNavbarCollapsed = true;
+  }
+
+  isAuthenticated(): boolean {
+    return this.accountService.isAuthenticated();
+  }
+
+  login(): void {
+    this.loginModalService.open();
+  }
+
+  logout(): void {
+    this.collapseNavbar();
+    this.loginService.logout();
+    this.router.navigate(['']);
+  }
+
+  toggleNavbar(): void {
+    this.isNavbarCollapsed = !this.isNavbarCollapsed;
+  }
+
+  getImageUrl(): string {
+    return this.isAuthenticated() ? this.accountService.getImageUrl() : '';
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35191434e6efff268937bdb87fa4dc8c8a6f0594
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts
@@ -0,0 +1,9 @@
+import { Route } from '@angular/router';
+
+import { NavbarComponent } from './navbar.component';
+
+export const navbarRoute: Route = {
+  path: '',
+  component: NavbarComponent,
+  outlet: 'navbar'
+};
diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.scss b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1ff209b76d383ae0bf9d0ab9378f5a2188cfc9c6
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss
@@ -0,0 +1,42 @@
+@import '~bootstrap/scss/functions';
+@import '~bootstrap/scss/variables';
+
+/* ==========================================================================
+Navbar
+========================================================================== */
+
+.navbar-version {
+  font-size: 0.65em;
+  color: $navbar-dark-color;
+}
+
+.profile-image {
+  height: 1.75em;
+  width: 1.75em;
+}
+
+.navbar {
+  padding: 0.2rem 1rem;
+
+  ul.navbar-nav {
+    .nav-item {
+      margin-left: 0.5em;
+    }
+  }
+
+  a.nav-link {
+    font-weight: 400;
+  }
+}
+
+/* ==========================================================================
+Logo styles
+========================================================================== */
+.logo-img {
+  height: 45px;
+  width: 45px;
+  display: inline-block;
+  vertical-align: middle;
+  background: url('../../../content/images/logo-jhipster.png') no-repeat center center;
+  background-size: contain;
+}
diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..040a82f3b9c7a59653e5d53dce0fd43ef7818d32
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts
@@ -0,0 +1,23 @@
+import { Component, OnInit } from '@angular/core';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { ProfileService } from './profile.service';
+
+@Component({
+  selector: 'jhi-page-ribbon',
+  template: `
+    <div class="ribbon" *ngIf="ribbonEnv$ | async as ribbonEnv">
+      <a href="" jhiTranslate="global.ribbon.{{ ribbonEnv }}">{{ ribbonEnv }}</a>
+    </div>
+  `,
+  styleUrls: ['page-ribbon.scss']
+})
+export class PageRibbonComponent implements OnInit {
+  ribbonEnv$?: Observable<string | undefined>;
+
+  constructor(private profileService: ProfileService) {}
+
+  ngOnInit(): void {
+    this.ribbonEnv$ = this.profileService.getProfileInfo().pipe(map(profileInfo => profileInfo.ribbonEnv));
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a78f26800b3a8ce19e0205b41470833f0e8ef46a
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss
@@ -0,0 +1,31 @@
+/* ==========================================================================
+Developement Ribbon
+========================================================================== */
+.ribbon {
+  background-color: rgba(170, 0, 0, 0.5);
+  left: -3.5em;
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  -webkit-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+  overflow: hidden;
+  position: absolute;
+  top: 40px;
+  white-space: nowrap;
+  width: 15em;
+  z-index: 9999;
+  pointer-events: none;
+  opacity: 0.75;
+  a {
+    color: #fff;
+    display: block;
+    font-weight: 400;
+    margin: 1px 0;
+    padding: 10px 50px;
+    text-align: center;
+    text-decoration: none;
+    text-shadow: 0 0 5px #444;
+    pointer-events: none;
+  }
+}
diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e7763eeaf3ed2a4fa88b5ada794e1fa66a97a4da
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts
@@ -0,0 +1,15 @@
+export interface InfoResponse {
+  'display-ribbon-on-profiles'?: string;
+  git?: any;
+  build?: any;
+  activeProfiles?: string[];
+}
+
+export class ProfileInfo {
+  constructor(
+    public activeProfiles?: string[],
+    public ribbonEnv?: string,
+    public inProduction?: boolean,
+    public swaggerEnabled?: boolean
+  ) {}
+}
diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f1512d332bb8f650ee75c380dc5f02d1ae3d8261
--- /dev/null
+++ b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts
@@ -0,0 +1,43 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { map, shareReplay } from 'rxjs/operators';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { ProfileInfo, InfoResponse } from './profile-info.model';
+
+@Injectable({ providedIn: 'root' })
+export class ProfileService {
+  private infoUrl = SERVER_API_URL + 'management/info';
+  private profileInfo$!: Observable<ProfileInfo>;
+
+  constructor(private http: HttpClient) {}
+
+  getProfileInfo(): Observable<ProfileInfo> {
+    if (this.profileInfo$) {
+      return this.profileInfo$;
+    }
+
+    this.profileInfo$ = this.http.get<InfoResponse>(this.infoUrl).pipe(
+      map((response: InfoResponse) => {
+        const profileInfo: ProfileInfo = {
+          activeProfiles: response.activeProfiles,
+          inProduction: response.activeProfiles && response.activeProfiles.includes('prod'),
+          swaggerEnabled: response.activeProfiles && response.activeProfiles.includes('swagger')
+        };
+        if (response.activeProfiles && response['display-ribbon-on-profiles']) {
+          const displayRibbonOnProfiles = response['display-ribbon-on-profiles'].split(',');
+          const ribbonProfiles = displayRibbonOnProfiles.filter(
+            profile => response.activeProfiles && response.activeProfiles.includes(profile)
+          );
+          if (ribbonProfiles.length > 0) {
+            profileInfo.ribbonEnv = ribbonProfiles[0];
+          }
+        }
+        return profileInfo;
+      }),
+      shareReplay()
+    );
+    return this.profileInfo$;
+  }
+}
diff --git a/borestop/src/main/webapp/app/polyfills.ts b/borestop/src/main/webapp/app/polyfills.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f8a8d65e60d01ad67ee5cfbc1b8b8326d92c5d43
--- /dev/null
+++ b/borestop/src/main/webapp/app/polyfills.ts
@@ -0,0 +1,3 @@
+import 'zone.js/dist/zone';
+import '@angular/localize/init';
+require('../manifest.webapp');
diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7e2fe87fb8f8347e7072b3b30481564ff0287179
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts
@@ -0,0 +1,123 @@
+import { Component, OnDestroy } from '@angular/core';
+import { HttpErrorResponse } from '@angular/common/http';
+import { TranslateService } from '@ngx-translate/core';
+import { JhiEventManager, JhiAlert, JhiAlertService, JhiEventWithContent } from 'ng-jhipster';
+import { Subscription } from 'rxjs';
+
+import { AlertError } from './alert-error.model';
+
+@Component({
+  selector: 'jhi-alert-error',
+  template: `
+    <div class="alerts" role="alert">
+      <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)">
+        <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)">
+          <pre [innerHTML]="alert.msg"></pre>
+        </ngb-alert>
+      </div>
+    </div>
+  `
+})
+export class AlertErrorComponent implements OnDestroy {
+  alerts: JhiAlert[] = [];
+  errorListener: Subscription;
+  httpErrorListener: Subscription;
+
+  constructor(private alertService: JhiAlertService, private eventManager: JhiEventManager, translateService: TranslateService) {
+    this.errorListener = eventManager.subscribe('borestopApp.error', (response: JhiEventWithContent<AlertError>) => {
+      const errorResponse = response.content;
+      this.addErrorAlert(errorResponse.message, errorResponse.key, errorResponse.params);
+    });
+
+    this.httpErrorListener = eventManager.subscribe('borestopApp.httpError', (response: JhiEventWithContent<HttpErrorResponse>) => {
+      const httpErrorResponse = response.content;
+      switch (httpErrorResponse.status) {
+        // connection refused, server not reachable
+        case 0:
+          this.addErrorAlert('Server not reachable', 'error.server.not.reachable');
+          break;
+
+        case 400: {
+          const arr = httpErrorResponse.headers.keys();
+          let errorHeader = null;
+          let entityKey = null;
+          arr.forEach(entry => {
+            if (entry.toLowerCase().endsWith('app-error')) {
+              errorHeader = httpErrorResponse.headers.get(entry);
+            } else if (entry.toLowerCase().endsWith('app-params')) {
+              entityKey = httpErrorResponse.headers.get(entry);
+            }
+          });
+          if (errorHeader) {
+            const entityName = translateService.instant('global.menu.entities.' + entityKey);
+            this.addErrorAlert(errorHeader, errorHeader, { entityName });
+          } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.fieldErrors) {
+            const fieldErrors = httpErrorResponse.error.fieldErrors;
+            for (const fieldError of fieldErrors) {
+              if (['Min', 'Max', 'DecimalMin', 'DecimalMax'].includes(fieldError.message)) {
+                fieldError.message = 'Size';
+              }
+              // convert 'something[14].other[4].id' to 'something[].other[].id' so translations can be written to it
+              const convertedField = fieldError.field.replace(/\[\d*\]/g, '[]');
+              const fieldName = translateService.instant('borestopApp.' + fieldError.objectName + '.' + convertedField);
+              this.addErrorAlert('Error on field "' + fieldName + '"', 'error.' + fieldError.message, { fieldName });
+            }
+          } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) {
+            this.addErrorAlert(httpErrorResponse.error.message, httpErrorResponse.error.message, httpErrorResponse.error.params);
+          } else {
+            this.addErrorAlert(httpErrorResponse.error);
+          }
+          break;
+        }
+
+        case 404:
+          this.addErrorAlert('Not found', 'error.url.not.found');
+          break;
+
+        default:
+          if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) {
+            this.addErrorAlert(httpErrorResponse.error.message);
+          } else {
+            this.addErrorAlert(httpErrorResponse.error);
+          }
+      }
+    });
+  }
+
+  setClasses(alert: JhiAlert): { [key: string]: boolean } {
+    const classes = { 'jhi-toast': Boolean(alert.toast) };
+    if (alert.position) {
+      return { ...classes, [alert.position]: true };
+    }
+    return classes;
+  }
+
+  ngOnDestroy(): void {
+    if (this.errorListener) {
+      this.eventManager.destroy(this.errorListener);
+    }
+    if (this.httpErrorListener) {
+      this.eventManager.destroy(this.httpErrorListener);
+    }
+  }
+
+  addErrorAlert(message: string, key?: string, data?: any): void {
+    message = key && key !== null ? key : message;
+
+    const newAlert: JhiAlert = {
+      type: 'danger',
+      msg: message,
+      params: data,
+      timeout: 5000,
+      toast: this.alertService.isToast(),
+      scoped: true
+    };
+
+    this.alerts.push(this.alertService.addAlert(newAlert, this.alerts));
+  }
+
+  close(alert: JhiAlert): void {
+    // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved
+    alert.close?.(this.alerts); // NOSONAR
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e76241a2e4b8d49bcd7dc5319968700396f176d6
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts
@@ -0,0 +1,3 @@
+export class AlertError {
+  constructor(public message: string, public key?: string, public params?: any) {}
+}
diff --git a/borestop/src/main/webapp/app/shared/alert/alert.component.ts b/borestop/src/main/webapp/app/shared/alert/alert.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3cc5bbc725f036eddd992726ac646eed257f105d
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/alert/alert.component.ts
@@ -0,0 +1,41 @@
+import { Component, OnDestroy, OnInit } from '@angular/core';
+import { JhiAlertService, JhiAlert } from 'ng-jhipster';
+
+@Component({
+  selector: 'jhi-alert',
+  template: `
+    <div class="alerts" role="alert">
+      <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)">
+        <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)">
+          <pre [innerHTML]="alert.msg"></pre>
+        </ngb-alert>
+      </div>
+    </div>
+  `
+})
+export class AlertComponent implements OnInit, OnDestroy {
+  alerts: JhiAlert[] = [];
+
+  constructor(private alertService: JhiAlertService) {}
+
+  ngOnInit(): void {
+    this.alerts = this.alertService.get();
+  }
+
+  setClasses(alert: JhiAlert): { [key: string]: boolean } {
+    const classes = { 'jhi-toast': Boolean(alert.toast) };
+    if (alert.position) {
+      return { ...classes, [alert.position]: true };
+    }
+    return classes;
+  }
+
+  ngOnDestroy(): void {
+    this.alertService.clear();
+  }
+
+  close(alert: JhiAlert): void {
+    // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved
+    alert.close?.(this.alerts); // NOSONAR
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts
new file mode 100644
index 0000000000000000000000000000000000000000..568c81c44e8aabbb2e5eca081397c8d33aa39315
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts
@@ -0,0 +1,47 @@
+import { Directive, Input, TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core';
+import { Subscription } from 'rxjs';
+
+import { AccountService } from 'app/core/auth/account.service';
+
+/**
+ * @whatItDoes Conditionally includes an HTML element if current user has any
+ * of the authorities passed as the `expression`.
+ *
+ * @howToUse
+ * ```
+ *     <some-element *jhiHasAnyAuthority="'ROLE_ADMIN'">...</some-element>
+ *
+ *     <some-element *jhiHasAnyAuthority="['ROLE_ADMIN', 'ROLE_USER']">...</some-element>
+ * ```
+ */
+@Directive({
+  selector: '[jhiHasAnyAuthority]'
+})
+export class HasAnyAuthorityDirective implements OnDestroy {
+  private authorities: string[] = [];
+  private authenticationSubscription?: Subscription;
+
+  constructor(private accountService: AccountService, private templateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef) {}
+
+  @Input()
+  set jhiHasAnyAuthority(value: string | string[]) {
+    this.authorities = typeof value === 'string' ? [value] : value;
+    this.updateView();
+    // Get notified each time authentication state changes.
+    this.authenticationSubscription = this.accountService.getAuthenticationState().subscribe(() => this.updateView());
+  }
+
+  ngOnDestroy(): void {
+    if (this.authenticationSubscription) {
+      this.authenticationSubscription.unsubscribe();
+    }
+  }
+
+  private updateView(): void {
+    const hasAnyAuthority = this.accountService.hasAnyAuthority(this.authorities);
+    this.viewContainerRef.clear();
+    if (hasAnyAuthority) {
+      this.viewContainerRef.createEmbeddedView(this.templateRef);
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/constants/authority.constants.ts b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9f672ce7a7f077b96397d38d3360f543802cfee6
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts
@@ -0,0 +1,4 @@
+export enum Authority {
+  ADMIN = 'ROLE_ADMIN',
+  USER = 'ROLE_USER'
+}
diff --git a/borestop/src/main/webapp/app/shared/constants/error.constants.ts b/borestop/src/main/webapp/app/shared/constants/error.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..42d91d97dbbd58bd588278085e8aab874d5656d5
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/constants/error.constants.ts
@@ -0,0 +1,3 @@
+export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem';
+export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used';
+export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used';
diff --git a/borestop/src/main/webapp/app/shared/constants/input.constants.ts b/borestop/src/main/webapp/app/shared/constants/input.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1e3978a9b3c5ff453d3ed535174a6d6bbc5668c1
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/constants/input.constants.ts
@@ -0,0 +1,2 @@
+export const DATE_FORMAT = 'YYYY-MM-DD';
+export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm';
diff --git a/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a148d4579ba322f3a95a0af2a5d080c6b246efee
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts
@@ -0,0 +1 @@
+export const ITEMS_PER_PAGE = 20;
diff --git a/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bfefb96dfc958d20dc8379a9b54e5e7a80fc6205
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts
@@ -0,0 +1,13 @@
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({ name: 'findLanguageFromKey' })
+export class FindLanguageFromKeyPipe implements PipeTransform {
+  private languages: { [key: string]: { name: string; rtl?: boolean } } = {
+    en: { name: 'English' }
+    // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object
+  };
+
+  transform(lang: string): string {
+    return this.languages[lang].name;
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/login/login.component.html b/borestop/src/main/webapp/app/shared/login/login.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..dcd23c1327e99ae129768fe2c89b6dd5807ca53a
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/login/login.component.html
@@ -0,0 +1,51 @@
+<div class="modal-header">
+    <h4 class="modal-title" jhiTranslate="login.title">Sign in</h4>
+
+    <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="activeModal.dismiss('closed')">
+        <span aria-hidden="true">x</span>
+    </button>
+</div>
+
+<div class="modal-body">
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <div class="alert alert-danger" *ngIf="authenticationError" jhiTranslate="login.messages.error.authentication">
+                <strong>Failed to sign in!</strong> Please check your credentials and try again.
+            </div>
+        </div>
+
+        <div class="col-md-8">
+            <form class="form" role="form" (ngSubmit)="login()" [formGroup]="loginForm">
+                <div class="form-group">
+                    <label class="username-label" for="username" jhiTranslate="global.form.username.label">Login</label>
+                    <input type="text" class="form-control" name="username" id="username" placeholder="{{ 'global.form.username.placeholder' | translate }}"
+                           formControlName="username" #username>
+                </div>
+
+                <div class="form-group">
+                    <label for="password" jhiTranslate="login.form.password">Password</label>
+                    <input type="password" class="form-control" name="password" id="password" placeholder="{{ 'login.form.password.placeholder' | translate }}"
+                           formControlName="password">
+                </div>
+
+                <div class="form-check">
+                    <label class="form-check-label" for="rememberMe">
+                        <input class="form-check-input" type="checkbox" name="rememberMe" id="rememberMe" formControlName="rememberMe">
+                        <span jhiTranslate="login.form.rememberme">Remember me</span>
+                    </label>
+                </div>
+
+                <button type="submit" class="btn btn-primary" jhiTranslate="login.form.button">Sign in</button>
+            </form>
+
+            <div class="mt-3 alert alert-warning">
+                <a class="alert-link" (click)="requestResetPassword()" jhiTranslate="login.password.forgot">Did you forget your password?</a>
+            </div>
+
+            <div class="alert alert-warning">
+                <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span>
+                <a class="alert-link" (click)="register()" jhiTranslate="global.messages.info.register.link">Register a new account</a>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/borestop/src/main/webapp/app/shared/login/login.component.ts b/borestop/src/main/webapp/app/shared/login/login.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9fffdae9021a449cf10607843d7f63e5c27c8f25
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/login/login.component.ts
@@ -0,0 +1,73 @@
+import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
+import { FormBuilder } from '@angular/forms';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { Router } from '@angular/router';
+
+import { LoginService } from 'app/core/login/login.service';
+
+@Component({
+  selector: 'jhi-login-modal',
+  templateUrl: './login.component.html'
+})
+export class LoginModalComponent implements AfterViewInit {
+  @ViewChild('username', { static: false })
+  username?: ElementRef;
+
+  authenticationError = false;
+
+  loginForm = this.fb.group({
+    username: [''],
+    password: [''],
+    rememberMe: [false]
+  });
+
+  constructor(private loginService: LoginService, private router: Router, public activeModal: NgbActiveModal, private fb: FormBuilder) {}
+
+  ngAfterViewInit(): void {
+    if (this.username) {
+      this.username.nativeElement.focus();
+    }
+  }
+
+  cancel(): void {
+    this.authenticationError = false;
+    this.loginForm.patchValue({
+      username: '',
+      password: ''
+    });
+    this.activeModal.dismiss('cancel');
+  }
+
+  login(): void {
+    this.loginService
+      .login({
+        username: this.loginForm.get('username')!.value,
+        password: this.loginForm.get('password')!.value,
+        rememberMe: this.loginForm.get('rememberMe')!.value
+      })
+      .subscribe(
+        () => {
+          this.authenticationError = false;
+          this.activeModal.close();
+          if (
+            this.router.url === '/account/register' ||
+            this.router.url.startsWith('/account/activate') ||
+            this.router.url.startsWith('/account/reset/')
+          ) {
+            this.router.navigate(['']);
+          }
+        },
+        () => (this.authenticationError = true)
+      );
+  }
+
+  register(): void {
+    this.activeModal.dismiss('to state register');
+    this.router.navigate(['/account/register']);
+  }
+
+  requestResetPassword(): void {
+    this.activeModal.dismiss('to state requestReset');
+    this.router.navigate(['/account/reset', 'request']);
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/shared-libs.module.ts b/borestop/src/main/webapp/app/shared/shared-libs.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8c3e995588911b25b49163daf1f36ad66129aedd
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/shared-libs.module.ts
@@ -0,0 +1,22 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { NgJhipsterModule } from 'ng-jhipster';
+import { InfiniteScrollModule } from 'ngx-infinite-scroll';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { TranslateModule } from '@ngx-translate/core';
+
+@NgModule({
+  exports: [
+    FormsModule,
+    CommonModule,
+    NgbModule,
+    NgJhipsterModule,
+    InfiniteScrollModule,
+    FontAwesomeModule,
+    ReactiveFormsModule,
+    TranslateModule
+  ]
+})
+export class BorestopSharedLibsModule {}
diff --git a/borestop/src/main/webapp/app/shared/shared.module.ts b/borestop/src/main/webapp/app/shared/shared.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d9b9ac2e63eb04194df78ae0e6cdf149fd621694
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/shared.module.ts
@@ -0,0 +1,22 @@
+import { NgModule } from '@angular/core';
+import { BorestopSharedLibsModule } from './shared-libs.module';
+import { FindLanguageFromKeyPipe } from './language/find-language-from-key.pipe';
+import { AlertComponent } from './alert/alert.component';
+import { AlertErrorComponent } from './alert/alert-error.component';
+import { LoginModalComponent } from './login/login.component';
+import { HasAnyAuthorityDirective } from './auth/has-any-authority.directive';
+
+@NgModule({
+  imports: [BorestopSharedLibsModule],
+  declarations: [FindLanguageFromKeyPipe, AlertComponent, AlertErrorComponent, LoginModalComponent, HasAnyAuthorityDirective],
+  entryComponents: [LoginModalComponent],
+  exports: [
+    BorestopSharedLibsModule,
+    FindLanguageFromKeyPipe,
+    AlertComponent,
+    AlertErrorComponent,
+    LoginModalComponent,
+    HasAnyAuthorityDirective
+  ]
+})
+export class BorestopSharedModule {}
diff --git a/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..027f12317ca3356f1c56c9d9136a65ba483d5577
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts
@@ -0,0 +1,23 @@
+/**
+ * Angular bootstrap Date adapter
+ */
+import { Injectable } from '@angular/core';
+import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
+import { Moment } from 'moment';
+import * as moment from 'moment';
+
+@Injectable()
+export class NgbDateMomentAdapter extends NgbDateAdapter<Moment> {
+  fromModel(date: Moment): NgbDateStruct {
+    if (date && moment.isMoment(date) && date.isValid()) {
+      return { year: date.year(), month: date.month() + 1, day: date.date() };
+    }
+    // ! can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved
+    return null!;
+  }
+
+  toModel(date: NgbDateStruct): Moment {
+    // ! after null can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved
+    return date ? moment(date.year + '-' + date.month + '-' + date.day, 'YYYY-MM-DD') : null!;
+  }
+}
diff --git a/borestop/src/main/webapp/app/shared/util/request-util.ts b/borestop/src/main/webapp/app/shared/util/request-util.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f839fd6c78cf8470c612c26caab7d5b78677a397
--- /dev/null
+++ b/borestop/src/main/webapp/app/shared/util/request-util.ts
@@ -0,0 +1,33 @@
+import { HttpParams } from '@angular/common/http';
+
+export interface Pagination {
+  page: number;
+  size: number;
+  sort: string[];
+}
+
+export interface Search {
+  query: string;
+}
+
+export interface SearchWithPagination extends Search, Pagination {}
+
+export const createRequestOption = (req?: any): HttpParams => {
+  let options: HttpParams = new HttpParams();
+
+  if (req) {
+    Object.keys(req).forEach(key => {
+      if (key !== 'sort') {
+        options = options.set(key, req[key]);
+      }
+    });
+
+    if (req.sort) {
+      req.sort.forEach((val: string) => {
+        options = options.append('sort', val);
+      });
+    }
+  }
+
+  return options;
+};
diff --git a/borestop/src/main/webapp/app/vendor.ts b/borestop/src/main/webapp/app/vendor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a89c6da31d30c08ea291cec05839625729c6ec20
--- /dev/null
+++ b/borestop/src/main/webapp/app/vendor.ts
@@ -0,0 +1,2 @@
+/* after changing this file run 'npm run webpack:build' */
+import '../content/scss/vendor.scss';
diff --git a/borestop/src/main/webapp/content/css/loading.css b/borestop/src/main/webapp/content/css/loading.css
new file mode 100644
index 0000000000000000000000000000000000000000..b2c662687ceacce41dcc64708b2059464233dea0
--- /dev/null
+++ b/borestop/src/main/webapp/content/css/loading.css
@@ -0,0 +1,152 @@
+@keyframes lds-pacman-1 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  50% {
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+  }
+  100% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+}
+@-webkit-keyframes lds-pacman-1 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  50% {
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+  }
+  100% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+}
+@keyframes lds-pacman-2 {
+  0% {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+  }
+  50% {
+    -webkit-transform: rotate(225deg);
+    transform: rotate(225deg);
+  }
+  100% {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+  }
+}
+@-webkit-keyframes lds-pacman-2 {
+  0% {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+  }
+  50% {
+    -webkit-transform: rotate(225deg);
+    transform: rotate(225deg);
+  }
+  100% {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+  }
+}
+@keyframes lds-pacman-3 {
+  0% {
+    -webkit-transform: translate(190px, 0);
+    transform: translate(190px, 0);
+    opacity: 0;
+  }
+  20% {
+    opacity: 1;
+  }
+  100% {
+    -webkit-transform: translate(70px, 0);
+    transform: translate(70px, 0);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes lds-pacman-3 {
+  0% {
+    -webkit-transform: translate(190px, 0);
+    transform: translate(190px, 0);
+    opacity: 0;
+  }
+  20% {
+    opacity: 1;
+  }
+  100% {
+    -webkit-transform: translate(70px, 0);
+    transform: translate(70px, 0);
+    opacity: 1;
+  }
+}
+
+.app-loading {
+  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  top: 10em;
+}
+.app-loading p {
+  display: block;
+  font-size: 1.17em;
+  margin-inline-start: 0px;
+  margin-inline-end: 0px;
+  font-weight: normal;
+}
+
+.app-loading .lds-pacman {
+  position: relative;
+  margin: auto;
+  width: 200px !important;
+  height: 200px !important;
+  -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px);
+  transform: translate(-100px, -100px) scale(1) translate(100px, 100px);
+}
+.app-loading .lds-pacman > div:nth-child(2) div {
+  position: absolute;
+  top: 40px;
+  left: 40px;
+  width: 120px;
+  height: 60px;
+  border-radius: 120px 120px 0 0;
+  background: #bbcedd;
+  -webkit-animation: lds-pacman-1 1s linear infinite;
+  animation: lds-pacman-1 1s linear infinite;
+  -webkit-transform-origin: 60px 60px;
+  transform-origin: 60px 60px;
+}
+.app-loading .lds-pacman > div:nth-child(2) div:nth-child(2) {
+  -webkit-animation: lds-pacman-2 1s linear infinite;
+  animation: lds-pacman-2 1s linear infinite;
+}
+.app-loading .lds-pacman > div:nth-child(1) div {
+  position: absolute;
+  top: 97px;
+  left: -8px;
+  width: 24px;
+  height: 10px;
+  background-image: url('../images/logo-jhipster.png');
+  background-size: contain;
+  -webkit-animation: lds-pacman-3 1s linear infinite;
+  animation: lds-pacman-3 1.5s linear infinite;
+}
+.app-loading .lds-pacman > div:nth-child(1) div:nth-child(1) {
+  -webkit-animation-delay: -0.67s;
+  animation-delay: -1s;
+}
+.app-loading .lds-pacman > div:nth-child(1) div:nth-child(2) {
+  -webkit-animation-delay: -0.33s;
+  animation-delay: -0.5s;
+}
+.app-loading .lds-pacman > div:nth-child(1) div:nth-child(3) {
+  -webkit-animation-delay: 0s;
+  animation-delay: 0s;
+}
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg
new file mode 100755
index 0000000000000000000000000000000000000000..d6df83ceb8555ad49f8eb74d4cee9228275d04ef
--- /dev/null
+++ b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg
@@ -0,0 +1 @@
+<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m647.1 432.5s51.7 519.9 75.8 573.3c3 67-55.3 19-55.3 19l-43.1-151.5s-50.5-195.2-51-208.9c-.4-13.7 73.6-231.9 73.6-231.9z" fill="#eac6ad"/><path d="m44.1 768.7s112.3-241.2 106.6-279.7c-5.8-38.5-.7-54.5 12.3-61.6 13.1-7 150.4 13.1 150.4 13.1s37.9 25.4 35.4 36.2 8.2 318.5-10 356.7-26.2 181.6-23.6 178.7l-109.2-30.5s33.6-221.7 23.5-264.1-18.5-68.1-18.5-68.1l-116.9 145.5z" fill="#fff"/><path d="m183.1 678.5c3.6-13.2-34.5-224.7-34.5-224.7s-2.8 92.6-42.5 169.3c-.1.3-51 77.3-50.7 77.4 10.1 2.1 79.2 43.9 79.2 43.9" fill="#f1f1f1"/><path d="m619.9 509.2s1.3-34.4-24.2-56.6-87.8-48.5-178.5-47.1 35.3 101.7 35.3 101.7z" fill="#fff"/><path d="m218.4 509.2s-1.3-34.4 24.2-56.6 87.8-48.6 178.6-47.2-35.3 101.8-35.3 101.8-56.7.7-104.1 1.3c-34.1.3-63.4.7-63.4.7z" fill="#fff"/><path d="m419.2 415.6c110.9 0 200.8 42.8 200.8 95.6s-89.9 95.6-200.8 95.6-200.8-42.8-200.8-95.6 89.9-95.6 200.8-95.6z" fill="#fff"/><path d="m306.7 223.1s-11.4-4.6-20.1.8-11.9 29.1-4.5 39.5 15 22.9 23 23.9 17.2-1.6 17.2-1.6l-3.3-31.7z" fill="#f2c2a0"/><path d="m525.9 223.1s11.5-4.6 20.1.8c8.7 5.4 11.9 29.1 4.5 39.4s-15 22.8-23 23.8-17.2-1.6-17.2-1.6l3.3-31.6z" fill="#f2c2a0"/><path d="m340.6 445.8 63 33h55.1l7.4-55.8 6.1-10.8s136.9 9.4 158.4 8.7c6.6 1.4 35 12.1 28.6 40-6.8 30.1-71.1 316.8-71.1 316.8l19.1 170s25.3 31.6 10.1 38.6c-15.2 7.1-174.8 32-225 30.5-50.1-1.5-205.8 1.7-211-18.9s34.5-130.4 34.5-130.4l77.4-378.7z" fill="#fff"/><path d="m576.3 700.7c0-13.7 84.4-248.2 84.4-248.2s40.7 424.2 56.8 459c.1.3-.1.6-.4.6-10.3-.7-84.9 27.5-84.9 27.5" fill="#f1f1f1"/><path d="m543.3 411.6c12.9.4 25.5 2.8 69.2 5.2 0 0-.9 77.4-13.1 161.2-11.3 78.2-8.7 155.9-8.7 196s43.7 193.2 45.3 207.5-134.1 36-159.3 37.4c-51.1-1.4-65.3-142.8-69.6-256.2-7.4-75.8-13.3-72.4-.8-115.3" fill="#3d4251"/><path d="m535 279.3c4.1 0 7.4 3.3 7.4 7.4s-3.3 7.4-7.4 7.4-7.4-3.3-7.4-7.4 3.3-7.4 7.4-7.4z" fill="#4189c6"/><path d="m471.3 367.1h-110.4v83.2l55.3 25 55.1-25z" fill="#f2c2a0"/><path d="m411 64.6c69.7-1.1 109.2 34.3 125.6 86.6 20.2 64.3-9.4 137.5-33.7 179-9.9 17-18.8 33.6-34.5 44.7-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-45.2-4-55.8-10.3-37.9-22.4-67.7-95.9-78.8-146.5-5-22.8-4-55.3 2.1-75.9 11.9-40.5 34.3-69 71.8-83.7 9.2-3.6 19.7-5.4 30.4-7.4 4.4-.5 9-.9 13.5-1.3z" fill="#f2c2a0"/><path d="m365.2 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.4 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m470.1 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.3-23.2 23.2-23.2z" fill="#fff"/><path d="m479.3 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m406 232.9h25v10.3h-25z" fill="#4189c6"/><path d="m398.7 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.8 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m502.5 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.7 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m367 170.3c-24.7.5-39 8.6-39 16.9 0 8.4 13.1 6 23 2.1 9.8-3.9 22.8-3.6 28.3.4s17.1 5.2 17.6-3.3-21.5-16.3-29.9-16.1z" fill="#a3634d"/><path d="m467.6 170.1c24.7.5 39 8.5 39 16.8s-13.1 6-23 2.1c-9.8-3.9-22.9-3.6-28.3.4s-17.2 5.1-17.7-3.3c-.4-8.4 21.6-16.2 30-16z" fill="#a3634d"/><path d="m346 377.5 74.4 97.3-45.7 12.6-50.8-62.9s.1-18.3 4.1-26.9c4.1-8.7 18-20.1 18-20.1z" fill="#fff"/><path d="m488.9 390.6-76.7 85.7 44.7 11.1 49.7-55.5s-.1-16.1-4-23.7c-4-7.6-13.7-17.6-13.7-17.6z" fill="#fff"/><path d="m529.5 272.5c-7.7 22.3-12.4 57.2-21.1 76.9-7 22.8-26 77.3-41.6 88.4-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-54.7-.7-65.3-6.9-27.2-16-39.1-124.5-54-165.9 0-2.8.1-5.5.7-7.8.4-.1.8-.3 1.2-.4 6.1-2.3 12.3 4.2 15.6 6.6 11.9 8.8 20.5 20 31.2 30-2.2-8.2 4.4-26.4 12.7-19.3 3.8 2.7.5 12.2 1.6 17.2 18.1 12.2 20-9.9 28.7-14.4 5.9-1.1 11.4 3.9 17.2 4.9 9.5 1.7 14-4.9 22.2-5.3 8.2 4.7 8.2 20.1 22.6 17.2 3.6-.7 5.2-.5 6.6-3.3 2.7-5.2-1.7-13.5 1.2-16.8 2.9-3.4 3.3-.5 4.9-.8 6 2.8 11.4 11.2 8.2 20.1 3.4-3.7 6.8-7.4 10.3-11.1 10.4-10.5 19.9-18.8 34.1-25.9.8.1 1.6.3 2.5.4.4.5.7.9 1.1 1.4z" fill="#a3634d"/><path d="m385.9 322.8s8.3 14.5 31.6 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1-6.9 1.2-17.6.8-17.6.8z" fill="#f2c2a0"/><path d="m290.7 214.8s6.1-17 6.6-23.8c.4-6.8 5.2-46.9 19.7-66.9 9.4-14.4 23-17.4 36.5-14.4s29.1 11.2 45.2 9c16-2.1 56.7-22.6 73.5-14.8 16.7 7.8 44.9 21.4 48 47.2s21.3 66.5 21.3 66.5 9.4-65.8 9.4-83.3-45.7-69.1-55-79.2-39.5-36.6-57.5-35.7-42.2 15.5-51.7 16.4-15.8-3.6-26.3-1.6c-10.5 1.9-21.6 1.4-53.4 34.5s-28.5 82.7-26.3 110.4 10 35.7 10 35.7z" fill="#a3634d"/><path d="m377.3 107.3s-7.8-11.7 2.1-33.3c9.9-21.5 10.3-31.6 10.3-31.6s-5.7 14-13.2 31.6.8 33.3.8 33.3z" fill="#b27362"/><path d="m406 110.6s22.2-25.6 36.5-36.9 32-24.2 32-24.2-13.9 3.4-34.9 21.3c-20.8 17.9-33.6 39.8-33.6 39.8z" fill="#b27362"/><path d="m390.9 106.9s-.5-23.8 11.1-50.1 34.9-30.4 34.9-30.4-17.1 7.8-29.1 31.2-16.9 49.3-16.9 49.3z" fill="#b27362"/><path d="m433.2 485.4s-92.3-40.2-96.2-8.1-9.5 56.8 14 58.5c23.6 1.8 82.2-50.4 82.2-50.4z" fill="#3373aa"/><path d="m417.4 479.6c23.4-15.7 69.9-43.4 78.2-20.7 11.2 30.5 22.4 53.3-.1 60.5-15.8 5-54.6-12-76.2-22.5-1.8-15.3-.2-2.3-1.9-17.3z" fill="#4189c6"/><path d="m278.3 431c-23-2.1-30.1-4-81.1-5.7 0 0 3.4 78.5 11.7 153.4 7 63.2 8.7 100.1 19.4 167.5 5.4 58.5-57.7 215.4-57.7 249.6 0 14.4 69.8 23.2 189.2 28.4 33.3 0 52.4-87 60.6-188.1-.5-92.5-.9-180.2-8.2-192.5" fill="#3d4251"/><path d="m55.5 700.5s160.9-149.3 188.8-200.9c51.4-43 48.7 32.4 48.7 32.4l-94.3 126.1s-77 101.6-87.6 110.3c-10.7 8.8-55.6-67.9-55.6-67.9z" fill="#eac6ad"/><path d="m152.4 578.1s-170.1 176.1-117.2 228.4 85.2-9.8 85.2-9.8l97.9-162.5s-13.9-6.8-28.1-20.5c-14.1-13.8-37.8-35.6-37.8-35.6z" fill="#f1f1f1"/><path d="m133.4 585.7-38.5 46.5s11.2 29.8 40.1 54.6 56.7 20.2 56.7 20.2l44.3-72-68-52.8c-10.8-8.4-26.1-6.9-34.6 3.5z" fill="#fff"/><path d="m401.2 818.3c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11-11 5-11 11z" fill="#474b56"/><path d="m397.7 707.1c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11c-6 0-11 4.9-11 11z" fill="#474b56"/><path d="m295.9 378.5c7.5 46.7 15.1 93.2 22.7 139.4 19.2 1.7 38.6 1.7 57.8 0 7.6-46.2 15.2-92.7 22.7-139.4-34.2 5.4-69 5.4-103.2 0z" fill="#fff"/><path d="m383.9 475.1c3.7-22.6 7.4-45.2 11-67.9-31.4 5-63.4 5-94.8 0 3.7 22.7 7.3 45.4 11 67.9 24.2 3 48.6 3 72.8 0z" fill="#ccc"/><path d="m407.7 374.7c0-3.7-27.1-6.7-60.4-6.7s-60.4 3-60.4 6.7v6.8c0 3.7 27.1 6.7 60.4 6.7s60.4-3 60.4-6.7c0-2 0-4.8 0-6.8z" fill="#ccc"/><ellipse cx="347.3" cy="374.7" fill="#e6e6e6" rx="60.4" ry="6.7"/><path d="m398.4 363.5c-.1-3.1-23-5.7-51.2-5.7s-51.1 2.5-51.2 5.7c0 1.7-1.2 8.7-1.2 10.4 0 3.2 23.4 5.8 52.3 5.8s52.3-2.6 52.3-5.8c.2-1.8-.9-8.7-1-10.4z" fill="#ccc"/><path d="m398.4 363.5c.1 3.1-22.8 5.7-51.2 5.7-28.3 0-51.2-2.6-51.2-5.7.1-3.1 23-5.7 51.2-5.7s51.1 2.5 51.2 5.7z" fill="#e6e6e6"/><path d="m389.7 355.1c-.5-2.1-19.5-3.8-42.4-3.8s-41.9 1.7-42.4 3.8c-.3 1.2-4.2 6.5-4.2 7.8 0 2.3 20.8 4.2 46.6 4.2 25.7 0 46.6-1.9 46.6-4.2-.1-1.3-3.9-6.7-4.2-7.8z" fill="#ccc"/><path d="m389.7 355.1c.5 2.2-18.4 4-42.4 4s-42.9-1.8-42.4-4c.5-2.1 19.5-3.8 42.4-3.8s41.8 1.6 42.4 3.8z" fill="#e6e6e6"/><ellipse cx="378.5" cy="354.8" fill="#666" rx="6.8" ry="1"/><path d="m244.5 542.1c-7.2-15.4-6-119.1 12.7-127s46.5-20.6 58.9-20c12.3.6 21.4.1 27.7 6.5 6.3 6.5 22.1 26.9 20 38.9-2.1 11.9-38.2 21.1-46.2 29.6s-12 41.8-17.3 49.2-19.4 40.1-38.1 35.4c-18.7-4.6-10.5 2.8-17.7-12.6z" fill="#f2c2a0"/><g fill="#333"><path d="m217 595c-1.1.7-2 1.3-2.7 1.7-.8.4-1.4.7-2 .9-.6.1-1.1.2-1.5 0-.4-.1-.9-.3-1.4-.7-.4-.3-.7-.7-.8-1.1s-.1-.8-.1-1.3c.1-.4.2-.9.3-1.4.2-.5.3-1 .4-1.6 0 0 0-.2.1-.6s.2-.8.3-1.4.3-1.2.5-1.9.3-1.4.5-2.1.3-1.3.5-1.9.3-1 .4-1.4c.1-.2.2-.4.3-.6.2-.2.3-.3.5-.4s.4-.1.6-.1.4 0 .6.1.4.1.5.2c.2.1.3.2.4.2.1.1.1.1.2.1.3.2.5.5.5.7 0 .3 0 .6-.1.9l-3.8 11.3 8.2-5.4c.1-.1.3-.2.6-.3.2-.1.5-.1.8-.2h.9c.3 0 .6.2.8.4.3.2.4.5.4.8s-.1.7-.4 1c-.2.3-.6.6-1 .9s-.9.6-1.4.9-1 .6-1.5.9c-.7.7-1.2 1-1.6 1.4z"/><path d="m230.4 589.5c-1-.8-1.9-1.7-2.7-2.9s-1.4-2.5-1.8-3.9-.6-2.9-.6-4.5.3-3.1.8-4.6c-1 .3-2 .4-3 .6-1 .1-1.9.2-2.8.1-.9 0-1.8-.2-2.5-.4-.8-.2-1.5-.5-2.1-1-.8-.6-1.4-1.2-2-1.9s-1-1.4-1.4-2.1-.6-1.5-.8-2.3-.3-1.5-.2-2.2c0-.7.1-1.4.3-2s.5-1.2.9-1.7c.5-.7 1.2-1.2 2-1.6s1.8-.5 2.9-.4 2.4.4 3.8 1 3 1.5 4.7 2.8c1.2.9 2.4 1.8 3.4 2.7s2 1.8 2.9 2.7c.6-.2 1.3-.5 1.9-.8s1.3-.5 1.9-.8c.1-.1.3-.1.5-.2s.4-.2.6-.2c.2-.1.4-.1.5-.1h.4c.1.1.1.1.1.3v.4.4.3c0 .2-.1.4-.3.6-.3.4-.8.9-1.4 1.3-.6.5-1.3.9-2.1 1.4 1.1 1.4 2.1 2.7 2.9 4.1.8 1.3 1.5 2.6 2 3.8s.9 2.4 1.1 3.5.3 2.2.3 3.1c0 1-.1 1.8-.4 2.6-.2.8-.6 1.5-1 2-.4.6-1 1.1-1.6 1.4s-1.3.5-2.1.5-1.6-.1-2.4-.4c-.8-.4-1.8-.9-2.7-1.6zm2.9-2.4c.8.6 1.5.9 2.1.9s1.1-.2 1.5-.7.6-1.2.6-2.2-.2-2.1-.6-3.4-1.2-2.8-2.1-4.4c-1-1.6-2.3-3.4-3.9-5.2l-.6.2c-.4.9-.7 1.8-.9 2.8-.1 1-.2 2-.1 2.9.1 1 .2 1.9.5 2.9.3.9.6 1.8.9 2.6.4.8.8 1.5 1.2 2.2.4.6.9 1.1 1.4 1.4zm-16.1-17.6c.6.5 1.3.8 2.1.9.8.2 1.7.3 2.6.2.9 0 1.9-.2 3-.4s2.2-.5 3.3-.9c-1-.9-2-1.8-3.1-2.8-1.1-.9-2.3-1.9-3.6-2.9-.9-.7-1.7-1.2-2.4-1.5s-1.3-.6-1.8-.7-1-.1-1.3.1c-.4.1-.7.3-.9.6s-.4.6-.4 1c-.1.4-.1.8-.1 1.3s.1.9.3 1.4c.1.5.3.9.5 1.4.2.4.5.9.8 1.3s.6.7 1 1z"/><path d="m245.8 545.1c.7 1 1.4 1.8 2.1 2.6s1.3 1.4 1.9 1.8c.5.4 1 .6 1.4.6.5 0 .9-.2 1.2-.7.1-.2.3-.5.3-.8.1-.3.1-.8.2-1.3 0-.5 0-1.1-.1-1.8s-.1-1.5-.3-2.4c.1 0 .2 0 .4.1.2 0 .5.1.8.2.4.1.9.3 1.5.4.2 1 .3 2 .3 2.9s0 1.7-.1 2.5-.3 1.5-.5 2.1-.5 1.1-.8 1.5c-.4.5-.8.8-1.3 1.1s-1 .4-1.6.5c-.6 0-1.2 0-1.8-.2s-1.3-.5-1.9-1c-.2-.2-.5-.4-.8-.7s-.6-.6-1-1-.7-.9-1.1-1.4-.8-1-1.3-1.6c-.6 1.1-1.3 2.1-1.9 3.1s-1.2 2-1.8 3c.5.7.9 1.4 1.4 2 .5.7.9 1.3 1.3 1.9s.7 1.1 1.1 1.6c.3.5.6.9.8 1.3.5 1 .8 1.7.9 2.3s0 1-.2 1.3c-.1.2-.3.3-.5.5-.2.1-.4.2-.6.3s-.4.1-.6 0c-.2 0-.4-.1-.6-.3-.1-.1-.2-.2-.3-.3-.9-1.2-1.8-2.4-2.6-3.5-.8-1.2-1.6-2.3-2.3-3.5-.3.4-.6.8-1 1.1-.3.3-.7.6-1.1.8s-.8.3-1.3.4c-.5 0-1 0-1.5-.2-.2-.1-.3-.1-.4-.2s-.2-.1-.3-.2c-.3-.2-.4-.5-.2-.7.1-.1.3-.2.6-.3s.7-.1 1.2-.1c.2-.4.5-.7.8-1.1s.5-.7.8-1.2l.8-1.1c-.5-.8-1-1.6-1.5-2.3s-.9-1.4-1.4-2.1c-.3-.4-.6-.8-1-1.2-.3-.4-.7-.7-1.1-1-.3-.2-.6-.4-.9-.5s-.6-.2-.8-.2c-.3 0-.5 0-.8.2-.2.1-.5.3-.7.6-.2.2-.3.5-.5.9-.1.4-.3.8-.4 1.3s-.2 1-.2 1.7v2.1c0 .3 0 .5-.1.7 0 .2-.1.3-.2.5 0 .1-.2 0-.4-.1s-.5-.3-.8-.5c-.4-.3-.7-.7-.9-1.1s-.4-.9-.4-1.5c-.1-.5-.1-1.1 0-1.7s.2-1.2.3-1.7c.1-.6.3-1.1.6-1.6.2-.5.5-.9.7-1.3.4-.5.8-1 1.3-1.4s1.1-.6 1.6-.8c.6-.1 1.2-.1 1.9.1s1.4.5 2.1 1.1c.3.3.7.6 1.2 1 .4.4.9 1 1.4 1.5.5.6 1 1.2 1.5 1.9s1 1.4 1.6 2.1c.5-.8 1.1-1.7 1.8-2.7s1.4-2 2-3c-1-1.3-2-2.7-3-4.2s-2-2.9-2.9-4.4c-.3-.5-.5-1-.5-1.5s.1-.9.4-1.3c.1-.2.3-.3.4-.4.2-.1.3-.2.5-.2h.6c.2 0 .4.1.6.3.2.1.4.3.6.5s.4.4.6.7c.3.5.7 1.1 1.1 1.7s.8 1.2 1.2 1.8.8 1.2 1.3 1.9c.4.6.9 1.3 1.3 1.9.3-.5.6-.9.8-1.3s.4-.7.5-.8.1-.2.2-.2c0-.1.1-.1.1-.2.2-.2.3-.4.5-.5.1-.1.3-.2.4-.2s.3 0 .4.1.3.1.4.2c.2.1.3.3.3.4.1.1.1.3.1.4s0 .3-.1.4-.1.3-.2.4c-.1.2-.2.4-.3.5s-.1.2-.1.2v.1s0 0-.1.1c0 0-.1.1-.2.3-.1.1-.2.3-.3.6-.2.3-.3.6-.5.9.4 0 .2.2 0 .5z"/><path d="m262.8 533.2c-.2.6-.4 1.1-.5 1.7-.2.6-.3 1.2-.5 1.7-.2.6-.3 1.1-.5 1.6s-.4.9-.6 1.2c-.3.4-.6.6-.9.7s-.6 0-.9-.2c-.2-.2-.4-.4-.6-.6-.1-.2-.3-.4-.3-.7-.1-.2-.1-.4-.1-.6s0-.4 0-.5l3-9.9-8.5 6.4c-.3.2-.6.3-.8.4-.3.1-.5 0-.8-.2 0 0-.1 0-.1-.1-.1-.1-.2-.2-.3-.3s-.2-.3-.3-.4c-.1-.2-.2-.3-.3-.5s-.1-.4-.1-.6.1-.4.3-.6c.1-.2.3-.3.4-.4.3-.2.6-.4 1-.7s.9-.6 1.4-.9 1-.6 1.5-1c.5-.3 1-.6 1.4-.9s.8-.5 1.1-.6.4-.3.4-.3c.5-.3 1-.6 1.4-.9s.9-.5 1.3-.7.8-.3 1.2-.3.8.1 1.2.5c.5.3.8.7 1.1 1.1.2.4.4.9.4 1.5s0 1.3-.2 2.1c-.1.8-.4 1.8-.8 3z"/></g><path d="m720.3 998.2s36.3 42.5 34.7 62.7c-1.5 20.1-3.5 53.9-19.3 61.4s-71.2 6.8-80.2-15.9 6.4-100.7 6.4-100.7z" fill="#f2c2a0"/><path d="m717.4 906.7-5.7-50.8s-24.4-10.6-55.9-7.4c-31.6 3.2-44.9 22.9-44.9 22.9l17.7 69.3 71-10.7c11.2-1.8 19.1-12 17.8-23.3z" fill="#fff"/></svg>
\ No newline at end of file
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d90ab36d37914257d5f3d0356e7895ccc0596f2
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png
new file mode 100755
index 0000000000000000000000000000000000000000..8e99bfe66d5a0e4831fcdc4031c1a57ba9b9cb1a
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png
new file mode 100755
index 0000000000000000000000000000000000000000..c7ca46022548477085d9c10966c94131e7290df6
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png
new file mode 100755
index 0000000000000000000000000000000000000000..7e0b8436e82d0b3536909e53a0d435669e6b77cd
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg
new file mode 100755
index 0000000000000000000000000000000000000000..e3a0f3db9fac1dcf48fe52bdfe437835e38e0182
--- /dev/null
+++ b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg
@@ -0,0 +1 @@
+<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="99.0069" cy="719.4542" gradientTransform="matrix(1.2124 0 0 1.2347 112.276 -102.0841)" gradientUnits="userSpaceOnUse" r="7.2456"><stop offset=".02238806" stop-color="#3a86ba"/><stop offset="1" stop-color="#3474a0"/></radialGradient><path d="m649 468.5s2.5 263.7 22.8 318c.4 67-55.7 25.6-55.7 25.6l-20.2-32.1s-23.1-68.7-23.1-82.5c.1-13.7 76.2-229 76.2-229z" fill="#b5694e"/><path d="m192.9 474.6s-2.5 263.7-22.8 318c-.4 67 55.7 25.6 55.7 25.6l20.1-32.1s23.1-68.7 23.1-82.5c0-13.7-76.1-229-76.1-229z" fill="#b5694e"/><path d="m188 496.6c5.4-35.3 9.8-48.6 58.8-54.3 18.5-2.2 86.1-7.3 104.9-18s15.8-64.3 15.8-64.3h51.2 51.2s-3 53.6 15.8 64.3 86.4 15.9 104.9 18c48.9 5.7 53.4 19 58.8 54.3 4.3 28.3 4.5 57.1 4.5 57.1h-235.3-235s.1-28.9 4.4-57.1z" fill="#b56441"/><path d="m236.5 778.7c-.3-4.9-7.3-5.1-8-.2-.6 4.5-1.2 9.1-1.8 13.7 3.9 2 7.6 3.8 11 5.4-.3-6.5-.8-12.8-1.2-18.9z" fill="url(#a)"/><path d="m241.7 794.3c0-.5-.1-1-.1-1.5-.1-1.5-.2-3-.3-4.4 0-.5-.1-1-.1-1.5-.1-1-.1-2-.2-3-1.1-16.1-2.1-31.1-2.9-44.5 0-.1 0-.1 0-.2-.1-1-.1-2-.2-3 0-.5-.1-.9-.3-1.3-.1-.4-.3-.7-.5-1-.7-1-1.9-1.5-3.1-1.5-.7 0-1.3.1-1.9.4-.7.4-1.3 1-1.7 1.8-.2.4-.3.8-.4 1.3 0 .3-.1.5-.1.8-.1.9-.2 1.8-.3 2.7-1.7 13.1-3.6 28.1-5.7 44.5-.1.8-.2 1.7-.3 2.5-.1.6-.2 1.2-.2 1.8-.1.6-.2 1.3-.2 1.9 1.3.7 2.6 1.3 3.9 2 .6-4.7 1.2-9.3 1.8-13.7.6-4.9 7.6-4.7 8 .2.4 6.1.9 12.4 1.3 18.9 1.5.7 2.9 1.3 4.2 2 0-.3 0-.5-.1-.8-.4-1.4-.5-2.9-.6-4.4z" fill="#4f4f4f"/><path d="m244.8 733.7v4.8.9h.9.7l-1.6-8.8v1.6z" fill="#4f4f4f"/><path d="m250.1 783.9h-4.6-.8v.8 4.7 1.6 4.7 1.6 3.4c8.2 3.7 13.4 5.8 13.4 5.8l-4-22.7h-2.6-1.4z" fill="#4f4f4f"/><path d="m244.8 740.4v4.7l2.2-2.3-.6-3.4h-.7z" fill="#c3c2c3"/><path d="m244.8 783.1 7.9-8.2-.7-4-7.2 7.5z" fill="#c3c2c3"/><path d="m244.8 776.8 6.9-7.2-.7-4-6.2 6.4z" fill="#c3c2c3"/><path d="m244.8 751.4 3.1-3.2-.7-4-2.4 2.5z" fill="#c3c2c3"/><path d="m244.8 757.8 4.1-4.3-.7-4-3.4 3.5z" fill="#c3c2c3"/><path d="m244.8 764.1 5-5.2-.7-4-4.3 4.5z" fill="#c3c2c3"/><path d="m250.1 783.9 3.5-3.6-.7-4-7.3 7.6z" fill="#c3c2c3"/><path d="m244.8 770.4 6-6.2-.7-4-5.3 5.5z" fill="#c3c2c3"/><path d="m254.3 783.9-.4-2.3-2.2 2.3z" fill="#c3c2c3"/><path d="m245.7 739.4h-.9v1z" fill="#4f4f4f"/><path d="m244.8 746.7 2.4-2.5-.2-1.4-2.2 2.3z" fill="#4f4f4f"/><path d="m244.8 753 3.4-3.5-.3-1.3-3.1 3.2z" fill="#4f4f4f"/><path d="m244.8 759.4 4.3-4.5-.2-1.4-4.1 4.3z" fill="#4f4f4f"/><path d="m244.8 765.7 5.3-5.5-.3-1.3-5 5.2z" fill="#4f4f4f"/><path d="m244.8 772 6.2-6.4-.2-1.4-6 6.2z" fill="#4f4f4f"/><path d="m244.8 778.4 7.2-7.5-.3-1.3-6.9 7.2z" fill="#4f4f4f"/><path d="m244.8 783.9h.8l7.3-7.6-.2-1.4-7.9 8.2z" fill="#4f4f4f"/><path d="m251.7 783.9 2.2-2.3-.3-1.3-3.5 3.6z" fill="#4f4f4f"/><path d="m178.6 561.5h4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-2.2l-2.1-9.8h-3.3-1.6-4.5-1.5-4.2l-8 44.5h.1z" fill="#4f4f4f"/><path d="m202.1 541.7 2.6-2.7-.8-3.9-1.8 1.8z" fill="#c3c2c3"/><path d="m202.5 528.6-.4-1.8v2.2z" fill="#c3c2c3"/><path d="m202.1 535.3 1.5-1.5-.8-3.9-.7.7z" fill="#c3c2c3"/><path d="m202.1 560.7 5.9-6.1-.8-3.9-5.1 5.2z" fill="#c3c2c3"/><path d="m202.1 548 3.7-3.8-.8-3.9-2.9 3z" fill="#c3c2c3"/><path d="m207.4 561.5 1.7-1.8-.8-3.8-5.4 5.6z" fill="#c3c2c3"/><path d="m209.5 561.5-.1-.4-.4.4z" fill="#c3c2c3"/><path d="m202.1 554.3 4.8-4.9-.8-3.9-4 4.1z" fill="#c3c2c3"/><path d="m202.1 530.6.7-.7-.3-1.3-.4.4z" fill="#4f4f4f"/><path d="m202.1 536.9 1.8-1.8-.3-1.3-1.5 1.5z" fill="#4f4f4f"/><path d="m202.1 543.3 2.9-3-.3-1.3-2.6 2.7z" fill="#4f4f4f"/><path d="m202.1 549.6 4-4.1-.3-1.3-3.7 3.8z" fill="#4f4f4f"/><path d="m202.1 555.9 5.1-5.2-.3-1.3-4.8 4.9z" fill="#4f4f4f"/><path d="m202.1 561.5h.8l5.4-5.6-.3-1.3-5.9 6.1z" fill="#4f4f4f"/><path d="m209 561.5.4-.4-.3-1.4-1.7 1.8z" fill="#4f4f4f"/><path d="m198.1 507.6-.9-3.9-12.2 12.8-.1.5h4.2z" fill="#c3c2c3"/><path d="m196.1 498.6-9.8 10.2-1 5.8 11.7-12.2z" fill="#c3c2c3"/><path d="m191.8 478.2-.9 5.2 1.7-1.7z" fill="#c3c2c3"/><path d="m195.1 517 4.1-4.2-.9-3.9-7.7 8.1z" fill="#c3c2c3"/><path d="m195 493.4-7.3 7.6-1 5.8 9.2-9.6z" fill="#c3c2c3"/><path d="m192.8 483-2.3 2.4-1 5.8 4.2-4.3z" fill="#c3c2c3"/><path d="m193.9 488.2-4.8 5-1 5.8 6.7-6.9z" fill="#c3c2c3"/><path d="m200 517-.6-2.9-2.7 2.9z" fill="#c3c2c3"/><path d="m192.6 481.7-1.7 1.7-.4 2 2.3-2.4z" fill="#4f4f4f"/><path d="m193.7 486.9-4.2 4.3-.4 2 4.8-5z" fill="#4f4f4f"/><path d="m194.8 492.1-6.7 6.9-.4 2 7.3-7.6z" fill="#4f4f4f"/><path d="m195.9 497.2-9.2 9.6-.4 2 9.8-10.2z" fill="#4f4f4f"/><path d="m197 502.4-11.7 12.2-.3 1.9 12.2-12.8z" fill="#4f4f4f"/><path d="m190.6 517 7.7-8.1-.2-1.3-9 9.4z" fill="#4f4f4f"/><path d="m196.7 517 2.7-2.9-.2-1.3-4.1 4.2z" fill="#4f4f4f"/><path d="m166.4 650.5h4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-1.6-4.7-.9h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-1.8l-8 44.5h3.9z" fill="#4f4f4f"/><path d="m207.4 561.5h-4.5-.8v.8 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1h.9 4.6 1.5 4.6 1.5 3.7l-9.4-44.5h-.5z" fill="#c3c2c3"/><path d="m228.3 650.5-.2-1-.9 1z" fill="#c3c2c3"/><path d="m202.1 649.7 21.4-22.3-.9-3.8-20.5 21.3z" fill="#c3c2c3"/><path d="m207.4 650.5 17.2-17.9-.9-3.9-20.8 21.8z" fill="#c3c2c3"/><path d="m202.1 630.7 18.1-18.8-.9-3.9-17.2 17.9z" fill="#c3c2c3"/><path d="m202.1 643.3 20.3-21.1-.9-3.8-19.4 20.2z" fill="#c3c2c3"/><path d="m213.5 650.5 12.2-12.7-.9-3.9-15.8 16.6z" fill="#c3c2c3"/><path d="m219.6 650.5 7.2-7.5-.9-3.9-10.8 11.4z" fill="#c3c2c3"/><path d="m225.7 650.5 2.2-2.3-.9-3.9-5.9 6.2z" fill="#c3c2c3"/><path d="m202.1 637 19.2-19.9-.9-3.9-18.3 19z" fill="#c3c2c3"/><path d="m202.1 619.6v4.7l17-17.6-.2-.7h-3.7z" fill="#c3c2c3"/><path d="m209.1 606-7 7.2v4.8l11.6-12z" fill="#c3c2c3"/><path d="m203 606-.9.9v4.7l5.5-5.6z" fill="#c3c2c3"/><path d="m202.1 606v.9l.9-.9z" fill="#4f4f4f"/><path d="m207.6 606-5.5 5.6v1.6l7-7.2z" fill="#4f4f4f"/><path d="m213.7 606-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m202.1 625.9 17.2-17.9-.2-1.3-17 17.6z" fill="#4f4f4f"/><path d="m202.1 632.2 18.3-19-.2-1.3-18.1 18.8z" fill="#4f4f4f"/><path d="m202.1 638.6 19.4-20.2-.2-1.3-19.2 19.9z" fill="#4f4f4f"/><path d="m202.1 644.9 20.5-21.3-.2-1.4-20.3 21.1z" fill="#4f4f4f"/><path d="m202.1 650.5h.8l20.8-21.8-.2-1.3-21.4 22.3z" fill="#4f4f4f"/><path d="m209 650.5 15.8-16.6-.2-1.3-17.2 17.9z" fill="#4f4f4f"/><path d="m215.1 650.5 10.8-11.4-.2-1.3-12.2 12.7z" fill="#4f4f4f"/><path d="m221.1 650.5 5.9-6.2-.2-1.3-7.2 7.5z" fill="#4f4f4f"/><path d="m227.2 650.5.9-1-.2-1.3-2.2 2.3z" fill="#4f4f4f"/><path d="m190.7 561.5-16.9 17.6-1.1 5.9 22.6-23.5z" fill="#c3c2c3"/><path d="m184.6 561.5-9.4 9.9-1.1 5.8 15.1-15.7z" fill="#c3c2c3"/><path d="m176.9 561.5v.1l.1-.1z" fill="#c3c2c3"/><path d="m178.6 561.5-2 2.1-1.1 5.8 7.6-7.9z" fill="#c3c2c3"/><path d="m196.8 561.5-24.4 25.4-1.1 5.8 30.1-31.2z" fill="#c3c2c3"/><path d="m202.1 562.3-31.1 32.4-1 5.8 32.1-33.5z" fill="#c3c2c3"/><path d="m202.1 574.9-29.7 31.1h4.5l25.2-26.3z" fill="#c3c2c3"/><path d="m202.1 600.3-5.4 5.7h4.5l.9-1z" fill="#c3c2c3"/><path d="m202.1 587.6-17.6 18.4h4.6l13-13.6z" fill="#c3c2c3"/><path d="m202.1 573.4v-4.8l-32.5 33.9-.6 3.5h1.8z" fill="#c3c2c3"/><path d="m202.1 594-11.5 12h4.5l7-7.3z" fill="#c3c2c3"/><path d="m202.1 581.3-23.7 24.7h4.6l19.1-20z" fill="#c3c2c3"/><path d="m177 561.5-.1.1-.3 2 2-2.1z" fill="#4f4f4f"/><path d="m183.1 561.5-7.6 7.9-.3 2 9.4-9.9z" fill="#4f4f4f"/><path d="m189.2 561.5-15.1 15.7-.3 1.9 16.9-17.6z" fill="#4f4f4f"/><path d="m195.3 561.5-22.6 23.5-.3 1.9 24.4-25.4z" fill="#4f4f4f"/><path d="m202.1 561.5h-.7l-30.1 31.2-.3 2 31.1-32.4z" fill="#4f4f4f"/><path d="m202.1 567-32.1 33.5-.4 2 32.5-33.9z" fill="#4f4f4f"/><path d="m202.1 573.4-31.3 32.6h1.6l29.7-31.1z" fill="#4f4f4f"/><path d="m202.1 579.7-25.2 26.3h1.5l23.7-24.7z" fill="#4f4f4f"/><path d="m202.1 586-19.1 20h1.5l17.6-18.4z" fill="#4f4f4f"/><path d="m202.1 592.4-13 13.6h1.5l11.5-12z" fill="#4f4f4f"/><path d="m202.1 598.7-7 7.3h1.6l5.4-5.7z" fill="#4f4f4f"/><path d="m201.2 606h.9v-1z" fill="#4f4f4f"/><path d="m159.4 702.1v4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.8 1.5 4.8.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.8 4.8z" fill="#4f4f4f"/><path d="m225.7 650.5h-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.7 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.4l-9.5-44.4h-1.1z" fill="#c3c2c3"/><path d="m237.9 736.2c.1 1 .1 2 .2 3l6.8-7.1v-1.6l-.5-2.7-6.8 7c.1.5.2.9.3 1.4z" fill="#c3c2c3"/><path d="m229.5 739.4c.1-.9.2-1.8.3-2.7l-2.6 2.7z" fill="#c3c2c3"/><path d="m202.1 700.6 5.5-5.7h-4.6l-.9 1z" fill="#c3c2c3"/><path d="m202.1 707 11.6-12.1h-4.6l-7 7.3z" fill="#c3c2c3"/><path d="m207.4 739.4 32.6-33.9-.8-3.9-36.3 37.8z" fill="#c3c2c3"/><path d="m213.5 739.4 27.6-28.7-.8-3.9-31.3 32.6z" fill="#c3c2c3"/><path d="m202.1 719.6 23.7-24.7h-4.5l-19.2 20z" fill="#c3c2c3"/><path d="m225.7 739.4 4.6-4.8c.4-.8 1-1.4 1.7-1.8l11.1-11.6-.7-4-21.3 22.2z" fill="#c3c2c3"/><path d="m202.1 713.3 17.6-18.4h-4.5l-13.1 13.6z" fill="#c3c2c3"/><path d="m202.1 726 29.8-31.1h-4.6l-25.2 26.3z" fill="#c3c2c3"/><path d="m202.1 727.6v4.7l35.7-37.2v-.2h-4.4z" fill="#c3c2c3"/><path d="m202.1 738.6 36.8-38.3-.8-3.9-36 37.5z" fill="#c3c2c3"/><path d="m237.1 733.9 7.1-7.4-.7-4-9.4 9.8c1 .1 2.2.6 3 1.6z" fill="#c3c2c3"/><path d="m243.9 739.4.9-.9v-4.8l-5.4 5.7z" fill="#c3c2c3"/><path d="m219.6 739.4 22.6-23.5-.8-3.9-26.3 27.4z" fill="#c3c2c3"/><g fill="#4f4f4f"><path d="m203 694.9h-.9v1z"/><path d="m202.1 702.2 7-7.3h-1.5l-5.5 5.7z"/><path d="m202.1 708.5 13.1-13.6h-1.5l-11.6 12.1z"/><path d="m202.1 714.9 19.2-20h-1.6l-17.6 18.4z"/><path d="m202.1 721.2 25.2-26.3h-1.5l-23.7 24.7z"/><path d="m202.1 727.6 31.3-32.7h-1.5l-29.8 31.1z"/><path d="m202.1 733.9 36-37.5-.3-1.3-35.7 37.2z"/><path d="m202.1 739.4h.8l36.3-37.8-.3-1.3-36.8 38.3z"/><path d="m209 739.4 31.3-32.6-.3-1.3-32.6 33.9z"/><path d="m215.1 739.4 26.3-27.4-.3-1.3-27.6 28.7z"/><path d="m221.1 739.4 21.4-22.2-.1-.6-.2-.7-22.6 23.5z"/><path d="m234 732.4 9.4-9.8-.2-1.3-11.2 11.5c.6-.3 1.3-.4 2-.4z"/><path d="m229.8 736.7c0-.3.1-.5.1-.8.1-.5.2-.9.4-1.3l-4.6 4.8h1.5z"/><path d="m237.6 734.9 6.8-7-.2-1.3-7.1 7.4c.2.2.4.6.5.9z"/><path d="m239.4 739.4 5.5-5.7v-1.6l-6.8 7.1v.2z"/><path d="m244.8 739.4v-.9l-.9.9z"/></g><path d="m172.5 650.5-13.1 13.6v4.7l17.6-18.3z" fill="#c3c2c3"/><path d="m178.6 650.5-19.2 19.9v4.7l23.7-24.6z" fill="#c3c2c3"/><path d="m190.7 650.5-31.3 32.6v4.7l35.9-37.3z" fill="#c3c2c3"/><path d="m184.6 650.5-25.2 26.2v4.8l29.8-31z" fill="#c3c2c3"/><path d="m196.8 650.5-37.4 38.9v4.7l42-43.6z" fill="#c3c2c3"/><path d="m195.1 694.9 7-7.2v-4.8l-11.5 12z" fill="#c3c2c3"/><path d="m183 694.9 19.1-19.9v-4.7l-23.7 24.6z" fill="#c3c2c3"/><path d="m171 650.5h-4.6l-6.6 6.8-.4 2.2v3z" fill="#c3c2c3"/><path d="m189.1 694.9 13-13.6v-4.7l-17.6 18.3z" fill="#c3c2c3"/><path d="m161 650.5-.8 4.9 4.7-4.9z" fill="#c3c2c3"/><path d="m176.9 694.9 25.2-26.2v-4.8l-29.7 31z" fill="#c3c2c3"/><path d="m164.7 694.9 37.4-38.9v-4.8l-41.9 43.7z" fill="#c3c2c3"/><path d="m170.8 694.9 31.3-32.6v-4.7l-35.8 37.3z" fill="#c3c2c3"/><path d="m201.2 694.9.9-.9v-4.7l-5.4 5.6z" fill="#c3c2c3"/><path d="m164.9 650.5-4.7 4.9-.4 1.9 6.6-6.8z" fill="#4f4f4f"/><path d="m171 650.5-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m177 650.5-17.6 18.3v1.6l19.2-19.9z" fill="#4f4f4f"/><path d="m183.1 650.5-23.7 24.6v1.6l25.2-26.2z" fill="#4f4f4f"/><path d="m189.2 650.5-29.8 31v1.6l31.3-32.6z" fill="#4f4f4f"/><path d="m195.3 650.5-35.9 37.3v1.6l37.4-38.9z" fill="#4f4f4f"/><path d="m202.1 651.2v-.7h-.7l-42 43.6v.8h.8z" fill="#4f4f4f"/><path d="m166.3 694.9 35.8-37.3v-1.6l-37.4 38.9z" fill="#4f4f4f"/><path d="m172.4 694.9 29.7-31v-1.6l-31.3 32.6z" fill="#4f4f4f"/><path d="m178.4 694.9 23.7-24.6v-1.6l-25.2 26.2z" fill="#4f4f4f"/><path d="m184.5 694.9 17.6-18.3v-1.6l-19.1 19.9z" fill="#4f4f4f"/><path d="m190.6 694.9 11.5-12v-1.6l-13 13.6z" fill="#4f4f4f"/><path d="m196.7 694.9 5.4-5.6v-1.6l-7 7.2z" fill="#4f4f4f"/><path d="m202.1 694.9v-.9l-.9.9z" fill="#4f4f4f"/><path d="m239.4 739.4h-1.3c.8 13.4 1.8 28.4 2.9 44.5h3.1.8v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-.9h-.9-4.6z" fill="#c3c2c3"/><path d="m215.2 783.9h4.6 1.5 2.5c2.1-16.4 4-31.4 5.7-44.5h-2.3-1.5-4.6-1.5-4.6-1.5-4.5-1.5-4.6-.8v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6.4c3.1 1.8 6.1 3.6 9.2 5.3h2.4 1.5z" fill="#c3c2c3"/><path d="m242.5 799.8c.8.4 1.5.7 2.3 1v-3.4z" fill="#c3c2c3"/><path d="m221.9 789.6c.4.2.7.4 1.1.6.1-.6.2-1.3.2-1.9z" fill="#c3c2c3"/><path d="m215.2 783.9-1.4 1.4c1 .6 2 1.1 3 1.6l2.9-3z" fill="#c3c2c3"/><path d="m223.7 783.9h-2.5l-3.4 3.6c1 .5 2 1.1 3 1.6l2.6-2.7c.1-.8.2-1.7.3-2.5z" fill="#c3c2c3"/><path d="m211.3 783.9c.5.3 1 .6 1.5.9l.8-.9z" fill="#c3c2c3"/><path d="m241.6 792.9 3.3-3.4v-4.7l-3.6 3.7c0 1.4.2 2.9.3 4.4z" fill="#c3c2c3"/><path d="m240.9 783.9c.1 1 .1 2 .2 3l2.9-3z" fill="#c3c2c3"/><path d="m242 798.7 2.8-3v-4.7l-3.2 3.3c.2 1.5.3 3 .4 4.4z" fill="#c3c2c3"/><path d="m213.7 783.9-.8.9c.3.2.7.4 1 .5l1.4-1.4z" fill="#4f4f4f"/><path d="m219.7 783.9-2.9 3c.3.2.7.4 1 .5l3.4-3.6h-1.5z" fill="#4f4f4f"/><path d="m223.4 786.4-2.6 2.7c.3.2.7.4 1 .5l1.3-1.4c.2-.6.3-1.2.3-1.8z" fill="#4f4f4f"/><path d="m241.1 787c0 .5.1 1 .1 1.5l3.6-3.7v-.8h-.8z" fill="#4f4f4f"/><path d="m241.7 794.3 3.2-3.3v-1.6l-3.3 3.4c0 .5 0 1 .1 1.5z" fill="#4f4f4f"/><path d="m244.8 795.8-2.8 3c0 .3 0 .5.1.8.2.1.3.2.5.2l2.3-2.4v-1.6z" fill="#4f4f4f"/><path d="m196.8 739.4-20.8 21.7c.9.7 1.8 1.3 2.6 2l22.7-23.7z" fill="#c3c2c3"/><path d="m202.1 746.6-19 19.8c.9.6 1.8 1.3 2.7 1.9l16.3-16.9z" fill="#c3c2c3"/><path d="m201.9 778.5c.1 0 .2.1.2.1v-.4z" fill="#c3c2c3"/><path d="m166.4 739.4-7 7.3v.2c.7.7 1.5 1.5 2.3 2.2l9.2-9.6h-4.5z" fill="#c3c2c3"/><path d="m202.1 740.2-22.6 23.5c.9.7 1.8 1.3 2.7 1.9l19.9-20.7z" fill="#c3c2c3"/><path d="m202.1 759.2-11.6 12.1c.9.6 1.9 1.2 2.8 1.8l8.8-9.2z" fill="#c3c2c3"/><path d="m202.1 765.6-7.9 8.2c.9.6 1.9 1.2 2.8 1.8l5-5.3v-4.7z" fill="#c3c2c3"/><path d="m202.1 771.9-4.1 4.3c1 .6 1.9 1.2 2.9 1.8l1.2-1.3z" fill="#c3c2c3"/><path d="m178.6 739.4-12.8 13.3c.8.7 1.6 1.4 2.5 2.1l14.9-15.5h-4.6z" fill="#c3c2c3"/><path d="m184.6 739.4-15.5 16.2c.8.7 1.7 1.4 2.5 2.1l17.6-18.3z" fill="#c3c2c3"/><path d="m160.3 739.4-.9 1v4.7l5.5-5.7z" fill="#c3c2c3"/><path d="m172.5 739.4-10 10.4c.8.7 1.6 1.5 2.4 2.2l12.1-12.6z" fill="#c3c2c3"/><path d="m202.1 752.9-15.3 16c.9.6 1.8 1.2 2.8 1.9l12.6-13.1v-4.8z" fill="#c3c2c3"/><path d="m190.7 739.4-18.2 19c.9.7 1.7 1.4 2.6 2l20.2-21z" fill="#c3c2c3"/><path d="m159.4 739.4v1l.9-1z" fill="#4f4f4f"/><path d="m159.4 745.1v1.6l7-7.3h-1.5z" fill="#4f4f4f"/><path d="m171 739.4-9.2 9.6c.3.3.5.5.8.8l10-10.4z" fill="#4f4f4f"/><path d="m177 739.4-12.1 12.6c.3.2.6.5.8.7l12.8-13.3z" fill="#4f4f4f"/><path d="m183.1 739.4-14.9 15.5c.3.2.6.5.8.7l15.5-16.2z" fill="#4f4f4f"/><path d="m189.2 739.4-17.6 18.3c.3.2.6.5.9.7l18.2-19z" fill="#4f4f4f"/><path d="m195.3 739.4-20.2 21c.3.2.6.5.9.7l20.8-21.7z" fill="#4f4f4f"/><path d="m202.1 739.4h-.8l-22.7 23.7c.3.2.6.4.9.7l22.6-23.5z" fill="#4f4f4f"/><path d="m202.1 745-19.9 20.7c.3.2.6.4.9.6l19-19.8z" fill="#4f4f4f"/><path d="m202.1 751.3-16.3 16.9.9.6 15.3-16v-1.5z" fill="#4f4f4f"/><path d="m202.1 757.6-12.6 13.1.9.6 11.6-12.1v-1.6z" fill="#4f4f4f"/><path d="m202.1 764-8.8 9.2c.3.2.6.4.9.6l7.9-8.2z" fill="#4f4f4f"/><path d="m202.1 770.3-5 5.3c.3.2.6.4 1 .6l4.1-4.3v-1.6z" fill="#4f4f4f"/><path d="m202.1 776.6-1.2 1.3c.3.2.6.4 1 .6l.2-.2z" fill="#4f4f4f"/><path d="m158.7 694.9h.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-3l-6.3 35.4h1z" fill="#c3c2c3"/><path d="m159.4 702.1-9.3 9.7-1 5.8 10.3-10.8z" fill="#c3c2c3"/><path d="m159.4 714.7-12.1 12.6-.7 4.1c.2.3.4.5.5.8l12.3-12.8z" fill="#c3c2c3"/><path d="m159.4 733.7-5.4 5.7h4.5l.9-.9z" fill="#c3c2c3"/><path d="m154.1 694.9-1.2 1.3-1.1 5.9 6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 727.4-9 9.4c.7.9 1.4 1.7 2.1 2.6l6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 695.7-7.9 8.3-1.1 5.8 9-9.3z" fill="#c3c2c3"/><path d="m159.4 708.4-10.7 11.2-1 5.8 11.7-12.3z" fill="#c3c2c3"/><path d="m159.4 721.1-11.7 12.2c.6.9 1.3 1.8 2 2.7l9.7-10.1z" fill="#c3c2c3"/><path d="m153.1 694.9-.2 1.3 1.2-1.3z" fill="#4f4f4f"/><path d="m159.4 695.7v-.8h-.7l-6.9 7.2-.3 1.9z" fill="#4f4f4f"/><path d="m159.4 700.5-9 9.3-.3 2 9.3-9.7z" fill="#4f4f4f"/><path d="m159.4 706.8-10.3 10.8-.4 2 10.7-11.2z" fill="#4f4f4f"/><path d="m159.4 713.1-11.7 12.3-.4 2 12.1-12.7z" fill="#4f4f4f"/><path d="m159.4 719.5-12.3 12.8.6.9 11.7-12.2z" fill="#4f4f4f"/><path d="m159.4 725.8-9.7 10.1c.2.3.5.6.7.9l9-9.4z" fill="#4f4f4f"/><path d="m159.4 733.7v-1.6l-6.9 7.2v.1h1.4z" fill="#4f4f4f"/><path d="m158.5 739.4h.9v-.9z" fill="#4f4f4f"/><path d="m159.4 745.1v-4.7-.9h-.9-4.5-1.4c2.1 2.5 4.4 5 6.9 7.4v-.2-1.6z" fill="#c3c2c3"/><path d="m633.1 741.4c0-.3-.1-.6-.1-.9 0-.2-.1-.3-.1-.4-.3-1.3-.9-2.2-1.7-2.7-.3-.2-.7-.3-1-.4-1.8-.3-3.9.9-4 3.8 0 .4 0 .8-.1 1.2 0 .6-.1 1.1-.1 1.7v.3c-.3 5.5-.6 11.3-.9 17.3 0 .3 0 .6-.1 1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1-.1 1.9-.2 2.9 4.1-2 8.4-4.2 12.7-6.6-1.2-10.8-2.3-20.8-3.3-29.9 0-.9-.1-1.7-.2-2.6z" fill="#4f4f4f"/><path d="m661.8 610.5v.8 4.8 1.6 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9l-5.4-44.5h-3.8z" fill="#4f4f4f"/><path d="m661.8 597.1 2.5-3.1-.5-4.1-2 2.4z" fill="#c3c2c3"/><path d="m661.8 590.7 1.9-2.2-.5-4.1-1.4 1.6z" fill="#c3c2c3"/><path d="m662.3 577.5-.5-4.1v4.7z" fill="#c3c2c3"/><path d="m661.8 603.4 3.2-3.8-.5-4.2-2.7 3.3z" fill="#c3c2c3"/><path d="m661.8 584.4 1.2-1.4-.5-4.1-.7.8z" fill="#c3c2c3"/><path d="m661.8 609.7 3.9-4.6-.5-4.1-3.4 4z" fill="#c3c2c3"/><path d="m666.3 610.5-.5-4-3.3 4z" fill="#c3c2c3"/><path d="m661.8 579.7.7-.8-.2-1.4-.5.6z" fill="#4f4f4f"/><path d="m661.8 586 1.4-1.6-.2-1.4-1.2 1.4z" fill="#4f4f4f"/><path d="m661.8 592.3 2-2.4-.1-1.4-1.9 2.2z" fill="#4f4f4f"/><path d="m661.8 598.7 2.7-3.3-.2-1.4-2.5 3.1z" fill="#4f4f4f"/><path d="m661.8 605 3.4-4-.2-1.4-3.2 3.8z" fill="#4f4f4f"/><path d="m661.8 610.5h.7l3.3-4-.1-1.4-3.9 4.6z" fill="#4f4f4f"/><path d="m672.9 699.5h-1.3-3.9-1.3-3.9-.7v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7.9h.8 3.9 1.3 3.9 1.3.7c2.8-3.4 5.2-7 7.4-10.7l-4.1-33.8h-.2-3.9z" fill="#4f4f4f"/><path d="m661.8 686 11.9-14.4-.5-4.1-11.4 13.8z" fill="#c3c2c3"/><path d="m661.8 673.4 10.6-12.8-.5-4.1-10.1 12.1z" fill="#c3c2c3"/><path d="m671.6 699.5 4.8-5.8-.5-4.1-8.2 9.9z" fill="#c3c2c3"/><path d="m661.8 660.7 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m661.8 698.7 13.2-16-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m676.8 699.5.3-.2-.6-4.2-3.6 4.4z" fill="#c3c2c3"/><path d="m661.8 662.3v4.7l9.9-11.9v-.1h-3.9z" fill="#c3c2c3"/><path d="m661.8 679.7 11.2-13.6-.5-4.1-10.7 13z" fill="#c3c2c3"/><path d="m666.4 699.5 9.3-11.3-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m661.8 692.4 12.6-15.2-.5-4.2-12.1 14.6z" fill="#c3c2c3"/><path d="m662.6 655h-.8v1z" fill="#4f4f4f"/><path d="m661.8 662.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m661.8 668.6 10.1-12.1-.2-1.4-9.9 11.9z" fill="#4f4f4f"/><path d="m661.8 675 10.7-13-.1-1.4-10.6 12.8z" fill="#4f4f4f"/><path d="m661.8 681.3 11.4-13.8-.2-1.4-11.2 13.6z" fill="#4f4f4f"/><path d="m661.8 687.6 12.1-14.6-.2-1.4-11.9 14.4z" fill="#4f4f4f"/><path d="m661.8 694 12.7-15.4-.1-1.4-12.6 15.2z" fill="#4f4f4f"/><path d="m661.8 699.5h.7l12.7-15.4-.2-1.4-13.2 16z" fill="#4f4f4f"/><path d="m667.7 699.5 8.2-9.9-.2-1.4-9.3 11.3z" fill="#4f4f4f"/><path d="m672.9 699.5 3.6-4.4-.1-1.4-4.8 5.8z" fill="#4f4f4f"/><path d="m677.1 699.5v-.2l-.3.2z" fill="#4f4f4f"/><path d="m661.8 749.7 4.7-5.7h-3.9l-.8.9z" fill="#c3c2c3"/><path d="m666.3 752.1c2.6-2.6 5.1-5.3 7.4-8.1h-.7z" fill="#c3c2c3"/><path d="m661.8 756 9.9-12h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m662.6 744h-.8v.9z" fill="#4f4f4f"/><path d="m661.8 751.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m671.7 744-9.9 12v.3c1.5-1.4 3.1-2.8 4.5-4.2l6.7-8.1z" fill="#4f4f4f"/><path d="m645.5 521.6h1.3 3.9 1.3 3.6l-4.7-38.9-9.4 38.9h.1z" fill="#c3c2c3"/><path d="m655.8 523.4-20.8 25.1-1.6 6.7 22.9-27.7z" fill="#c3c2c3"/><path d="m656.4 528.9-23.6 28.6-1.6 6.7 25.7-31.2z" fill="#c3c2c3"/><path d="m650.6 566.1 9-11-.5-4.1-12.4 15.1z" fill="#c3c2c3"/><path d="m634.9 566.1 22.7-27.5-.5-4.2-26.1 31.7z" fill="#c3c2c3"/><path d="m655.8 566.1 4.5-5.4-.5-4.2-7.9 9.6z" fill="#c3c2c3"/><path d="m640.1 566.1 18.2-22-.5-4.2-21.6 26.2z" fill="#c3c2c3"/><path d="m660.9 566.1-.5-4.1-3.3 4.1z" fill="#c3c2c3"/><path d="m645.4 566.1 13.5-16.5-.5-4.1-17 20.6z" fill="#c3c2c3"/><path d="m641.6 521.6-.1.1-1.6 6.7 5.6-6.8z" fill="#c3c2c3"/><path d="m646.8 521.6-7.5 9-1.6 6.7 13-15.7z" fill="#c3c2c3"/><path d="m655.6 521.6h-3.6l-14.8 18-1.7 6.7 20.1-24.3z" fill="#c3c2c3"/><path d="m641.5 521.6v.1l.1-.1z" fill="#4f4f4f"/><path d="m645.5 521.6-5.6 6.8-.6 2.2 7.5-9z" fill="#4f4f4f"/><path d="m650.7 521.6-13 15.7-.5 2.3 14.8-18z" fill="#4f4f4f"/><path d="m655.6 522-20.1 24.3-.5 2.2 20.8-25.1z" fill="#4f4f4f"/><path d="m656.3 527.5-22.9 27.7-.6 2.3 23.6-28.6z" fill="#4f4f4f"/><path d="m657.1 534.4-.2-1.4-25.7 31.2-.4 1.9h.2z" fill="#4f4f4f"/><path d="m636.2 566.1 21.6-26.2-.2-1.3-22.7 27.5z" fill="#4f4f4f"/><path d="m641.4 566.1 17-20.6-.1-1.4-18.2 22z" fill="#4f4f4f"/><path d="m646.7 566.1 12.4-15.1-.2-1.4-13.5 16.5z" fill="#4f4f4f"/><path d="m651.9 566.1 7.9-9.6-.2-1.4-9 11z" fill="#4f4f4f"/><path d="m657.1 566.1 3.3-4.1-.1-1.3-4.5 5.4z" fill="#4f4f4f"/><path d="m614 655h1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1h-.8-3.9-.3l-10.8 44.5h.8z" fill="#4f4f4f"/><path d="m625.1 590.6v1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.7l-.9-7.3h-3.8-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-.2l-5.7 23.5z" fill="#c3c2c3"/><path d="m646.7 655h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m625.1 622.6 9.9-12.1h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m625.1 635.2 20.4-24.7h-3.9l-16.5 20z" fill="#c3c2c3"/><path d="m625.1 641.6 25.6-31.1h-3.9l-21.7 26.3z" fill="#c3c2c3"/><path d="m625.1 628.9 15.1-18.4h-3.9l-11.2 13.7z" fill="#c3c2c3"/><path d="m625.1 616.2 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m625.1 654.2 36.1-43.7h-4l-32.1 39z" fill="#c3c2c3"/><path d="m625.8 655h3.9l32.1-38.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 655h3.9l6-7.2v-4.8z" fill="#c3c2c3"/><path d="m641.4 655h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m625.1 647.9 30.8-37.4h-3.9l-26.9 32.7z" fill="#c3c2c3"/><path d="m631 655h3.9l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m636.2 655h3.9l21.7-26.2v-4.8z" fill="#c3c2c3"/><path d="m657.1 655h3.9l.8-.9v-4.7z" fill="#c3c2c3"/><path d="m625.9 610.5h-.8v1z" fill="#4f4f4f"/><path d="m625.1 617.8 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m625.1 624.2 11.2-13.7h-1.3l-9.9 12.1z" fill="#4f4f4f"/><path d="m625.1 630.5 16.5-20h-1.4l-15.1 18.4z" fill="#4f4f4f"/><path d="m625.1 636.8 21.7-26.3h-1.3l-20.4 24.7z" fill="#4f4f4f"/><path d="m625.1 643.2 26.9-32.7h-1.3l-25.6 31.1z" fill="#4f4f4f"/><path d="m625.1 649.5 32.1-39h-1.3l-30.8 37.4z" fill="#4f4f4f"/><path d="m625.1 655h.7l36-43.7v-.8h-.6l-36.1 43.7z" fill="#4f4f4f"/><path d="m629.7 655h1.3l30.8-37.3v-1.6z" fill="#4f4f4f"/><path d="m634.9 655h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 655h1.3l20.4-24.7v-1.5z" fill="#4f4f4f"/><path d="m645.4 655h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 655h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 655h1.3l4.7-5.6v-1.6z" fill="#4f4f4f"/><path d="m661 655h.8v-.9z" fill="#4f4f4f"/><path d="m624.3 610.5.8-.9v-4.7l-4.7 5.6z" fill="#c3c2c3"/><path d="m625.1 598.5-3 3.7-1.6 6.7 4.6-5.6z" fill="#c3c2c3"/><path d="m625.1 589.6-.3 1.4.3-.4z" fill="#c3c2c3"/><path d="m625.1 592.2-.9 1.1-1.6 6.7 2.5-3.1z" fill="#c3c2c3"/><path d="m625.1 590.6-.3.4-.6 2.3.9-1.1z" fill="#4f4f4f"/><path d="m625.1 596.9-2.5 3.1-.5 2.2 3-3.7z" fill="#4f4f4f"/><path d="m625.1 604.9v-1.6l-4.6 5.6-.4 1.6h.3z" fill="#4f4f4f"/><path d="m625.1 610.5v-.9l-.8.9z" fill="#4f4f4f"/><path d="m588.4 744h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-.9l-10.2 42.4v1.2z" fill="#4f4f4f"/><path d="m661 655h-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-1.3-3.9-.7v.8 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1z" fill="#c3c2c3"/><path d="m657.2 699.5-32.1 38.9v4.7l1-1.2c0-.4 0-.8.1-1.2.1-2.8 2.2-4.1 4-3.8l31-37.5h-4z" fill="#c3c2c3"/><path d="m657.1 744h3.9l.8-.9v-4.8z" fill="#c3c2c3"/><path d="m652 699.5-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m631.1 699.5-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m625.9 699.5-.8 1v4.7l4.7-5.7z" fill="#c3c2c3"/><path d="m646.7 744h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m641.4 744h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 744h3.9l6-7.3v-4.7z" fill="#c3c2c3"/><path d="m641.6 699.5-16.5 20v4.7l20.4-24.7z" fill="#c3c2c3"/><path d="m636.2 744h3.9l21.7-26.3v-4.7z" fill="#c3c2c3"/><path d="m636.3 699.5-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m626 744c0-.1 0-.2 0-.3l-.3.3z" fill="#c3c2c3"/><path d="m646.8 699.5-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m633.1 741.4c.1.8.2 1.7.3 2.6h1.5l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m631.2 737.4c.8.5 1.5 1.4 1.7 2.7l28.9-35v-4.7z" fill="#c3c2c3"/><path d="m625.1 699.5v1l.8-1z" fill="#4f4f4f"/><path d="m629.8 699.5-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m635 699.5-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m640.2 699.5-15.1 18.4v1.6l16.5-20z" fill="#4f4f4f"/><path d="m645.5 699.5-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m650.7 699.5-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m655.9 699.5-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h.7l.3-.3c0-.6.1-1.1.1-1.7l-1 1.2v.8z" fill="#4f4f4f"/><path d="m661.2 699.5-31 37.5c.3.1.7.2 1 .4l30.6-37.1v-.8z" fill="#4f4f4f"/><path d="m632.9 740.1c0 .1.1.3.1.4 0 .3.1.6.1.9l28.7-34.8v-1.6z" fill="#4f4f4f"/><path d="m634.9 744h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 744h1.3l20.4-24.7v-1.6z" fill="#4f4f4f"/><path d="m645.4 744h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 744h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 744h1.3l4.7-5.7v-1.6z" fill="#4f4f4f"/><path d="m661 744h.8v-.9z" fill="#4f4f4f"/><path d="m625.1 662.2-24.7 29.9-1.6 6.7 26.3-31.9z" fill="#c3c2c3"/><path d="m625.1 674.8-20.4 24.7h4l16.4-19.9z" fill="#c3c2c3"/><path d="m620.5 655-15.8 19.2-1.6 6.7 21.3-25.9z" fill="#c3c2c3"/><path d="m625.1 687.5-9.9 12h3.9l6-7.3z" fill="#c3c2c3"/><path d="m625.1 693.8-4.7 5.7h3.9l.8-.9z" fill="#c3c2c3"/><path d="m625.1 655.8-22.5 27.3-1.6 6.7 24.1-29.2z" fill="#c3c2c3"/><path d="m625.1 681.2-15.1 18.3h3.9l11.2-13.6z" fill="#c3c2c3"/><path d="m615.3 655-8.4 10.3-1.6 6.6 13.9-16.9z" fill="#c3c2c3"/><path d="m610.1 655-1.1 1.3-1.6 6.7 6.6-8z" fill="#c3c2c3"/><path d="m625.1 668.5-25.6 31h3.9l21.7-26.3z" fill="#c3c2c3"/><path d="m609.3 655-.3 1.3 1.1-1.3z" fill="#4f4f4f"/><path d="m614 655-6.6 8-.5 2.3 8.4-10.3z" fill="#4f4f4f"/><path d="m619.2 655-13.9 16.9-.6 2.3 15.8-19.2z" fill="#4f4f4f"/><path d="m625.1 655h-.7l-21.3 25.9-.5 2.2 22.5-27.3z" fill="#4f4f4f"/><path d="m625.1 660.6-24.1 29.2-.6 2.3 24.7-29.9z" fill="#4f4f4f"/><path d="m625.1 668.5v-1.6l-26.3 31.9-.2.7h.9z" fill="#4f4f4f"/><path d="m625.1 673.2-21.7 26.3h1.3l20.4-24.7z" fill="#4f4f4f"/><path d="m625.1 679.6-16.4 19.9h1.3l15.1-18.3z" fill="#4f4f4f"/><path d="m625.1 685.9-11.2 13.6h1.3l9.9-12z" fill="#4f4f4f"/><path d="m625.1 692.2-6 7.3h1.3l4.7-5.7z" fill="#4f4f4f"/><path d="m624.3 699.5h.8v-.9z" fill="#4f4f4f"/><path d="m603.4 788.5h-3.9-1.3-3.9-1.3-3.9-.7v.8 4.6l2-.4s5.9-1.6 14.9-5h-.5z" fill="#4f4f4f"/><path d="m625.1 744v.8 4.7 1.6 4.7 1.6 3.8c.3-6 .6-11.8.9-17.3h-.3-.6z" fill="#c3c2c3"/><path d="m661.8 751.3v-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-1.5c1 9.1 2.1 19.1 3.3 29.9 8.6-4.9 17.3-10.7 25.1-17.6v-.3-4.7z" fill="#c3c2c3"/><path d="m604.9 744-16.5 19.9v4.8l20.4-24.7z" fill="#c3c2c3"/><path d="m599.6 744-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m620.5 744-32.1 39v4.7l36-43.7z" fill="#c3c2c3"/><path d="m610.1 744-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m615.3 744-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m599.5 788.5h3.9l21.6-26.2c0-.3 0-.6.1-1v-3.8z" fill="#c3c2c3"/><path d="m625.1 751.1-30.8 37.4h3.9l26.9-32.6z" fill="#c3c2c3"/><path d="m620.4 782.2c1.2-.5 2.4-1.1 3.6-1.7.1-1 .1-1.9.2-2.9z" fill="#c3c2c3"/><path d="m625.1 744.8-36 43.7h3.9l32.1-39z" fill="#c3c2c3"/><path d="m624.6 770.8-12.3 15c1.9-.8 4-1.7 6.1-2.6l6-7.3c0-1.7.1-3.4.2-5.1z" fill="#c3c2c3"/><path d="m625 764-20.2 24.5h.5c1.6-.6 3.2-1.2 5-1.9l14.4-17.5c.1-1.7.2-3.4.3-5.1z" fill="#c3c2c3"/><path d="m594.4 744-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m589.2 744-.8.9v4.8l4.7-5.7z" fill="#c3c2c3"/><path d="m588.4 744v.9l.8-.9z" fill="#4f4f4f"/><path d="m593.1 744-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m598.3 744-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m603.5 744-15.1 18.4v1.5l16.5-19.9z" fill="#4f4f4f"/><path d="m608.8 744-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m614 744-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m619.2 744-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h-.7l-36 43.7v.8h.7l36-43.7z" fill="#4f4f4f"/><path d="m625.1 749.5-32.1 39h1.3l30.8-37.4z" fill="#4f4f4f"/><path d="m625.1 755.9-26.9 32.6h1.3l25.6-31z" fill="#4f4f4f"/><path d="m604.7 788.5 20.3-24.5c0-.6.1-1.1.1-1.7l-21.6 26.2z" fill="#4f4f4f"/><path d="m624.7 769.1-14.4 17.5c.6-.3 1.3-.5 2-.8l12.3-15c0-.6 0-1.2.1-1.7z" fill="#4f4f4f"/><path d="m624.3 775.9-6 7.3c.7-.3 1.4-.6 2.1-.9l3.8-4.6c0-.7.1-1.3.1-1.8z" fill="#4f4f4f"/><path d="m588.4 741.9-.4 1.6.4-.4z" fill="#c3c2c3"/><path d="m588.4 743.1-.4.4-.1.5h.5z" fill="#4f4f4f"/><path d="m578.6 788.5h3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-.9h-.5l-10.7 44.5h.1z" fill="#c3c2c3"/><path d="m583.8 794.9 4.6-1v-4.6z" fill="#c3c2c3"/><path d="m578.6 788.5-2 2.4-1.4 5.8.7-.2 6.6-8z" fill="#c3c2c3"/><path d="m577.2 788.5-.1.2.2-.2z" fill="#c3c2c3"/><path d="m583.8 788.5-6.3 7.7 4.7-1 5.5-6.7z" fill="#c3c2c3"/><path d="m577.3 788.5-.2.2-.5 2.2 2-2.4z" fill="#4f4f4f"/><path d="m582.5 788.5-6.6 8 1.6-.3 6.3-7.7z" fill="#4f4f4f"/><path d="m588.4 788.5h-.7l-5.5 6.7 1.6-.3 4.6-5.6z" fill="#4f4f4f"/><path d="m336.3 426.5c-2.9.8-6.2 1.6-9.8 2.3 25.1 11.3 61.6 18.3 100.8 18.3 36.9 0 71.4-6.2 96.3-16.4-7.9-1.2-15.1-2.6-20.7-4.2s-19.6 12.5-83.1 12.5c-63.4 0-83.5-12.5-83.5-12.5z" fill="none"/><path d="m509 990.8h-16.2c5.3 0 10.7.1 16.2 0z" fill="#808080"/><path d="m427.3 447.1c-39.2 0-75.7-7-100.8-18.3-1.8.4-3.7.7-5.7 1.1.3.1.6.3.9.4s.6.3.8.4c.8.4 1.7.8 2.6 1.2.3.1.6.3.9.4.9.4 1.8.8 2.6 1.1.3.1.6.3.9.4.9.4 1.8.7 2.7 1.1.3.1.6.2.9.4.9.3 1.8.7 2.8 1 .1 0 .1 0 .2.1 1.8.7 3.7 1.3 5.6 1.9.7.2 1.3.4 2 .6.3.1.6.2 1 .3 1 .3 1.9.6 2.9.9.3.1.7.2 1 .3 1 .3 2 .6 2.9.8.3.1.7.2 1 .3 1 .3 2 .5 3 .8.3.1.7.2 1 .2 1 .2 2 .5 3 .7.3.1.7.2 1 .2 1 .2 2 .5 3.1.7.3.1.7.1 1 .2 1 .2 2.1.4 3.1.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.5.2 0 .4.1.5.1 11.1 1.8 22.9 3 35.2 3.6h1c.4 0 .8 0 1.2.1 1.2 0 2.4.1 3.6.1h1.2c1.2 0 2.5.1 3.7.1h1.2 3.3.5 1.3 3.8 1.3c1.3 0 2.6-.1 3.8-.1h1.3c1.3 0 2.6-.1 3.9-.2.4 0 .9 0 1.3-.1.9 0 1.9-.1 2.8-.2 12.3-.7 24.2-2.1 35.2-4.1.1 0 .2 0 .3-.1.5-.1 1-.2 1.5-.3 1.6-.3 3.1-.6 4.7-.9.5-.1 1.1-.2 1.6-.3 1.6-.3 3.2-.7 4.8-1.1.6-.1 1.1-.3 1.7-.4 1.7-.4 3.3-.8 5-1.3.6-.2 1.1-.3 1.7-.5 1.8-.5 3.5-1 5.2-1.5l1.8-.6c1.9-.6 3.7-1.2 5.5-1.8.5-.2.9-.3 1.4-.5.3-.1.6-.2.8-.3 1.9-.7 3.8-1.4 5.7-2.2.7-.3 1.4-.6 2.1-.9 1.2-.5 2.4-1.1 3.6-1.6-2.2-.3-4.3-.6-6.4-1-24.7 10.5-59.2 16.7-96.1 16.7z" fill="#808080"/><path d="m587.4 760.6h-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-35.2-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7-35.2-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-23.2 2.5 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6 35.2.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6 35.3.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6 35.2.8 3.7.3-4.8z" fill="#808080"/><path d="m588.1 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c-8.2-2.9-18.6-5-31.9-6.5-.9-.1-2.1-.2-3.3-.4v2.9 1.3z" fill="#808080"/><path d="m632.8 472.4 11.7-12c-.5-.8-1-1.6-1.5-2.3l-14 14.3z" fill="#e8e7e8"/><path d="m637.8 472.4 8.5-8.7c-.4-.9-.8-1.7-1.3-2.6l-11 11.2h3.8z" fill="#e8e7e8"/><path d="m623.4 461.5 11.1-11.4c-.8-.5-1.5-1-2.4-1.4l-8.7 8.9z" fill="#e8e7e8"/><path d="m623.4 456.3 7.9-8.1c-.8-.4-1.7-.9-2.5-1.3l-5.4 5.5z" fill="#e8e7e8"/><path d="m624.3 445.1c-.3-.1-.6-.2-.9-.3v1.3z" fill="#e8e7e8"/><path d="m642.8 472.4 4.9-5c-.3-1-.7-1.9-1-2.8l-7.6 7.8z" fill="#e8e7e8"/><path d="m647.8 472.4.9-1c-.2-1-.5-2.1-.8-3l-3.9 4z" fill="#e8e7e8"/><path d="m623.4 466.6 14-14.4c-.7-.6-1.4-1.1-2.2-1.6l-11.9 12.1v3.9z" fill="#e8e7e8"/><path d="m623.4 451.2 4.5-4.6c-.9-.4-1.8-.8-2.7-1.1l-1.8 1.9z" fill="#e8e7e8"/><path d="m627.7 472.4 14.7-15c-.5-.7-1.1-1.4-1.8-2l-16.6 17z" fill="#e8e7e8"/><path d="m623.4 471.7 16.7-17.1c-.6-.6-1.3-1.2-2-1.8l-14.7 15.1z" fill="#e8e7e8"/><path d="m623.4 447.4 1.8-1.9c-.3-.1-.6-.2-.9-.4l-.9 1z" fill="#808080"/><path d="m623.4 452.5 5.4-5.5c-.3-.1-.6-.3-.9-.4l-4.5 4.6z" fill="#808080"/><path d="m623.4 457.6 8.7-8.9c-.3-.2-.5-.3-.8-.4l-7.9 8.1z" fill="#808080"/><path d="m623.4 462.8 11.9-12.1c-.3-.2-.5-.3-.8-.5l-11.1 11.4z" fill="#808080"/><path d="m623.4 467.9 14.7-15.1c-.2-.2-.5-.4-.7-.6l-14 14.4z" fill="#808080"/><path d="m623.4 472.4h.6l16.7-17.1c-.2-.2-.4-.4-.6-.7l-16.7 17.1z" fill="#808080"/><path d="m629 472.4 14-14.3c-.2-.2-.4-.5-.5-.7l-14.7 15z" fill="#808080"/><path d="m634 472.4 11-11.2c-.2-.3-.3-.5-.5-.8l-11.7 12z" fill="#808080"/><path d="m639 472.4 7.6-7.8c-.1-.3-.3-.6-.4-.9l-8.5 8.7z" fill="#808080"/><path d="m644 472.4 3.9-4c-.1-.3-.2-.7-.3-1l-4.9 5z" fill="#808080"/><path d="m648.9 472.4c-.1-.3-.1-.6-.2-1l-.9 1z" fill="#808080"/><path d="m618.9 508.4h-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m644 472.4h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3c1.8-7.9 2.9-13.4 3-15.9.2-7.7-.1-14.4-1.2-20.2h-1.1-4.2z" fill="#e8e7e8"/><path d="m623.4 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m623.4 543.8 20.3-20.8c.4-1.8.9-3.5 1.3-5.1l-21.6 22.1z" fill="#e8e7e8"/><path d="m623.4 538.7 22-22.5c.4-1.8.8-3.5 1.2-5.1l-23.2 23.8z" fill="#e8e7e8"/><path d="m623.4 529.7v3.8l23.6-24.2c.1-.3.1-.6.2-1h-3z" fill="#e8e7e8"/><path d="m627.7 544.4 14.2-14.5c.4-1.8.9-3.5 1.3-5.2l-19.2 19.7z" fill="#e8e7e8"/><path d="m637.8 544.4.7-.7c.4-1.8.9-3.5 1.3-5.2l-5.7 5.9z" fill="#e8e7e8"/><path d="m623.4 523.3 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m623.4 528.4 19.5-20h-3.8l-15.7 16.2z" fill="#e8e7e8"/><path d="m632.8 544.4 7.4-7.6c.4-1.8.9-3.5 1.3-5.2l-12.5 12.8z" fill="#e8e7e8"/><path d="m623.4 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m624.1 508.4h-.7v.8z" fill="#808080"/><path d="m623.4 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 519.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m623.4 524.6 15.7-16.2h-1.2l-14.5 14.9z" fill="#808080"/><path d="m623.4 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m623.4 534.8 23.2-23.8c.1-.6.3-1.1.4-1.7l-23.6 24.2z" fill="#808080"/><path d="m623.4 539.9 21.6-22.1c.1-.6.3-1.2.4-1.7l-22 22.5z" fill="#808080"/><path d="m623.4 544.4h.6l19.2-19.7c.1-.6.3-1.2.4-1.7l-20.3 20.8v.6z" fill="#808080"/><path d="m629 544.4 12.5-12.8c.1-.6.3-1.2.4-1.7l-14.2 14.5z" fill="#808080"/><path d="m634 544.4 5.7-5.9c.1-.6.3-1.2.4-1.7l-7.4 7.6z" fill="#808080"/><path d="m638.3 544.4c.1-.2.1-.5.2-.7l-.7.7z" fill="#808080"/><path d="m588.1 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 502.6 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m588.1 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m588.1 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m612.6 508.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m617.6 508.4 5.8-5.9v-3.8l-9.6 9.7z" fill="#e8e7e8"/><path d="m607.6 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m592.5 508.4 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m602.6 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m597.5 508.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m622.6 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.9 472.4h-.8v.7z" fill="#808080"/><path d="m588.1 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 498.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 508.4h.7l34.6-35.4v-.6h-.7l-34.6 35.4z" fill="#808080"/><path d="m593.8 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m598.8 508.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m603.8 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 508.4 14.6-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m613.8 508.4 9.6-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m618.9 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 508.4v-.8l-.8.8z" fill="#808080"/><path d="m623.4 600.5v-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1.3c1-4.3 2-8.5 3.1-12.6v-2.1z" fill="#808080"/><path d="m634 544.4h-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3c3.2-13 6.3-25.1 9.1-36h-.5-3.8z" fill="#e8e7e8"/><path d="m623.4 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 603.9c.2-.9.5-1.9.7-2.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 586.4v3.8l4.5-4.6c.4-1.7.9-3.4 1.3-5.1z" fill="#e8e7e8"/><path d="m623.4 595.3 2.8-2.9c.4-1.7.9-3.4 1.3-5.1l-4.1 4.2z" fill="#e8e7e8"/><path d="m623.4 600.5 1.1-1.1c.4-1.7.8-3.4 1.3-5.1l-2.4 2.4z" fill="#e8e7e8"/><path d="m624.1 580.5h-.7v.7z" fill="#808080"/><path d="m623.4 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 591.5 4.1-4.2c.1-.6.3-1.2.4-1.7l-4.5 4.6z" fill="#808080"/><path d="m623.4 596.6 2.4-2.4c.1-.6.3-1.2.4-1.7l-2.8 2.9z" fill="#808080"/><path d="m623.4 601.7.7-.7c.1-.6.3-1.1.4-1.7l-1.1 1.1z" fill="#808080"/><path d="m602.6 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m607.6 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m612.6 580.5 10.8-11.1v-3.8l-14.6 14.9z" fill="#e8e7e8"/><path d="m588.1 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 574.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m622.6 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.1 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m588.1 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m588.1 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m617.6 580.5 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m597.5 580.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m588.1 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m592.5 580.5 30.9-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 544.4h-.8v.8z" fill="#808080"/><path d="m588.1 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m588.1 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 570.8 25.9-26.4h-1.3l-24.6 25.2z" fill="#808080"/><path d="m588.1 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m588.1 579.8v.7h.7l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m593.8 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m598.8 580.5 24.6-25.2v-1.2l-25.9 26.4z" fill="#808080"/><path d="m603.8 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 580.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m613.8 580.5 9.6-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m618.9 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 580.5v-.8l-.8.8z" fill="#808080"/><path d="m607.6 652.5h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3.4c2.4-11.9 4.9-24 7.6-36h-3.1-1.2z" fill="#808080"/><path d="m612 652.5c.3-1.4.6-2.8.9-4.2l-4.1 4.2z" fill="#e8e7e8"/><path d="m607.6 652.5 5.7-5.8c.4-1.7.8-3.3 1.1-5l-10.6 10.8z" fill="#e8e7e8"/><path d="m588.1 621.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m592.5 652.5 25.4-26c.4-1.7.8-3.4 1.2-5.1l-30.3 31h3.7z" fill="#e8e7e8"/><path d="m588.1 646.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 648v3.8l31.4-32.1c.3-1.1.5-2.2.8-3.3h-1.3z" fill="#e8e7e8"/><path d="m588.1 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m597.5 652.5 18.8-19.2c.4-1.7.8-3.4 1.2-5l-23.7 24.3h3.7z" fill="#e8e7e8"/><path d="m588.1 631.4 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m588.1 636.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m602.6 652.5 12.2-12.5c.4-1.7.8-3.4 1.2-5l-17.2 17.5z" fill="#e8e7e8"/><path d="m588.9 616.5h-.8v.8z" fill="#808080"/><path d="m588.1 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 632.6 15.8-16.1h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 637.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 642.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 648 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 652.5h.6l30.3-31c.1-.6.3-1.1.4-1.7l-31.4 32.1v.6z" fill="#808080"/><path d="m593.8 652.5 23.7-24.3c.1-.6.3-1.1.4-1.7l-25.4 26z" fill="#808080"/><path d="m598.8 652.5 17.2-17.5c.1-.6.3-1.1.4-1.7l-18.8 19.2z" fill="#808080"/><path d="m603.8 652.5 10.6-10.8c.1-.6.3-1.1.4-1.7l-12.2 12.5z" fill="#808080"/><path d="m608.8 652.5 4.1-4.2c.1-.6.2-1.1.4-1.7l-5.7 5.8h1.2z" fill="#808080"/><path d="m593.8 724.6h-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h4.7c.3-3 .7-6 1.1-9.1 1.1-8.6 2.4-17.7 3.9-27h-.3-3.7z" fill="#808080"/><path d="m588.1 693.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 713.7 14.2-14.5c.3-1.6.6-3.2.9-4.8l-15.1 15.4z" fill="#e8e7e8"/><path d="m588.1 718.8 13-13.3c.3-1.6.6-3.2.9-4.7l-13.9 14.2z" fill="#e8e7e8"/><path d="m588.1 704.7v3.8l15.4-15.7c.3-1.4.6-2.8.8-4.2h-.4z" fill="#e8e7e8"/><path d="m588.1 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m588.1 723.9 11.8-12.1c.3-1.6.6-3.1.8-4.7l-12.7 13v3.8z" fill="#e8e7e8"/><path d="m588.1 703.4 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m592.5 724.6 6.4-6.5c.3-1.6.5-3.1.8-4.7l-10.9 11.2z" fill="#e8e7e8"/><path d="m597.5 724.6.3-.3c.3-1.5.5-3.1.8-4.6l-4.9 5h3.8z" fill="#e8e7e8"/><path d="m588.9 688.6h-.8v.7z" fill="#808080"/><path d="m588.1 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 704.7 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 709.8 15.1-15.4c.1-.5.2-1.1.3-1.6l-15.4 15.7z" fill="#808080"/><path d="m588.1 715 13.9-14.2c.1-.5.2-1.1.3-1.6l-14.2 14.5z" fill="#808080"/><path d="m588.1 720.1 12.7-13c.1-.5.2-1.1.3-1.6l-13 13.3z" fill="#808080"/><path d="m588.1 724.6h.6l10.9-11.2c.1-.5.2-1.1.3-1.6l-11.8 12.1z" fill="#808080"/><path d="m593.8 724.6 4.9-5c.1-.5.2-1 .3-1.6l-6.4 6.5h1.2z" fill="#808080"/><path d="m597.8 724.6c0-.1 0-.2.1-.3l-.3.3z" fill="#808080"/><path d="m588.1 796.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 2.7c.4-6.1.8-12.4 1.3-18.8h-.7-.6z" fill="#808080"/><path d="m588.1 770.3 4.1-4.2c.2-1.4.3-2.9.5-4.3l-4.6 4.7z" fill="#e8e7e8"/><path d="m588.1 780.6 2.9-3c.1-1.4.3-2.8.4-4.3l-3.4 3.4v3.9z" fill="#e8e7e8"/><path d="m588.1 790.9 1.9-2c.1-1.4.2-2.8.4-4.2l-2.3 2.3z" fill="#e8e7e8"/><path d="m588.1 785.7 2.4-2.5c.1-1.4.3-2.8.4-4.2l-2.8 2.9z" fill="#e8e7e8"/><path d="m588.1 796 1.5-1.5c.1-1.4.2-2.8.3-4.2l-1.8 1.8z" fill="#e8e7e8"/><path d="m589.4 796.6c0-.2 0-.5.1-.7l-.7.7z" fill="#e8e7e8"/><path d="m588.1 775.5 3.5-3.6c.1-1.4.3-2.9.4-4.3l-4 4v3.9z" fill="#e8e7e8"/><path d="m588.1 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 760.6h-.8v.8z" fill="#808080"/><path d="m588.1 765.2v1.3l4.6-4.7c0-.4.1-.8.1-1.2h-.2z" fill="#808080"/><path d="m588.1 771.6 4-4c.1-.5.1-1 .2-1.5l-4.1 4.2v1.3z" fill="#808080"/><path d="m588.1 776.8 3.4-3.4c0-.5.1-1 .1-1.4l-3.5 3.6z" fill="#808080"/><path d="m588.1 781.9 2.8-2.9c0-.5.1-1 .1-1.4l-2.9 3z" fill="#808080"/><path d="m588.1 787 2.3-2.3c0-.5.1-.9.1-1.4l-2.4 2.5z" fill="#808080"/><path d="m588.1 792.2 1.8-1.8c0-.5.1-.9.1-1.4l-1.9 2z" fill="#808080"/><path d="m588.1 796.6h.6l.7-.7c0-.5.1-.9.1-1.4l-1.5 1.5v.6z" fill="#808080"/><path d="m517.7 440.8v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5c-.3.1-.6.2-.8.3v.3 3.8z" fill="#808080"/><path d="m552.9 436.3h.7 3.8 1.3 3.8 1.3 3.8 1.3 2.9c-5.7-.5-12.1-1.2-18.7-1.9v1.1.8z" fill="#e8e7e8"/><path d="m577.4 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 451.2 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m552.9 446.1 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 472.4 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m587.4 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m552.9 440.9 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m572.3 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m567.3 472.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 471.7 33.3-34c-1.1-.1-2.2-.2-3.4-.3l-29.8 30.5v3.8z" fill="#e8e7e8"/><path d="m552.9 466.6 28.7-29.3c-1.1-.1-2.2-.2-3.4-.3l-25.2 25.8v3.8z" fill="#e8e7e8"/><path d="m552.9 452.5v3.8l19.5-19.9c-.3 0-.5-.1-.8-.1h-2.9z" fill="#e8e7e8"/><path d="m557.3 472.4 30.8-31.5v-2.9c-.3 0-.5-.1-.8-.1l-33.8 34.5z" fill="#e8e7e8"/><path d="m552.9 461.5 24.1-24.6c-1.1-.1-2.3-.2-3.4-.3l-20.6 21.1v3.8z" fill="#e8e7e8"/><path d="m553.7 436.3h-.8v.8z" fill="#808080"/><path d="m552.9 442.2 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 447.4 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 452.5 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 457.6 20.6-21.1c-.4 0-.8-.1-1.2-.1l-19.5 19.9v1.3z" fill="#808080"/><path d="m552.9 462.8 25.2-25.8c-.4 0-.8-.1-1.2-.1l-24.1 24.6v1.3z" fill="#808080"/><path d="m552.9 467.9 29.8-30.5c-.4 0-.8-.1-1.2-.1l-28.7 29.3v1.3z" fill="#808080"/><path d="m552.9 472.4h.6l33.8-34.5c-.4 0-.8-.1-1.2-.1l-33.3 34v.6z" fill="#808080"/><path d="m588.1 442.1v-1.3l-30.8 31.6h1.3z" fill="#808080"/><path d="m563.6 472.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m583.6 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 472.4v-.8l-.7.8z" fill="#808080"/><path d="m552.2 436.3.7-.8v-1.1c-.8-.1-1.6-.2-2.4-.3l-2.1 2.1h3.8z" fill="#e8e7e8"/><path d="m542.1 436.3 2.7-2.8c-1.1-.1-2.2-.3-3.4-.4l-3.1 3.2z" fill="#e8e7e8"/><path d="m532.1 436.3 3.8-3.9c-1.1-.1-2.2-.3-3.3-.4l-4.2 4.3z" fill="#e8e7e8"/><path d="m547.2 436.3 2.2-2.2c-1.1-.1-2.3-.3-3.4-.4l-2.6 2.6z" fill="#e8e7e8"/><path d="m537.1 436.3 3.2-3.3c-1.1-.1-2.2-.3-3.3-.4l-3.6 3.7z" fill="#e8e7e8"/><path d="m524.2 434.2c-1.8.7-3.7 1.5-5.7 2.2h3.5z" fill="#e8e7e8"/><path d="m523.3 436.3h3.8l4.4-4.5c-.5-.1-1-.1-1.5-.2-1.2.5-2.4 1.1-3.6 1.6z" fill="#e8e7e8"/><path d="m523.3 436.3 3-3.1c-.7.3-1.4.6-2.1.9l-2.1 2.2z" fill="#808080"/><path d="m528.4 436.3 4.2-4.3c-.4-.1-.7-.1-1.1-.2l-4.4 4.5z" fill="#808080"/><path d="m533.4 436.3 3.6-3.7c-.4 0-.7-.1-1.1-.1l-3.8 3.9h1.3z" fill="#808080"/><path d="m538.4 436.3 3.1-3.2c-.4 0-.8-.1-1.1-.1l-3.2 3.3z" fill="#808080"/><path d="m543.4 436.3 2.6-2.6c-.4 0-.8-.1-1.1-.1l-2.7 2.8h1.2z" fill="#808080"/><path d="m548.4 436.3 2.1-2.1c-.4 0-.8-.1-1.1-.1l-2.2 2.2z" fill="#808080"/><path d="m552.9 435.6-.7.7h.7z" fill="#808080"/><path d="m517.7 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m552.9 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m552.9 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.9 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m567.3 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m587.4 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m572.3 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m557.3 544.4 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m552.9 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m577.4 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 508.4h-.8v.8z" fill="#808080"/><path d="m552.9 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m558.6 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m573.6 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 544.4v-.7l-.7.7z" fill="#808080"/><path d="m537.1 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m527.1 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m547.2 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m517.7 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m517.7 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m518.4 472.4h-.7v.7z" fill="#808080"/><path d="m517.7 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 507.8v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 508.4v-.8l-.7.8z" fill="#808080"/><path d="m548.4 580.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m588.1 576v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m577.4 616.5 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m587.4 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m562.3 616.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m552.9 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m582.4 616.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m567.3 616.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m572.3 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m552.9 590.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m553.7 580.5h-.8v.7z" fill="#808080"/><path d="m552.9 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 606.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 616.5 29.5-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m563.6 616.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 616.5 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 616.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 616.5v-.8l-.7.8z" fill="#808080"/><path d="m517.7 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 559.3 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m547.2 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517.7 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m527.1 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m537.1 580.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m532.1 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m542.1 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m517.7 579.8 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.2 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m522.1 580.5 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 544.4h-.7v.8z" fill="#808080"/><path d="m517.7 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m517.7 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m517.7 576 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 579.8v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 580.5 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m533.4 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 580.5v-.8l-.7.8z" fill="#808080"/><path d="m548.4 652.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m583.6 616.5h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m552.9 672.5 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 677.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m557.3 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m587.4 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 657.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m572.3 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 662.3 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m567.3 688.6 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m562.3 688.6 25.8-26.5v-3.8l-29.5 30.3z" fill="#e8e7e8"/><path d="m577.4 688.6 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m582.4 688.6 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m553.7 652.5h-.8v.8z" fill="#808080"/><path d="m552.9 658.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 673.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 678.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 688.6 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 688.6 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m568.6 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 688.6 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m583.6 688.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 688.6v-.8l-.7.8z" fill="#808080"/><path d="m517.7 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 651.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 652.5.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517.7 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 631.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 646.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m522.1 652.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m547.2 652.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m542.1 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m532.1 652.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m537.1 652.5 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m518.4 616.5h-.7v.8z" fill="#808080"/><path d="m517.7 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 642.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 648 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 651.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 652.5 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 652.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 652.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 652.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 652.5v-.7l-.7.7z" fill="#808080"/><path d="m552.9 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m583.6 688.6h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m567.3 760.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 739.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 749.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 744.6 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 760.6 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m562.3 760.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m552.9 754.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m572.3 760.6 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 760 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m587.4 760.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 729.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m582.4 760.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.9 734.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 760.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 724.6h-.8v.7z" fill="#808080"/><path d="m552.9 730.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 735.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 740.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 745.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 751 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 756.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 760v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 760.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 760.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 760.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 760.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 760.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 760.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 760.6v-.7l-.7.7z" fill="#808080"/><path d="m517.7 693.2 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m542.1 724.6 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m537.1 724.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 703.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 708.5 19.5-19.9h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 713.7 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m517.7 718.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m547.2 724.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 724.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m522.1 724.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 723.9 34.6-35.3h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 724.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m527.1 724.6 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m518.4 688.6h-.7v.7z" fill="#808080"/><path d="m517.7 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 704.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 709.8 20.8-21.2h-1.3l-19.5 19.9z" fill="#808080"/><path d="m517.7 715 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 720.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 723.9v.7h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 724.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 724.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 724.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 724.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 724.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 724.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 724.6v-.8l-.7.8z" fill="#808080"/><path d="m552.9 828.2v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#808080"/><path d="m552.9 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m552.9 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m552.9 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m557.3 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m568.6 832.7h3.8l15.7-16.1c0-.4 0-.8.1-1.2v-2.7z" fill="#e8e7e8"/><path d="m552.9 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m582.4 832.7 5.1-5.2c.1-1.3.1-2.7.2-4.1l-9.1 9.3z" fill="#e8e7e8"/><path d="m587.2 832.7c.1-1.3.1-2.6.2-3.9l-3.8 3.9z" fill="#e8e7e8"/><path d="m552.9 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 832.7 10.4-10.6c.1-1.3.2-2.7.2-4.1l-14.4 14.7z" fill="#e8e7e8"/><path d="m562.3 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m567.3 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m553.7 796.6h-.8v.8z" fill="#808080"/><path d="m552.9 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m552.9 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 832v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 832.7 14.4-14.7c0-.5.1-.9.1-1.4l-15.7 16.1z" fill="#808080"/><path d="m578.6 832.7 9.1-9.3c0-.5 0-.9.1-1.4l-10.4 10.6h1.2z" fill="#808080"/><path d="m583.6 832.7 3.8-3.9c0-.5 0-.9.1-1.4l-5.1 5.2h1.2z" fill="#808080"/><path d="m542.1 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m517.7 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m547.2 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m537.1 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m517.7 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m552.9 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m527.1 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m532.1 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m518.4 760.6h-.7v.8z" fill="#808080"/><path d="m517.7 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m523.3 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m538.4 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m552.9 796.6v-.7l-.7.7z" fill="#808080"/><path d="m548.4 868.7h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m582.4 832.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 2.3c.2-11.3.6-23.3 1.2-36h-3.6-1.3z" fill="#e8e7e8"/><path d="m557.3 904.7 28.6-29.3c0-1.3 0-2.6.1-3.9l-32.5 33.2z" fill="#e8e7e8"/><path d="m552.9 900.2v3.8l33.1-33.9c0-.5 0-1 0-1.5h-2.3z" fill="#e8e7e8"/><path d="m552.9 888.7 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m562.3 904.7 23.5-24.1c0-1.3 0-2.6.1-3.9l-27.4 28z" fill="#e8e7e8"/><path d="m552.9 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 873.3 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 878.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m585.5 904.7c0-.7 0-1.3 0-2l-1.9 2z" fill="#e8e7e8"/><path d="m552.9 893.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m577.4 904.7 8.3-8.5c0-1.3 0-2.6 0-3.9l-12.1 12.4z" fill="#e8e7e8"/><path d="m582.4 904.7 3.2-3.3c0-1.3 0-2.6 0-3.9l-7 7.2z" fill="#e8e7e8"/><path d="m552.9 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m567.3 904.7 18.4-18.9c0-1.3 0-2.6.1-3.9l-22.3 22.8z" fill="#e8e7e8"/><path d="m572.3 904.7 13.4-13.7c0-1.3 0-2.6.1-3.9l-17.2 17.6z" fill="#e8e7e8"/><path d="m553.7 868.7h-.8v.8z" fill="#808080"/><path d="m552.9 874.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 890 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 895.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 904.7h.6l32.5-33.2c0-.4 0-.9 0-1.3l-33.1 33.9z" fill="#808080"/><path d="m558.6 904.7 27.4-28c0-.4 0-.9 0-1.3l-28.6 29.3z" fill="#808080"/><path d="m563.6 904.7 22.3-22.8c0-.4 0-.9 0-1.3l-23.5 24.1z" fill="#808080"/><path d="m568.6 904.7 17.2-17.6c0-.4 0-.9 0-1.3l-18.4 18.9z" fill="#808080"/><path d="m573.6 904.7 12.1-12.4c0-.4 0-.9 0-1.3l-13.4 13.7z" fill="#808080"/><path d="m578.6 904.7 7-7.2c0-.4 0-.9 0-1.3l-8.3 8.5z" fill="#808080"/><path d="m583.6 904.7 1.9-2c0-.4 0-.9 0-1.3l-3.2 3.3z" fill="#808080"/><path d="m517.7 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m542.1 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 868.7 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m532.1 868.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 868.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 868.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 847.5 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m537.1 868.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m522.1 868.7 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 832.7h-.7v.7z" fill="#808080"/><path d="m517.7 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 864.2 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 868.1v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 868.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 868.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 868.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 868.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 868.7v-.8l-.7.8z" fill="#808080"/><path d="m548.4 940.8h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m582.4 904.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3.8c.6-10.2.8-22.2 1-36h-1.9-1.3z" fill="#e8e7e8"/><path d="m552.9 972.3v3.8l31.4-32.1c.1-1.1.2-2.2.2-3.3h-.8z" fill="#e8e7e8"/><path d="m562.3 976.8 20.8-21.3c.2-1.4.4-2.9.6-4.4l-25.1 25.7z" fill="#e8e7e8"/><path d="m572.3 976.8 7.5-7.7c.7-1.7 1.2-3.6 1.8-5.6l-13 13.3z" fill="#e8e7e8"/><path d="m557.3 976.8 26.5-27.1c.1-1.4.3-2.8.4-4.2l-30.7 31.4h3.8z" fill="#e8e7e8"/><path d="m567.3 976.8 14.7-15c.3-1.5.6-3.1.9-4.8l-19.3 19.7h3.7z" fill="#e8e7e8"/><path d="m574.8 976.8.9-.9c1.1-1.2 2.2-2.7 3-4.4l-5.2 5.3z" fill="#e8e7e8"/><path d="m552.9 971 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 945.4 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m552.9 955.6 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 950.5 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 965.9 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m552.9 960.8 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m553.7 940.8h-.8v.7z" fill="#808080"/><path d="m552.9 946.7 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 951.8 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 956.9 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 962 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 967.2 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 972.3 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 976.8h.6l30.7-31.4c0-.5.1-.9.1-1.4l-31.4 32.1z" fill="#808080"/><path d="m558.6 976.8 25.1-25.7c.1-.5.1-1 .2-1.4l-26.5 27.1z" fill="#808080"/><path d="m563.6 976.8 19.3-19.7c.1-.5.2-1 .2-1.5l-20.8 21.3h1.3z" fill="#808080"/><path d="m568.6 976.8 13-13.3c.1-.5.3-1.1.4-1.7l-14.7 15z" fill="#808080"/><path d="m573.6 976.8 5.2-5.3c.4-.7.7-1.5 1.1-2.4l-7.5 7.7z" fill="#808080"/><path d="m517.7 920.9v3.8l19.5-20h-3.7z" fill="#e8e7e8"/><path d="m517.7 915.8v3.8l14.5-14.9h-3.7z" fill="#e8e7e8"/><path d="m517.7 926v3.9l24.6-25.2h-3.8z" fill="#e8e7e8"/><path d="m517.7 931.1v3.9l29.6-30.3h-3.8z" fill="#e8e7e8"/><path d="m517.7 905.5v3.8l4.5-4.6h-3.8z" fill="#e8e7e8"/><path d="m517.7 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m517.7 910.6v3.9l9.5-9.8h-3.7z" fill="#e8e7e8"/><path d="m527.1 940.8 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m532.1 940.8 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m537.1 940.8 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 940.8.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 940.8 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 940.8 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m522.1 940.8 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 905.5.7-.8h-.7z" fill="#808080"/><path d="m517.7 909.3v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m517.7 914.5v1.3l10.8-11.1h-1.3z" fill="#808080"/><path d="m517.7 919.6v1.3l15.8-16.2h-1.3z" fill="#808080"/><path d="m517.7 924.7v1.3l20.8-21.3h-1.3z" fill="#808080"/><path d="m517.7 929.9v1.2l25.8-26.4h-1.2z" fill="#808080"/><path d="m517.7 935v1.3l30.8-31.6h-1.2z" fill="#808080"/><path d="m517.7 940.1v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 940.8 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 940.8 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m533.4 940.8 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 940.8 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 940.8 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 940.8 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 940.8v-.8l-.7.8z" fill="#808080"/><path d="m572.3 976.8h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8c9.4-2.1 17.2-5.2 21.9-9.6h-1.2-1z" fill="#e8e7e8"/><path d="m523.5 976.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m548.3 987.3c1.6-.3 3.1-.6 4.7-1v-3.8z" fill="#e8e7e8"/><path d="m543.5 976.8-12.5 12.8c1.4-.1 2.8-.3 4.2-.4l12.2-12.4z" fill="#e8e7e8"/><path d="m552.9 977.4-10.6 10.9c1.5-.2 3-.5 4.5-.7l6.2-6.3v-3.9z" fill="#e8e7e8"/><path d="m548.5 976.8-12 12.3c1.4-.2 2.9-.3 4.3-.5l11.5-11.7h-3.8z" fill="#e8e7e8"/><path d="m538.5 976.8-13 13.3c1.4-.1 2.7-.2 4.1-.3l12.7-13z" fill="#e8e7e8"/><path d="m518.4 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m528.5 976.8-10.8 11v2.7c.4 0 .8 0 1.2-.1l13.3-13.6z" fill="#e8e7e8"/><path d="m533.5 976.8-13.3 13.6c1.3-.1 2.7-.1 4-.2l13.1-13.4z" fill="#e8e7e8"/><path d="m517.7 976.8v.8l.7-.8z" fill="#808080"/><path d="m522.2 976.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m517.7 986.5v1.3l10.8-11h-1.3z" fill="#808080"/><path d="m532.2 976.8-13.3 13.6c.4 0 .9 0 1.3-.1l13.3-13.6h-1.3z" fill="#808080"/><path d="m537.2 976.8-13.1 13.4c.4 0 .9-.1 1.3-.1l13-13.3z" fill="#808080"/><path d="m542.3 976.8-12.7 13c.5 0 .9-.1 1.4-.1l12.6-12.8h-1.3z" fill="#808080"/><path d="m547.3 976.8-12.2 12.4c.5-.1.9-.1 1.4-.2l12-12.3h-1.2z" fill="#808080"/><path d="m552.9 976.8h-.6l-11.5 11.7c.5-.1 1-.1 1.5-.2l10.6-10.9z" fill="#808080"/><path d="m552.9 981.3-6.2 6.3 1.5-.3 4.7-4.8z" fill="#808080"/><path d="m447.3 452.4v3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-.3c-11.1 2-22.9 3.4-35.2 4.1v1.2 1.2z" fill="#808080"/><path d="m506.9 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m496.9 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m517.7 440.8v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m511.9 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m491.9 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 466.6 26.4-27.1c-1.7.5-3.5 1-5.2 1.5l-21.2 21.7z" fill="#e8e7e8"/><path d="m482.5 456.3 12.9-13.2c-1.6.4-3.2.7-4.8 1.1l-8.1 8.3z" fill="#e8e7e8"/><path d="m482.5 451.2 6.5-6.7c-1.5.3-3.1.6-4.7.9l-1.9 1.9v3.9z" fill="#e8e7e8"/><path d="m482.8 445.8c-.1 0-.2 0-.3.1v.3z" fill="#e8e7e8"/><path d="m517 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 461.5 19.5-20c-1.6.4-3.3.9-5 1.3l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 471.7 33.8-34.6c-1.8.6-3.7 1.2-5.5 1.8l-28.3 28.9z" fill="#e8e7e8"/><path d="m482.5 447.4 1.9-1.9c-.5.1-1 .2-1.5.3l-.3.3v1.3z" fill="#808080"/><path d="m482.5 452.5 8.1-8.3c-.5.1-1 .2-1.6.3l-6.5 6.7z" fill="#808080"/><path d="m482.5 457.6 14.5-14.9c-.6.1-1.1.3-1.7.4l-12.9 13.2v1.3z" fill="#808080"/><path d="m482.5 462.8 21.2-21.7c-.6.2-1.1.3-1.7.5l-19.5 20z" fill="#808080"/><path d="m482.5 467.9 28.3-28.9c-.6.2-1.2.4-1.8.6l-26.4 27.1v1.2z" fill="#808080"/><path d="m482.5 472.4h.6l34.6-35.4v-.3c-.5.2-.9.3-1.4.5l-33.8 34.6z" fill="#808080"/><path d="m488.1 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 472.4v-.8l-.7.8z" fill="#808080"/><path d="m447.3 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m482.5 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m501.9 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m511.9 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m496.9 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m506.9 544.4 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m482.5 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m491.9 544.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m482.5 528.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 533.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m483.2 508.4h-.7v.8z" fill="#808080"/><path d="m482.5 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 534.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 543.8v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 544.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 544.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 544.4v-.7l-.7.7z" fill="#808080"/><path d="m471.7 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m476.7 508.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m447.3 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m461.7 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m456.7 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m481.7 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 476.9v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m448 472.4h-.7v.7z" fill="#808080"/><path d="m447.3 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 508.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 508.4v-.8l-.8.8z" fill="#808080"/><path d="m447.3 585v1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6z" fill="#808080"/><path d="m482.5 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7z" fill="#e8e7e8"/><path d="m501.9 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 600.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m511.9 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m482.5 590.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 605.6 24.5-25.1h-3.7l-20.8 21.2z" fill="#e8e7e8"/><path d="m482.5 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m506.9 616.5 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m496.9 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m486.9 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 616.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m483.2 580.5h-.7v.7z" fill="#808080"/><path d="m482.5 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m482.5 601.7 20.8-21.2h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 606.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m482.5 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m488.1 616.5 29.6-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m493.1 616.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 616.5v-.8l-.7.8z" fill="#808080"/><path d="m482.5 548.9v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m447.3 579.8 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m456.7 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 559.3 14.5-14.9h-3.8l-10.7 11.1z" fill="#e8e7e8"/><path d="m466.7 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m447.3 574.7 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 569.6 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m481.7 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m461.7 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m447.3 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 554.2 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m476.7 580.5 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m448 544.4h-.7v.8z" fill="#808080"/><path d="m447.3 550.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 555.5 10.7-11.1h-1.2l-9.5 9.8z" fill="#808080"/><path d="m447.3 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 570.8 25.8-26.4h-1.3l-24.5 25.2z" fill="#808080"/><path d="m447.3 576 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 579.8v.7h.6l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m452.9 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m457.9 580.5 24.6-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m462.9 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m473 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m478 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 580.5v-.8l-.8.8z" fill="#808080"/><path d="m482.5 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 616.5h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m511.9 688.6 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m482.5 657.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 662.3 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m517 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m506.9 688.6 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m501.9 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 672.5 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 677.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m486.9 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 688.6 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m496.9 688.6 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m483.2 652.5h-.7v.8z" fill="#808080"/><path d="m482.5 658.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 673.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 678.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m488.1 688.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 688.6 24.6-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m498.2 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 688.6 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m513.2 688.6 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 688.6v-.8l-.7.8z" fill="#808080"/><path d="m451.6 652.5 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m447.3 651.9 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 652.5 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m481.7 652.5.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m476.7 652.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m456.7 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m461.7 652.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 646.7 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 641.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 631.4 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 626.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m447.3 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m448 616.5h-.7v.8z" fill="#808080"/><path d="m447.3 622.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 627.5 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 642.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 648 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 651.9v.6h.6l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m452.9 652.5 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 652.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 652.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 652.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 652.5v-.7l-.8.7z" fill="#808080"/><path d="m482.5 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m517.7 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m517.7 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m517.7 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m493.3 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m503.3 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m508.3 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m498.3 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m517.7 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m517.7 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m517.7 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 724.6v.7l.7-.7z" fill="#808080"/><path d="m487 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m507 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m517.7 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m517.7 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 760.6h.7v-.7z" fill="#808080"/><path d="m482.5 689.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m473.1 688.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m447.3 720.1v3.8l34.5-35.3h-3.7z" fill="#e8e7e8"/><path d="m482.5 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m453 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m482.5 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m448 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m463.1 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m468.1 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m458 688.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m482.5 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 688.6v.7l.7-.7z" fill="#808080"/><path d="m451.8 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m456.8 688.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m461.8 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m466.8 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m471.8 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m476.8 688.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m482.5 688.6h-.7l-34.5 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 693-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m482.5 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m482.5 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 724.6h.8v-.8z" fill="#808080"/><path d="m447.3 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m482.5 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m482.5 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m486.9 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m482.5 821.8 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m496.9 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 806.4 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m482.5 816.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m491.9 832.7 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m511.9 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 801.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m506.9 832.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m483.2 796.6h-.7v.8z" fill="#808080"/><path d="m482.5 802.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 817.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 823.1 25.8-26.5h-1.3l-24.5 25.2z" fill="#808080"/><path d="m482.5 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m488.1 832.7 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 832.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 832.7v-.8l-.7.8z" fill="#808080"/><path d="m476.7 796.6 5.8-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m481.7 796.6.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m447.3 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 790.9 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 775.5 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 796 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m461.7 796.6 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m456.7 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m466.7 796.6 15.8-16.1v-3.8l-19.6 19.9z" fill="#e8e7e8"/><path d="m482.5 765.1v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m447.3 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m448 760.6h-.7v.8z" fill="#808080"/><path d="m447.3 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 771.6 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 792.2 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 796.6h.6l34.6-35.3v-.7h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 796.6 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 796.6 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 796.6 19.6-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m468 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 796.6 4.5-4.6v-1.2l-5.8 5.8z" fill="#808080"/><path d="m482.5 796.6v-.7l-.8.7z" fill="#808080"/><path d="m478 868.7h-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m513.2 832.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m511.9 904.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m486.9 904.7 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m517 904.7.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m491.9 904.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m506.9 904.7 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m496.9 904.7 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m501.9 904.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 878.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 904.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 873.3 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 893.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 888.7 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m483.2 868.7h-.7v.8z" fill="#808080"/><path d="m482.5 874.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 890 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 895.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 904.1v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 904.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 904.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 904.7 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 904.7 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 904.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 904.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 904.7v-.7l-.7.7z" fill="#808080"/><path d="m447.3 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 842.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m451.6 868.7 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m476.7 868.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m466.7 868.7 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 847.5 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m456.7 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m447.3 868.1 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m447.3 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 857.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 862.9 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m481.7 868.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m461.7 868.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m448 832.7h-.7v.7z" fill="#808080"/><path d="m447.3 838.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 843.7 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 859.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 864.2 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 868.7h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 868.7 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 868.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 868.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 868.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 868.7v-.8l-.8.8z" fill="#808080"/><path d="m482.5 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 904.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m517.7 961.9-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m517.7 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m517.7 946.5-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m503.3 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m517.7 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m493.3 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m508.3 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m517.7 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m498.3 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m482.5 972.3v3.8l34.6-35.3h-3.8z" fill="#e8e7e8"/><path d="m482.5 940.8v.7l.7-.7z" fill="#808080"/><path d="m487 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m507 940.8-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 945.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m517.7 950.4-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m517.7 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 976.8h.7v-.8z" fill="#808080"/><path d="m482.5 915.6-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 905.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m482.5 920.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m482.5 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m482.5 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m482.5 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m482.5 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 936.3v3.8l34.5-35.4h-3.7z" fill="#e8e7e8"/><path d="m451.8 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m476.8 904.7h-3.7l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m461.8 904.7h-3.8l-10.7 11.1v3.8z" fill="#e8e7e8"/><path d="m471.8 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m456.8 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m466.8 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m448 904.7h-.7v.8z" fill="#808080"/><path d="m453 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m458 904.7h-1.2l-9.5 9.8v1.3z" fill="#808080"/><path d="m463.1 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m468.1 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m473.1 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m478.1 904.7h-1.3l-29.5 30.3v1.3z" fill="#808080"/><path d="m482.5 904.7h-.7l-34.5 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 909.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 914.3-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m482.5 919.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m482.5 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 940.8h.8v-.8z" fill="#808080"/><path d="m517.7 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 2.8c3.3.1 6.8.2 10.3.3h16.7c2.9-.1 5.8-.1 8.7-.3v-2.7z" fill="#e8e7e8"/><path d="m453 976.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m448 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 977.4-12.2 12.5c1.2.1 2.3.1 3.6.2l8.6-8.8z" fill="#e8e7e8"/><path d="m479.9 990.4c.9 0 1.7.1 2.6.1v-2.8z" fill="#e8e7e8"/><path d="m482.5 982.6-7.4 7.6c1.2.1 2.4.1 3.6.2l3.8-3.9z" fill="#e8e7e8"/><path d="m473.1 976.8-12.2 12.5c1.1.1 2.3.2 3.5.2l12.5-12.7z" fill="#e8e7e8"/><path d="m478.1 976.8-12.5 12.8c1.1.1 2.3.1 3.5.2l12.8-13z" fill="#e8e7e8"/><path d="m463.1 976.8-11.5 11.7c.9.1 2.1.2 3.5.3l11.8-12z" fill="#e8e7e8"/><path d="m458 976.8-10.8 11v.4h1.7s.5.1 1.5.1l11.4-11.6h-3.8z" fill="#e8e7e8"/><path d="m468.1 976.8-11.9 12.1c1.1.1 2.2.2 3.5.3l12.1-12.4z" fill="#e8e7e8"/><path d="m447.3 976.8v.8l.7-.8z" fill="#808080"/><path d="m451.8 976.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m447.3 986.5v1.3l10.7-11h-1.2z" fill="#808080"/><path d="m461.8 976.8-11.4 11.6c.3 0 .7.1 1.2.1l11.5-11.7z" fill="#808080"/><path d="m466.8 976.8-11.8 12c.4 0 .8.1 1.2.1l11.9-12.1z" fill="#808080"/><path d="m471.8 976.8-12.1 12.4c.4 0 .8.1 1.2.1l12.2-12.5z" fill="#808080"/><path d="m476.8 976.8-12.5 12.7c.4 0 .8.1 1.2.1l12.5-12.8z" fill="#808080"/><path d="m482.5 976.8h-.6l-12.8 13c.4 0 .8 0 1.2.1l12.2-12.5z" fill="#808080"/><path d="m482.5 981.3-8.6 8.8c.4 0 .8 0 1.2.1l7.4-7.6z" fill="#808080"/><path d="m482.5 986.4-3.8 3.9c.4 0 .8 0 1.2.1l2.6-2.7z" fill="#808080"/><path d="m376.8 451.1v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1c-12.3-.6-24.1-1.8-35.2-3.6v.6 3.8z" fill="#808080"/><path d="m426.5 472.4 20.8-21.3v-1.2c-.9.1-1.9.1-2.8.2l-21.8 22.3z" fill="#e8e7e8"/><path d="m412 461.5 10.7-11c-1.2 0-2.5 0-3.7-.1l-7 7.2z" fill="#e8e7e8"/><path d="m421.4 472.4 21.7-22.2c-1.3.1-2.6.1-3.9.2l-21.6 22.1h3.8z" fill="#e8e7e8"/><path d="m412 456.3 5.8-5.9c-1.2 0-2.4-.1-3.6-.1l-2.2 2.2z" fill="#e8e7e8"/><path d="m436.5 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m446.5 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m416.4 472.4 21.5-22c-1.3 0-2.6.1-3.8.1l-21.4 21.9z" fill="#e8e7e8"/><path d="m412 466.6 15.7-16.1c-.2 0-.3 0-.5 0-1.1 0-2.2 0-3.3 0l-12 12.2v3.9z" fill="#e8e7e8"/><path d="m412 471.7 20.8-21.2c-1.3 0-2.5 0-3.8 0l-17 17.4z" fill="#e8e7e8"/><path d="m413 450.2c-.3 0-.6 0-1 0v1z" fill="#e8e7e8"/><path d="m412 452.5 2.2-2.2c-.4 0-.8 0-1.2-.1l-1 1z" fill="#808080"/><path d="m412 457.6 7-7.2c-.4 0-.8 0-1.2 0l-5.8 5.9z" fill="#808080"/><path d="m412 462.8 12-12.2c-.4 0-.8 0-1.2 0l-10.7 11v1.2z" fill="#808080"/><path d="m412 467.9 17-17.4c-.4 0-.8 0-1.3 0l-15.7 16.1z" fill="#808080"/><path d="m412 472.4h.6l21.4-21.9c-.4 0-.9 0-1.3 0l-20.7 21.2z" fill="#808080"/><path d="m417.7 472.4 21.6-22.1c-.4 0-.9 0-1.3 0l-21.5 22h1.2z" fill="#808080"/><path d="m422.7 472.4 21.8-22.3c-.4 0-.9 0-1.3.1l-21.7 22.2z" fill="#808080"/><path d="m447.3 452.4v-1.3l-20.8 21.3h1.2z" fill="#808080"/><path d="m432.7 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 472.4v-.8l-.8.8z" fill="#808080"/><path d="m376.8 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m412 538.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m446.5 544.4.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m421.4 544.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m412 523.3 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m441.5 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m412 543.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m426.5 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 512.9v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m436.5 544.4 10.8-11v-3.8l-14.6 14.8z" fill="#e8e7e8"/><path d="m412 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 518.1 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m431.5 544.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m412.8 508.4h-.8v.8z" fill="#808080"/><path d="m412 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 519.4 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 524.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 534.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 539.9 30.9-31.5h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 544.4h.7l34.6-35.3v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 544.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m422.7 544.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 544.4 19.6-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m432.7 544.4 14.6-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m437.8 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 544.4v-.7l-.8.7z" fill="#808080"/><path d="m376.8 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m386.2 508.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m401.3 508.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m411.3 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m391.2 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m406.3 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m376.8 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m376.8 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m396.3 508.4 15.7-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m412 476.9v-3.9l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m377.6 472.4h-.8v.7z" fill="#808080"/><path d="m376.8 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 508.4h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 508.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 508.4 14.5-14.9v-1.2l-15.7 16.1z" fill="#808080"/><path d="m402.5 508.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 508.4v-.8l-.7.8z" fill="#808080"/><path d="m381.3 616.5h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#808080"/><path d="m412 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7z" fill="#e8e7e8"/><path d="m421.4 616.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m412 595.3 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m447.3 585v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m412 610.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m412 590.2 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m426.5 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m431.5 616.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m412 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m412 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m412 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m441.5 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m446.5 616.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m412 615.9 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m436.5 616.5 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412.8 580.5h-.8v.7z" fill="#808080"/><path d="m412 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 591.5 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 596.6 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m412 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m412 606.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 612 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m412 615.9v.6h.7l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m417.7 616.5 29.6-30.3v-1.2l-30.9 31.5z" fill="#808080"/><path d="m422.7 616.5 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 616.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 616.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 616.5v-.8l-.8.8z" fill="#808080"/><path d="m376.8 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 548.9v-3.8l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m376.8 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m411.3 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m386.2 580.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m376.8 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m391.2 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m396.3 580.5 15.7-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m406.3 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m376.8 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m401.3 580.5 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m377.6 544.4h-.8v.8z" fill="#808080"/><path d="m376.8 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m376.8 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m376.8 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 580.5h.7l34.5-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 580.5 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m387.5 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m392.5 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 580.5 14.5-14.9v-1.3l-15.7 16.2z" fill="#808080"/><path d="m402.5 580.5 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m407.5 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 580.5v-.8l-.7.8z" fill="#808080"/><path d="m412 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 648v-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6z" fill="#e8e7e8"/><path d="m447.3 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m422.8 652.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412.8 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m417.8 652.5-5.8 5.9v3.9l9.6-9.8z" fill="#e8e7e8"/><path d="m432.8 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m447.3 668.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m447.3 684-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m412 684.1v3.8l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 673.7-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m427.8 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m447.3 653.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m437.9 652.5-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 658.3-29.6 30.3h3.7l25.9-26.5z" fill="#e8e7e8"/><path d="m412 652.5v.8l.8-.8z" fill="#808080"/><path d="m416.5 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 652.5-9.6 9.8v1.2l10.8-11z" fill="#808080"/><path d="m426.6 652.5-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 652.5-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 652.5-29.6 30.3v1.3l30.9-31.6z" fill="#808080"/><path d="m447.3 652.5h-.7l-34.6 35.4v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 657-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 662.1-25.9 26.5h1.3l24.6-25.2z" fill="#808080"/><path d="m447.3 667.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 672.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m447.3 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 688.6h.8v-.8z" fill="#808080"/><path d="m412 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m397.6 616.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m377.6 616.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 617.1-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m402.6 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m412 632.5-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m382.6 616.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m412 637.7-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m407.7 616.5-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m412 622.3-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m387.6 616.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m392.6 616.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 616.5v.8l.8-.8z" fill="#808080"/><path d="m381.3 616.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m386.3 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 616.5-14.6 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m396.4 616.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m401.4 616.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 616.5-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 616.5h-.6l-34.6 35.4v.6h.7l34.5-35.4z" fill="#808080"/><path d="m412 621-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 636.4-15.7 16.1h1.2l14.5-14.8z" fill="#808080"/><path d="m412 641.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 652.5h.7v-.7z" fill="#808080"/><path d="m412 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m447.3 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m417.8 724.6-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m447.3 725.2-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m412.8 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m422.8 724.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 756.1v3.9l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 745.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m432.8 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m437.9 724.6-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m447.3 740.6-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 756-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m447.3 730.4-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m412 724.6v.7l.8-.7z" fill="#808080"/><path d="m416.5 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 724.6-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 724.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 724.6-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 724.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 724.6h-.7l-34.6 35.4v.6h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 729.1-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 734.2-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 739.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 744.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 760.6h.8v-.7z" fill="#808080"/><path d="m412 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 709.7-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 704.6-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 694.3-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m377.6 688.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 689.2-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m397.6 688.6-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m402.6 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m376.8 720.1v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m382.6 688.6-5.8 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m412 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m387.6 688.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m392.6 688.6-15.8 16.1v3.8l19.6-19.9z" fill="#e8e7e8"/><path d="m376.8 688.6v.7l.8-.7z" fill="#808080"/><path d="m381.3 688.6-4.5 4.6v1.2l5.8-5.8z" fill="#808080"/><path d="m386.3 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 688.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m396.4 688.6-19.6 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m401.4 688.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 688.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 688.6h-.6l-34.6 35.3v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 693-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 708.4-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 713.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 724.6h.7v-.8z" fill="#808080"/><path d="m376.8 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.3v.7z" fill="#e8e7e8"/><path d="m412 806.4 9.6-9.8h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 811.5 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m446.5 832.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 832.7 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m412 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m436.5 832.7 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 832 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m421.4 832.7 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 801.1v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m426.5 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m412 826.9 29.6-30.3h-3.7l-25.9 26.5z" fill="#e8e7e8"/><path d="m412 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412.8 796.6h-.8v.8z" fill="#808080"/><path d="m412 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 807.7 10.8-11.1h-1.2l-9.6 9.8z" fill="#808080"/><path d="m412 812.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 823.1 25.9-26.5h-1.3l-24.6 25.2z" fill="#808080"/><path d="m412 828.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 832.7h.7l34.6-35.4v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 832.7 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m422.7 832.7 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 832.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 832.7 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 832.7v-.8l-.8.8z" fill="#808080"/><path d="m376.8 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m386.2 796.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m412 765.1v-3.8l-34.5 35.3h3.7z" fill="#e8e7e8"/><path d="m376.8 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 780.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m376.8 796 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m376.8 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m406.3 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m396.3 796.6 15.7-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m411.3 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m401.3 796.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m376.8 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m391.2 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m376.8 775.5 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m377.6 760.6h-.8v.8z" fill="#808080"/><path d="m376.8 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 776.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 781.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 792.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 796.6h.7l34.5-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 796.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m397.5 796.6 14.5-14.8v-1.3l-15.7 16.1z" fill="#808080"/><path d="m402.5 796.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m412 796.6v-.7l-.7.7z" fill="#808080"/><path d="m381.3 904.7h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#808080"/><path d="m412 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m447.3 884.7-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 900.1-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m412.8 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m447.3 889.9-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m442.9 868.7-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m422.8 868.7-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m432.8 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m417.8 868.7-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m437.9 868.7-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 869.4-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m447.3 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m412 868.7v.8l.8-.8z" fill="#808080"/><path d="m416.5 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 868.7-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 868.7-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 868.7-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 868.7-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m447.3 868.7h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m447.3 873.2-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m447.3 883.5-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m447.3 888.6-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 904.7h.8v-.7z" fill="#808080"/><path d="m412 853.8-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 838.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 868.1 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m412 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 848.7-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 847.5 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m376.8 837.3 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m376.8 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 852.7 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m412 833.3-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m377.6 832.7h-.8v.7z" fill="#808080"/><path d="m376.8 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 848.8 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 854 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 864.2 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 868.7h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m412 837.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 852.6-15.7 16.1h1.2l14.5-14.9z" fill="#808080"/><path d="m412 857.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 868.7h.7v-.8z" fill="#808080"/><path d="m412 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m447.3 946.5-29.6 30.3h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m447.3 941.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m447.3 972.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 961.9-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 956.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m427.8 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m437.9 940.8-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m422.8 940.8-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m432.8 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m412 972.3v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m417.8 940.8-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m412.8 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 940.8v.7l.8-.7z" fill="#808080"/><path d="m416.5 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 940.8-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 940.8-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m436.6 940.8-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 940.8-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 940.8h-.7l-34.6 35.3v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 945.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 950.4-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 955.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 960.6-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 976.8h.8v-.8z" fill="#808080"/><path d="m412 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 910.5-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m412 925.9-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m412 920.8-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m412 905.4-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m381.3 904.7h-3.7l-.8.8v3.8z" fill="#e8e7e8"/><path d="m411.4 904.7h-3.7l-30.9 31.6v3.8z" fill="#e8e7e8"/><path d="m396.4 904.7h-3.8l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m401.4 904.7h-3.8l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m406.4 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m391.4 904.7h-3.8l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m386.3 904.7h-3.7l-5.8 5.9v3.9z" fill="#e8e7e8"/><path d="m377.6 904.7h-.8v.8z" fill="#808080"/><path d="m382.6 904.7h-1.3l-4.5 4.6v1.3z" fill="#808080"/><path d="m387.6 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m392.6 904.7h-1.2l-14.6 14.9v1.3z" fill="#808080"/><path d="m397.6 904.7h-1.2l-19.6 20v1.3z" fill="#808080"/><path d="m402.6 904.7h-1.2l-24.6 25.2v1.2z" fill="#808080"/><path d="m407.7 904.7h-1.3l-29.6 30.3v1.3z" fill="#808080"/><path d="m412 904.7h-.6l-34.6 35.4v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 909.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m412 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 924.6-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 929.7-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m412 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 940.8h.7v-.8z" fill="#808080"/><path d="m447.3 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.2v.6 3.8 1.3 3.8.4c17.5.9 30.7 1.3 35.2 1.5v-.4-1.3z" fill="#e8e7e8"/><path d="m377.6 976.8-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 977.4-8.7 8.9c1.2.1 2.4.1 3.6.2l5.1-5.2z" fill="#e8e7e8"/><path d="m397.6 976.8-8.4 8.6c1.2.1 2.4.2 3.5.2l8.7-8.9h-3.8z" fill="#e8e7e8"/><path d="m412 982.6-3.9 4c1.2.1 2.4.1 3.6.2l.3-.3z" fill="#e8e7e8"/><path d="m402.6 976.8-8.7 8.9c1.2.1 2.4.1 3.5.2l8.9-9.2h-3.7z" fill="#e8e7e8"/><path d="m407.7 976.8-9 9.2c1.2.1 2.4.1 3.5.2l9.2-9.4z" fill="#e8e7e8"/><path d="m392.6 976.8-8.1 8.3c1.2.1 2.4.2 3.5.2l8.4-8.5z" fill="#e8e7e8"/><path d="m387.6 976.8-7.8 8c1.2.1 2.3.2 3.5.2l8-8.2z" fill="#e8e7e8"/><path d="m382.6 976.8-5.8 5.9v1.9c.6 0 1.2.1 1.8.1l7.7-7.9z" fill="#e8e7e8"/><path d="m376.8 976.8v.8l.8-.8z" fill="#808080"/><path d="m376.8 981.4v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m386.3 976.8-7.7 7.9c.4 0 .8.1 1.2.1l7.8-8z" fill="#808080"/><path d="m391.4 976.8-8 8.2c.4 0 .8.1 1.2.1l8.1-8.3z" fill="#808080"/><path d="m396.4 976.8-8.4 8.5c.4 0 .8.1 1.2.1l8.4-8.6z" fill="#808080"/><path d="m401.4 976.8-8.7 8.9c.4 0 .8.1 1.2.1l8.7-8.9h-1.2z" fill="#808080"/><path d="m406.4 976.8-8.9 9.2c.4 0 .8 0 1.2.1l9-9.2h-1.3z" fill="#808080"/><path d="m412 976.8h-.6l-9.2 9.4c.4 0 .8 0 1.2.1l8.7-8.9v-.6z" fill="#808080"/><path d="m412 981.3-5.1 5.2c.4 0 .8 0 1.2.1l3.9-4z" fill="#808080"/><path d="m411.7 986.7h.3v-.4z" fill="#808080"/><path d="m332.1 436.3h-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-2.7c-1.9-.6-3.7-1.3-5.6-1.9h-.2z" fill="#808080"/><path d="m371.1 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m341.6 466.6 22-22.5c-1-.2-2.1-.5-3.1-.7l-18.9 19.3z" fill="#e8e7e8"/><path d="m341.6 471.7 26.1-26.7c-1.1-.2-2.1-.4-3.1-.6l-23 23.5z" fill="#e8e7e8"/><path d="m341.6 461.5 17.8-18.3c-1-.2-2-.5-3-.7l-14.8 15.1z" fill="#e8e7e8"/><path d="m376.1 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m346 472.4 26-26.6c-1.1-.2-2.1-.4-3.2-.6l-26.6 27.2z" fill="#e8e7e8"/><path d="m351 472.4 25.3-25.9c-1.1-.2-2.2-.4-3.2-.5l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 456.3 13.8-14.1c-1-.3-2-.5-3-.8l-10.8 11z" fill="#e8e7e8"/><path d="m361 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m366.1 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m376.8 451.1v-3.8l-24.5 25.1h3.7z" fill="#e8e7e8"/><path d="m341.6 446.1 5.9-6c-1-.3-1.9-.6-2.9-.9l-3 3z" fill="#e8e7e8"/><path d="m341.6 451.2 9.8-10c-1-.3-2-.5-2.9-.8l-6.9 7z" fill="#e8e7e8"/><path d="m343.6 438.9c-.7-.2-1.3-.4-2-.6v2.7z" fill="#e8e7e8"/><path d="m341.6 442.2 3-3c-.3-.1-.6-.2-1-.3l-2 2z" fill="#808080"/><path d="m341.6 447.4 6.9-7c-.3-.1-.7-.2-1-.3l-5.9 6z" fill="#808080"/><path d="m341.6 452.5 10.8-11c-.3-.1-.7-.2-1-.3l-9.8 10z" fill="#808080"/><path d="m341.6 457.6 14.8-15.1c-.3-.1-.7-.2-1-.2l-13.8 14.1z" fill="#808080"/><path d="m341.6 462.8 18.9-19.3c-.3-.1-.7-.2-1-.2l-17.8 18.3v1.2z" fill="#808080"/><path d="m341.6 467.9 23-23.5c-.3-.1-.7-.1-1-.2l-22 22.5z" fill="#808080"/><path d="m341.6 472.4h.6l26.6-27.2c-.4-.1-.7-.1-1.1-.2l-26.1 26.7z" fill="#808080"/><path d="m347.3 472.4 25.8-26.4c-.4-.1-.7-.1-1.1-.2l-26 26.6z" fill="#808080"/><path d="m352.3 472.4 24.6-25.1v-.6c-.2 0-.4-.1-.5-.1l-25.4 25.8z" fill="#808080"/><path d="m357.3 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 472.4v-.8l-.7.8z" fill="#808080"/><path d="m310.5 431.5c-1.4.2-2.7.4-4.1.6v3.6z" fill="#e8e7e8"/><path d="m335.9 436.3c-.9-.4-1.8-.7-2.7-1.1l-1.1 1.1z" fill="#e8e7e8"/><path d="m330.8 436.3 1.4-1.4c-.9-.4-1.8-.7-2.7-1.1l-2.5 2.5z" fill="#e8e7e8"/><path d="m320.8 436.3 4.3-4.4c-.9-.4-1.7-.8-2.6-1.2l-5.5 5.6z" fill="#e8e7e8"/><path d="m315.8 436.3 5.9-6c-.3-.1-.6-.3-.9-.4-1 .2-2 .3-3 .5l-5.8 6h3.8z" fill="#e8e7e8"/><path d="m310.8 436.3 5.6-5.7c-1.5.2-2.9.5-4.4.7l-4.9 5.1h3.7z" fill="#e8e7e8"/><path d="m325.8 436.3 2.8-2.9c-.9-.4-1.8-.7-2.6-1.1l-3.9 4z" fill="#e8e7e8"/><path d="m306.4 436.3h.6l4.9-5.1c-.5.1-1 .1-1.5.2l-4.1 4.2v.7z" fill="#808080"/><path d="m312 436.3 5.8-6c-.5.1-1 .2-1.5.2l-5.6 5.7h1.3z" fill="#808080"/><path d="m317.1 436.3 5.5-5.6c-.3-.1-.6-.3-.8-.4l-5.9 6z" fill="#808080"/><path d="m322.1 436.3 3.9-4c-.3-.1-.6-.3-.9-.4l-4.3 4.4z" fill="#808080"/><path d="m327.1 436.3 2.5-2.5c-.3-.1-.6-.3-.9-.4l-2.8 2.9z" fill="#808080"/><path d="m332.1 436.3 1.1-1.1c-.3-.1-.6-.2-.9-.4l-1.4 1.4h1.2z" fill="#808080"/><path d="m336.1 436.3c-.1 0-.1 0-.2-.1l-.1.1z" fill="#808080"/><path d="m306.4 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m366.1 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m361 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m341.6 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m341.6 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m341.6 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m341.6 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m371.1 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m356 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m351 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m376.1 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m342.4 508.4h-.8v.8z" fill="#808080"/><path d="m341.6 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m341.6 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m341.6 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m352.3 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m362.3 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m367.3 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m372.3 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 544.4v-.7l-.7.7z" fill="#808080"/><path d="m306.4 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m306.4 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m306.4 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m306.4 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m306.4 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m306.4 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m320.8 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m315.8 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m330.8 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m335.9 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m340.9 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m325.8 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m306.4 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m341.6 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m307.1 472.4h-.7v.7z" fill="#808080"/><path d="m306.4 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m306.4 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m306.4 508.4h.6l34.6-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m327.1 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m332.1 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m341.6 508.4v-.8l-.7.8z" fill="#808080"/><path d="m310.9 616.5h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 580.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m352.4 580.5-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m347.4 580.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m342.4 580.5-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m372.4 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 580.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m357.4 580.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 586.2-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 601.6-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m376.8 606.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m362.4 580.5-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 591.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 580.5v.7l.8-.7z" fill="#808080"/><path d="m346.1 580.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 580.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 580.5-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 580.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 580.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 581.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m376.8 585-30.8 31.5h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 590.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 605.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 610.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 616.5h.7v-.8z" fill="#808080"/><path d="m341.6 570.7-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m322.2 544.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m312.1 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m317.2 544.4-10.8 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m341.6 575.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m341.6 545.1-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 555.3-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 560.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m332.2 544.4-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 565.6-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m337.2 544.4-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 544.4v.8l.7-.8z" fill="#808080"/><path d="m310.9 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 544.4-9.5 9.8v1.3l10.8-11.1z" fill="#808080"/><path d="m320.9 544.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m325.9 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m336 544.4-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m341.6 544.4h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 548.9-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 554.1-25.8 26.4h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 559.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 564.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 574.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 580.5h.7v-.8z" fill="#808080"/><path d="m310.9 688.6h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 652.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#e8e7e8"/><path d="m352.4 652.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m347.4 652.5-5.8 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m342.4 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m357.4 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 678.8-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m376.8 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 658.3-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m376.8 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m372.4 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 652.5-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m362.4 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 663.4-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 673.7-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m341.6 652.5v.8l.8-.8z" fill="#808080"/><path d="m346.1 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 652.5-9.5 9.8v1.2l10.8-11z" fill="#808080"/><path d="m356.1 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 652.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 652.5-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m376.8 652.5h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 657-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 662.1-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m376.8 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 677.5-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m376.8 682.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 688.6h.7v-.8z" fill="#808080"/><path d="m341.6 632.5-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 617.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m307.1 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m341.6 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m312.1 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 637.7-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m317.2 616.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m332.2 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 616.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m322.2 616.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m327.2 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 616.5v.8l.7-.8z" fill="#808080"/><path d="m310.9 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 616.5-14.5 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m325.9 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 616.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 617.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 621-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 636.4-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m341.6 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 652.5h.7v-.7z" fill="#808080"/><path d="m341.6 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m376.8 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m376.8 745.8-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m367.4 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m362.4 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m342.4 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m352.4 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 735.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m347.4 724.6-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m376.8 750.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m376.8 730.4-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 724.6v.7l.8-.7z" fill="#808080"/><path d="m346.1 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 724.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 729.1-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 734.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 749.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 754.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 760.6h.7v-.7z" fill="#808080"/><path d="m307.1 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m312.1 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m322.2 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m317.2 688.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m341.6 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m332.2 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 688.6-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m341.6 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 704.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 689.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m306.4 688.6v.7l.7-.7z" fill="#808080"/><path d="m310.9 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m315.9 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m330.9 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 688.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 688.6h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 693-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 724.6h.7v-.8z" fill="#808080"/><path d="m306.4 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m341.6 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m356 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m341.6 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m371.1 832.7 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m366.1 832.7 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m341.6 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m361 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m351 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m341.6 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 801.1v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m376.1 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m341.6 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m342.4 796.6h-.8v.8z" fill="#808080"/><path d="m341.6 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m341.6 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m341.6 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m352.3 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 832.7 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 832.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 832.7v-.8l-.7.8z" fill="#808080"/><path d="m306.4 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m306.4 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m306.4 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m315.8 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m306.4 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m306.4 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m306.4 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m320.8 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m325.8 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m306.4 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m340.9 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m335.9 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m330.8 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m307.1 760.6h-.7v.8z" fill="#808080"/><path d="m306.4 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m306.4 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m306.4 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m327.1 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m332.1 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m341.6 796.6v-.7l-.7.7z" fill="#808080"/><path d="m341.6 900.2v-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6z" fill="#808080"/><path d="m341.6 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m376.8 889.9-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 895-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m376.8 879.6-24.5 25.1h3.7l20.8-21.2z" fill="#e8e7e8"/><path d="m342.4 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m367.4 868.7-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 900.2v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m362.4 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m347.4 868.7-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m352.4 868.7-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m376.8 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m357.4 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 874.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m341.6 868.7v.8l.8-.8z" fill="#808080"/><path d="m346.1 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 868.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 868.7-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 868.7-29.6 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m376.8 868.7h-.6l-34.6 35.4v.6h.6l34.6-35.3z" fill="#808080"/><path d="m376.8 873.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 878.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m376.8 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 893.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 898.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 904.7h.7v-.7z" fill="#808080"/><path d="m341.6 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 838.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 832.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m332.2 832.7-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m322.2 832.7-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m341.6 833.3-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m337.2 832.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m341.6 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m317.2 832.7-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 848.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 853.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m312.1 832.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 832.7-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 832.7v.7l.7-.7z" fill="#808080"/><path d="m310.9 832.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 832.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 832.7-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 832.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 832.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 832.7-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 833.3v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 837.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 852.6-15.8 16.1h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 868.7h.7v-.8z" fill="#808080"/><path d="m310.9 976.8h1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.4-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.7c.2 0 .3.1.5.1h.2 3.8z" fill="#808080"/><path d="m346.1 940.8h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 961.9-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m367.4 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m352.4 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m342.4 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 951.7-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m362.4 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 946.5-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m372.4 940.8-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m376.8 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m347.4 940.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m376.8 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 967.1-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 940.8v.7l.8-.7z" fill="#808080"/><path d="m346.1 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 940.8-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 945.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 950.4-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 965.8-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 970.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 976.8h.7v-.8z" fill="#808080"/><path d="m341.6 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m341.6 920.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 905.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m336 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m306.4 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m325.9 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m320.9 904.7h-3.7l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m310.9 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m330.9 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m315.9 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m307.1 904.7h-.7v.8z" fill="#808080"/><path d="m312.1 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m317.2 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m322.2 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m327.2 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m332.2 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m337.2 904.7h-1.2l-29.6 30.3v1.3z" fill="#808080"/><path d="m341.6 904.7h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 909.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 940.8h.7v-.8z" fill="#808080"/><path d="m376.8 981.4v-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.1-3.8-1.2-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8.1c11.7 1.2 23.7 2.3 35.2 3.1v-1.9z" fill="#e8e7e8"/><path d="m312.1 976.8-.7.7c1.1.2 2.2.3 3.3.5l1.2-1.2z" fill="#e8e7e8"/><path d="m317.2 976.8-1.4 1.4c1.1.2 2.2.3 3.3.5l1.8-1.9z" fill="#e8e7e8"/><path d="m327.2 976.8-2.6 2.6c1.1.1 2.2.3 3.3.4l3-3z" fill="#e8e7e8"/><path d="m322.2 976.8-2 2c1.1.2 2.2.3 3.3.4l2.4-2.5h-3.7z" fill="#e8e7e8"/><path d="m337.2 976.8-3.6 3.7c1.1.1 2.2.3 3.4.4l4-4.1z" fill="#e8e7e8"/><path d="m332.2 976.8-3.1 3.2c1.1.1 2.2.3 3.4.4l3.5-3.6z" fill="#e8e7e8"/><path d="m307.1 976.8c1 .2 2.1.4 3.2.6l.5-.6z" fill="#e8e7e8"/><path d="m341.6 977.4-3.5 3.6c1.1.1 2.3.2 3.4.4l.1-.1z" fill="#e8e7e8"/><path d="m306.9 976.8h.2z" fill="#808080"/><path d="m310.9 976.8-.5.6c.4.1.7.1 1.1.2l.7-.7h-1.3z" fill="#808080"/><path d="m315.9 976.8-1.2 1.2c.4.1.7.1 1.1.2l1.4-1.4z" fill="#808080"/><path d="m320.9 976.8-1.8 1.9c.4.1.7.1 1.1.2l2-2h-1.3z" fill="#808080"/><path d="m325.9 976.8-2.4 2.5c.4 0 .7.1 1.1.1l2.6-2.6z" fill="#808080"/><path d="m330.9 976.8-3 3c.4 0 .7.1 1.1.1l3.1-3.2h-1.2z" fill="#808080"/><path d="m336 976.8-3.5 3.6c.4 0 .8.1 1.1.1l3.6-3.7z" fill="#808080"/><path d="m341.6 976.8h-.6l-4 4.1c.4 0 .8.1 1.1.1l3.5-3.6z" fill="#808080"/><path d="m341.5 981.4h.1v-.1z" fill="#808080"/><path d="m236 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-2.8c-8.6.8-15.7 1.4-19.9 1.9-4.3.5-8.2 1-11.8 1.7v.9 1.2z" fill="#808080"/><path d="m271.9 436.3h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.6c-11.8 1.6-24.4 2.9-35.2 3.9v.3z" fill="#e8e7e8"/><path d="m295.6 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m280.6 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m287 436.3-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 436.3-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m275.6 472.4 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m297 436.3-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m285.6 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m281.9 436.3-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m290.6 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m302 436.3-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m271.9 436.3-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m300.6 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m305.7 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m276.9 436.3-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m271.2 436.3v.8l.7-.8z" fill="#808080"/><path d="m275.7 436.3-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 436.3-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 436.3-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 436.3-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 436.3-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 436.3-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 437v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m276.8 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m281.8 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m286.9 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m291.9 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m296.9 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m301.9 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m306.4 472.4v-.8l-.7.8z" fill="#808080"/><path d="m270.7 436.1c-1 .1-2.1.2-3.1.3h2.8z" fill="#e8e7e8"/><path d="m271.2 436.3v-.3c-.2 0-.3 0-.5 0l-.3.3z" fill="#808080"/><path d="m240.5 544.4h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#808080"/><path d="m271.2 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m281.9 508.4-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 508.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 508.4-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 508.4-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m297 508.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 508.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 539.8-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m306.4 514.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 524.4-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 529.6-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 534.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m302 508.4-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 509.1-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m271.2 508.4v.8l.7-.8z" fill="#808080"/><path d="m275.7 508.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 508.4-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 508.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 508.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 508.4-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 508.4-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 509.1v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 512.9-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 518-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 523.2-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 528.3-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 533.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 544.4h.7v-.7z" fill="#808080"/><path d="m236 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m271.2 488.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m271.2 493.5-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 483.3-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 498.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 503.8-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m236 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m271.2 478.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 473-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m236 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m236 492.4 19.5-20h-3.8l-15.7 16.1z" fill="#e8e7e8"/><path d="m236 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m236.7 472.4h-.7v.7z" fill="#808080"/><path d="m236 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m236 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m236 488.5 15.7-16.1h-1.2l-14.5 14.8z" fill="#808080"/><path d="m236 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m236 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m236 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m236 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m271.2 476.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 482-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 487.1-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 492.3-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 497.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 502.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 508.4h.8v-.8z" fill="#808080"/><path d="m240.5 616.5h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m275.7 580.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m297 580.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m281.9 580.5-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m302 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m287 580.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.9 580.5-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m276.9 580.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 586.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 606.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 601.6-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 591.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m306.4 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m292 580.5-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 580.5v.7l.7-.7z" fill="#808080"/><path d="m275.7 580.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 580.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 580.5-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m295.7 580.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 580.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 580.5h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 585-30.8 31.5h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 590.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 605.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 616.5h.7v-.8z" fill="#808080"/><path d="m251.7 544.4-15.7 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m246.7 544.4-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m241.7 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m256.8 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m266.8 544.4-30.8 31.6v3.8l34.5-35.4z" fill="#e8e7e8"/><path d="m261.8 544.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.2 545.1-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m271.2 575.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 570.7-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 565.6-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 560.5-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 555.3-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m236.7 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m236 544.4v.8l.7-.8z" fill="#808080"/><path d="m240.5 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 544.4-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m250.5 544.4-14.5 14.9v1.3l15.7-16.2z" fill="#808080"/><path d="m255.5 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m265.5 544.4-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m271.2 545.1v-.7h-.7l-34.5 35.4v.7h.6z" fill="#808080"/><path d="m271.2 548.9-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m271.2 554.1-25.8 26.4h1.2l24.6-25.2z" fill="#808080"/><path d="m271.2 559.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 564.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 574.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 580.5h.8v-.8z" fill="#808080"/><path d="m241.7 688.6h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.5v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1c.7 2.9 1.3 5.9 1.9 8.8h2.6 1.2z" fill="#808080"/><path d="m275.7 652.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#e8e7e8"/><path d="m276.9 652.5-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m306.4 673.7-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m302 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 658.3-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m292 652.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m297 652.5-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m281.9 652.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.9 652.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m287 652.5-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m306.4 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 652.5v.8l.7-.8z" fill="#808080"/><path d="m275.7 652.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 652.5-9.5 9.8v1.2l10.7-11z" fill="#808080"/><path d="m285.7 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 652.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 652.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 652.5-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 653.2v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 657-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 662.1-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m306.4 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 688.6h.7v-.8z" fill="#808080"/><path d="m271.2 642.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 616.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m266.8 616.5-30.8 31.5v3.9l34.5-35.4z" fill="#e8e7e8"/><path d="m271.2 637.7-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236.7 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m271.2 647.9-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m241.7 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m271.2 632.5-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 616.5-15.7 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.2 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m246.7 616.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.2 627.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m256.8 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 617.1-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 616.5v.8l.7-.8z" fill="#808080"/><path d="m240.5 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 616.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m250.5 616.5-14.5 14.9v1.2l15.7-16.1z" fill="#808080"/><path d="m255.5 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m265.5 616.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m271.2 616.5h-.7l-34.5 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m271.2 621-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 626.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 631.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 636.4-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 646.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 652.5h.8v-.7z" fill="#808080"/><path d="m271.2 760v-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c1.6 12 2.9 24.1 3.9 36h23.2v-.7z" fill="#808080"/><path d="m275.7 724.6h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m287 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m292 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m306.4 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m276.9 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m297 724.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m302 724.6-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m271.9 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m281.9 724.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m306.4 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 724.6v.7l.7-.7z" fill="#808080"/><path d="m275.7 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 724.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 724.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 760.6h.7v-.7z" fill="#808080"/><path d="m251.7 688.6-11.5 11.8c.2 1.1.4 2.2.6 3.2l14.7-15z" fill="#e8e7e8"/><path d="m271.2 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 709.7-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 698.2v-3.8l-27.4 28c.1.7.2 1.5.3 2.2h1.3z" fill="#e8e7e8"/><path d="m271.2 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m237.9 688.6c.2.7.3 1.4.5 2.2l2.1-2.2z" fill="#e8e7e8"/><path d="m241.7 688.6-3.2 3.2c.2 1.1.4 2.1.6 3.2l6.3-6.4z" fill="#e8e7e8"/><path d="m261.8 688.6-20 20.5c.2 1.1.4 2.2.5 3.3l23.2-23.8z" fill="#e8e7e8"/><path d="m266.8 688.6-24.3 24.9c0 .2.1.4.1.6.1.9.3 1.8.4 2.8l27.6-28.2h-3.8z" fill="#e8e7e8"/><path d="m256.8 688.6-15.8 16.1c.2 1.1.4 2.2.6 3.3l18.9-19.4z" fill="#e8e7e8"/><path d="m246.7 688.6-7.3 7.5c.2 1.1.4 2.1.6 3.2l10.5-10.7z" fill="#e8e7e8"/><path d="m271.2 689.2-28 28.7c.2 1.1.3 2.2.5 3.4l27.6-28.2v-3.9z" fill="#e8e7e8"/><path d="m240.5 688.6-2.1 2.2c.1.4.1.7.2 1.1l3.2-3.2h-1.3z" fill="#808080"/><path d="m245.5 688.6-6.3 6.4c.1.4.1.7.2 1.1l7.3-7.5z" fill="#808080"/><path d="m250.5 688.6-10.5 10.7c.1.4.1.7.2 1.1l11.5-11.8z" fill="#808080"/><path d="m255.5 688.6-14.7 15c.1.4.1.7.2 1.1l15.7-16.1z" fill="#808080"/><path d="m260.5 688.6-18.9 19.4c.1.4.1.7.2 1.1l20-20.5z" fill="#808080"/><path d="m265.5 688.6-23.2 23.8c.1.4.1.7.2 1.1l24.3-24.9z" fill="#808080"/><path d="m271.2 688.6h-.6l-27.6 28.2c.1.4.1.7.2 1.1l28-28.7z" fill="#808080"/><path d="m271.2 693-27.6 28.2c.1.4.1.8.2 1.1l27.4-28z" fill="#808080"/><path d="m271.2 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 708.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 724.6h.8v-.8z" fill="#808080"/><path d="m255.5 832.7h1.3 3.8 1.3 3.8 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3c.6 12.3 1 24.4 1.3 36h3.9z" fill="#808080"/><path d="m271.2 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m306.4 822.9-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m276.9 796.6-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m292 796.6-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m306.4 828.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m281.9 796.6-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m287 796.6-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 797.3-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m271.9 796.6-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 812.7-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 807.6-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m297 796.6-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m302 796.6-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 817.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 802.4-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 796.6v.8l.7-.8z" fill="#808080"/><path d="m275.7 796.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 796.6-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 796.6-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 796.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 796.6-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 796.6-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 797.3v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 801.1-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 806.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 811.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 816.5-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 821.7-10.8 11h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 826.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 832.7h.7v-.8z" fill="#808080"/><path d="m256.8 760.6-8.1 8.3c.1 1.2.2 2.4.3 3.6l11.6-11.9z" fill="#e8e7e8"/><path d="m266.8 760.6-17.5 17.9c.1 1.2.2 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 776.7-19.6 19.9h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 760.6-3.5 3.5c.1 1.2.2 2.4.3 3.6l6.9-7.1z" fill="#e8e7e8"/><path d="m248 760.6c.1.8.1 1.6.2 2.3l2.3-2.3z" fill="#e8e7e8"/><path d="m271.2 766.4-21.2 21.7c.1 1.2.1 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 771.5-21 21.5c.1 1.2.1 2.4.2 3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 761.3-21.5 22c.1 1.2.1 2.4.2 3.6l21.3-21.8z" fill="#e8e7e8"/><path d="m271.2 781.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 792-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m271.2 786.9-9.5 9.7h3.7l5.8-5.8z" fill="#e8e7e8"/><path d="m261.8 760.6-12.8 13.1c.1 1.2.2 2.4.2 3.6l16.3-16.6h-3.7z" fill="#e8e7e8"/><path d="m250.5 760.6-2.3 2.3c0 .4.1.8.1 1.2l3.5-3.5z" fill="#808080"/><path d="m255.5 760.6-6.9 7.1c0 .4.1.8.1 1.2l8.1-8.3z" fill="#808080"/><path d="m260.5 760.6-11.6 11.9c0 .4.1.8.1 1.2l12.8-13.1z" fill="#808080"/><path d="m265.5 760.6-16.3 16.6c0 .4.1.8.1 1.2l17.5-17.9h-1.3z" fill="#808080"/><path d="m271.2 760.6h-.6l-21 21.5c0 .4 0 .8.1 1.2l21.5-22z" fill="#808080"/><path d="m271.2 765.1-21.3 21.8c0 .4 0 .8.1 1.2l21.2-21.7z" fill="#808080"/><path d="m271.2 770.2-21 21.5c0 .4 0 .8.1 1.2l21-21.5v-1.2z" fill="#808080"/><path d="m271.2 776.7v-1.3l-20.8 21.2h1.2z" fill="#808080"/><path d="m271.2 780.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 785.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 790.8-5.8 5.8h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 796.6h.8v-.7z" fill="#808080"/><path d="m256.8 904.7h3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-2.9c.3 12.9.5 25.1 1 36h2 1.3z" fill="#808080"/><path d="m275.7 868.7h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m306.4 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m302 868.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m297 868.7-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 868.7-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 889.9-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m276.9 868.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m281.9 868.7-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 868.7-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 868.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 868.7v.8l.7-.8z" fill="#808080"/><path d="m275.7 868.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 868.7-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 868.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 868.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 868.7-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 869.4v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 873.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 904.7h.7v-.7z" fill="#808080"/><path d="m271.2 852.6v-3.8l-18.7 19.1v.9h2.9z" fill="#e8e7e8"/><path d="m251.7 832.7c0 1.3.1 2.5.1 3.8l3.7-3.8z" fill="#e8e7e8"/><path d="m271.2 843.6-18.8 19.2c0 1.3.1 2.5.1 3.8l18.7-19.1z" fill="#e8e7e8"/><path d="m271.2 864.1-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 859-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 832.7-9.8 10c0 1.3.1 2.5.1 3.8l13.5-13.8z" fill="#e8e7e8"/><path d="m266.8 832.7-14.7 15c0 1.3.1 2.5.1 3.8l18.4-18.8z" fill="#e8e7e8"/><path d="m271.2 853.8-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 838.5-18.9 19.3c0 1.3.1 2.5.1 3.8l18.8-19.2z" fill="#e8e7e8"/><path d="m256.8 832.7-4.9 5c0 1.3.1 2.5.1 3.7l8.6-8.8h-3.8z" fill="#e8e7e8"/><path d="m271.2 833.3-19 19.4c0 1.3.1 2.5.1 3.8l18.9-19.3z" fill="#e8e7e8"/><path d="m255.5 832.7-3.7 3.8v1.3l4.9-5h-1.2z" fill="#808080"/><path d="m260.5 832.7-8.6 8.8v1.3l9.8-10h-1.2z" fill="#808080"/><path d="m265.5 832.7-13.5 13.8v1.3l14.7-15h-1.2z" fill="#808080"/><path d="m271.2 832.7h-.6l-18.4 18.8v1.3l19-19.4z" fill="#808080"/><path d="m271.2 837.2-18.9 19.3v1.3l18.9-19.3z" fill="#808080"/><path d="m271.2 842.3-18.8 19.2v1.3l18.8-19.2z" fill="#808080"/><path d="m271.2 847.4-18.7 19.1v1.3l18.7-19.1z" fill="#808080"/><path d="m271.2 852.6-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 862.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 868.7h.8v-.8z" fill="#808080"/><path d="m271.2 965.9v-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-.2c1.6 10.2 3.9 17.7 7.3 21.8 1.5 1.8 4 3.4 7.3 5v-.4-1.3z" fill="#808080"/><path d="m306.4 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7z" fill="#e8e7e8"/><path d="m306.4 961.9-12.2 12.5c1 .2 2.1.4 3.1.6l9.1-9.3z" fill="#e8e7e8"/><path d="m302 940.8-27.5 28.2c.9.3 1.8.7 2.8 1l28.5-29.2z" fill="#e8e7e8"/><path d="m271.9 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 946.5-24.3 24.9c1 .3 1.9.5 3 .8l21.4-21.9v-3.8z" fill="#e8e7e8"/><path d="m306.4 951.7-20.4 20.8c1 .3 2 .5 3 .7l17.3-17.7v-3.8z" fill="#e8e7e8"/><path d="m306.4 967.1-8 8.2c1 .2 2.1.4 3.2.6l4.8-4.9z" fill="#e8e7e8"/><path d="m306.4 956.8-16.3 16.7c1 .2 2 .5 3.1.7l13.2-13.5z" fill="#e8e7e8"/><path d="m306.4 941.4-28.2 28.8c.9.3 1.9.6 2.9.9l25.3-25.9z" fill="#e8e7e8"/><path d="m297 940.8-25.8 26.4v.4c.8.4 1.6.7 2.4 1l27.2-27.8z" fill="#e8e7e8"/><path d="m281.9 940.8-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m292 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m287 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m306.4 972.2-3.8 3.9c1.1.2 2.1.4 3.2.6l.6-.6z" fill="#e8e7e8"/><path d="m271.2 940.8v.7l.7-.7z" fill="#808080"/><path d="m275.7 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 940.8-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m271.2 965.9v1.3l25.8-26.4h-1.3z" fill="#808080"/><path d="m300.7 940.8-27.2 27.8c.3.1.6.2.9.4l27.5-28.2z" fill="#808080"/><path d="m306.4 940.8h-.6l-28.5 29.2c.3.1.6.2.9.3l28.2-28.8z" fill="#808080"/><path d="m306.4 945.2-25.3 25.9c.3.1.6.2 1 .3l24.3-24.9z" fill="#808080"/><path d="m306.4 950.4-21.4 21.8c.3.1.7.2 1 .3l20.4-20.8z" fill="#808080"/><path d="m306.4 955.5-17.3 17.7c.3.1.7.2 1 .2l16.3-16.7z" fill="#808080"/><path d="m306.4 960.6-13.2 13.5c.3.1.7.1 1 .2l12.2-12.5z" fill="#808080"/><path d="m306.4 965.8-9.1 9.3c.4.1.7.1 1.1.2l8-8.2z" fill="#808080"/><path d="m306.4 970.9-4.8 4.9c.4.1.7.1 1.1.2l3.8-3.9v-1.2z" fill="#808080"/><path d="m305.8 976.6c.2 0 .4.1.6.1v-.7z" fill="#808080"/><path d="m271.2 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 925.9-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 910.5-16.3 16.7c.1 1.2.2 2.4.3 3.5l16-16.3z" fill="#e8e7e8"/><path d="m271.2 920.8-15.3 15.6c.1 1.2.3 2.3.5 3.4l14.8-15.2z" fill="#e8e7e8"/><path d="m271.2 915.6-15.8 16.2c.1 1.2.3 2.3.4 3.4l15.4-15.8z" fill="#e8e7e8"/><path d="m271.2 905.4-16.7 17.1c.1 1.2.2 2.4.3 3.6l16.4-16.8z" fill="#e8e7e8"/><path d="m270.5 904.7h-3.8l-12.6 12.9c.1 1.2.2 2.4.2 3.6z" fill="#e8e7e8"/><path d="m255.5 904.7h-2c0 .6.1 1.3.1 1.9z" fill="#e8e7e8"/><path d="m265.5 904.7h-3.8l-7.9 8.1c.1 1.2.1 2.4.2 3.6z" fill="#e8e7e8"/><path d="m260.5 904.7h-3.8l-3.1 3.2c.1 1.2.1 2.5.2 3.7z" fill="#e8e7e8"/><path d="m256.8 904.7h-1.3l-1.9 1.9c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m261.8 904.7h-1.3l-6.7 6.8c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m266.8 904.7h-1.3l-11.4 11.7c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m271.2 904.7h-.6l-16.1 16.5c0 .4.1.8.1 1.2l16.7-17.1v-.6z" fill="#808080"/><path d="m271.2 909.2-16.4 16.8c0 .4.1.8.1 1.2l16.3-16.7z" fill="#808080"/><path d="m271.2 914.3-16 16.3c0 .4.1.8.1 1.2l15.8-16.2v-1.3z" fill="#808080"/><path d="m271.2 919.5-15.4 15.8c0 .4.1.8.1 1.1l15.3-15.6z" fill="#808080"/><path d="m271.2 925.9v-1.3l-14.8 15.2c0 .3.1.7.1 1h.2z" fill="#808080"/><path d="m271.2 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 940.8h.8v-.8z" fill="#808080"/><path d="m196.4 472.4h3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-.5c-3.7 4.5-6.1 9.9-7.9 16.6h2.2 1.3z" fill="#808080"/><path d="m200.7 466.6 23.6-24.2c-1.9.5-3.7 1.1-5.4 1.6l-18.3 18.7v3.9z" fill="#e8e7e8"/><path d="m225.2 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m200.7 471.7 30.2-30.8c-1.7.3-3.3.7-4.8 1.1l-25.3 25.9v3.8z" fill="#e8e7e8"/><path d="m200.7 461.5 16.3-16.7c-2.5 1-4.8 2-6.9 3.2l-9.4 9.6z" fill="#e8e7e8"/><path d="m205.1 472.4 30.8-31.5v-.9c-1.2.2-2.4.4-3.5.6l-31.1 31.8z" fill="#e8e7e8"/><path d="m235.2 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m220.2 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m210.1 472.4 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m230.2 472.4 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m215.2 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m206.8 450.1c-2.3 1.7-4.3 3.6-6.1 5.6v.5z" fill="#e8e7e8"/><path d="m200.7 457.6 9.4-9.6c-1.2.7-2.3 1.4-3.4 2.2l-6.1 6.2v1.2z" fill="#808080"/><path d="m200.7 462.8 18.3-18.7c-.7.2-1.3.5-2 .7l-16.3 16.7z" fill="#808080"/><path d="m200.7 467.9 25.3-25.9c-.6.1-1.1.3-1.7.4l-23.6 24.2z" fill="#808080"/><path d="m200.7 472.4h.6l31.1-31.8c-.5.1-1.1.2-1.6.3l-30.2 30.8v.7z" fill="#808080"/><path d="m236 442.1v-1.3l-30.9 31.6h1.3z" fill="#808080"/><path d="m211.4 472.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m216.4 472.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m221.4 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m226.4 472.4 9.6-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m231.5 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m236 472.4v-.8l-.8.8z" fill="#808080"/><path d="m200.7 544.4v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.2-3.8-1.2-.2c1.5 9.6 4.5 21.9 8.4 36h1.9z" fill="#808080"/><path d="m205.2 508.4h1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m201.5 508.4-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m226.6 508.4-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m231.6 508.4-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m216.5 508.4-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m236 514.2-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m221.5 508.4-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m236 509.1-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m206.5 508.4-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m236 534.7-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m211.5 508.4-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m236 539.8-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m236 529.6-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236 524.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m236 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m200.7 508.4v.8l.8-.8z" fill="#808080"/><path d="m205.2 508.4-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m210.3 508.4-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m215.3 508.4-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m220.3 508.4-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m225.3 508.4-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m230.3 508.4-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m236 508.4h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m236 512.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m236 518-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m236 523.2-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m236 528.3-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m236 533.4-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 544.4h.8v-.7z" fill="#808080"/><path d="m192.9 472.4c-.3 1-.5 2-.8 3.1l3-3.1z" fill="#e8e7e8"/><path d="m196.4 472.4-4.6 4.7c-.3 1.6-.7 3.2-1 4.8l9.4-9.6h-3.8z" fill="#e8e7e8"/><path d="m200.7 473-10.3 10.5c-.3 1.5-.5 3-.8 4.6l11-11.3v-3.8z" fill="#e8e7e8"/><path d="m200.7 503.8-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m200.7 498.7-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m200.7 483.3-12 12.3c0 1.2 0 2.4.1 3.8l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 478.2-11.3 11.6c-.1.9-.3 1.9-.4 2.8-.1.5-.1 1.1-.2 1.6l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 488.4-11.9 12.1c.1 1.1.2 2.3.3 3.5l11.5-11.8v-3.8z" fill="#e8e7e8"/><path d="m200.7 497.4v-3.8l-11.4 11.7c.1 1 .3 2.1.5 3.2h.2z" fill="#e8e7e8"/><path d="m195.1 472.4-3 3.1c-.1.6-.3 1.1-.4 1.7l4.6-4.7h-1.2z" fill="#808080"/><path d="m200.7 472.4h-.6l-9.4 9.6c-.1.5-.2 1-.3 1.6l10.3-10.5z" fill="#808080"/><path d="m200.7 476.9-11 11.3c-.1.5-.2 1-.2 1.5l11.3-11.6v-1.2z" fill="#808080"/><path d="m200.7 482-11.9 12.2c0 .4-.1.9-.1 1.4l12-12.3z" fill="#808080"/><path d="m200.7 487.1-11.9 12.2c0 .4 0 .8.1 1.2l11.9-12.1v-1.3z" fill="#808080"/><path d="m200.7 492.3-11.5 11.8c0 .4.1.8.1 1.1l11.4-11.7z" fill="#808080"/><path d="m200.7 497.4-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m200.7 502.5-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m200 508.4h.7v-.8z" fill="#808080"/><path d="m211.5 580.5h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.2c2.4 8.5 5.1 17.6 7.9 27.1h1.6 1.4z" fill="#e8e7e8"/><path d="m236 581.1-20.8 21.3c.3 1 .6 2 .9 3l19.9-20.4z" fill="#e8e7e8"/><path d="m208.7 580.5c.1.4.2.8.4 1.3l1.2-1.3z" fill="#e8e7e8"/><path d="m211.5 580.5-2.2 2.2c.3 1 .6 2 .9 2.9l5.1-5.2h-3.8z" fill="#e8e7e8"/><path d="m236 601.6-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m216.5 580.5-6 6.2c.3 1 .6 2 .9 2.9l8.9-9.1z" fill="#e8e7e8"/><path d="m236 611.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 606.8-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m236 591.4-18.5 18.9c.3 1 .6 2 .9 3l17.6-18z" fill="#e8e7e8"/><path d="m236 586.2-19.6 20.1c.3 1 .6 2 .9 3l18.8-19.2v-3.9z" fill="#e8e7e8"/><path d="m236 600.3v-3.8l-17.3 17.7c.2.8.4 1.5.7 2.3h.9z" fill="#e8e7e8"/><path d="m226.6 580.5-13.7 14c.3 1 .6 2 .9 2.9l16.6-17h-3.8z" fill="#e8e7e8"/><path d="m221.5 580.5-9.9 10.1c.3 1 .6 2 .9 2.9l12.8-13.1h-3.8z" fill="#e8e7e8"/><path d="m231.6 580.5-17.6 18 .9 3 20.5-20.9h-3.8z" fill="#e8e7e8"/><path d="m210.3 580.5-1.2 1.3c.1.3.2.7.3 1l2.2-2.2h-1.3z" fill="#808080"/><path d="m215.3 580.5-5.1 5.2c.1.3.2.7.3 1l6-6.2z" fill="#808080"/><path d="m220.3 580.5-8.9 9.1c.1.3.2.7.3 1l9.9-10.1z" fill="#808080"/><path d="m225.3 580.5-12.8 13.1c.1.3.2.7.3 1l13.7-14h-1.2z" fill="#808080"/><path d="m230.3 580.5-16.6 17c.1.3.2.7.3 1l17.6-18z" fill="#808080"/><path d="m236 580.5h-.6l-20.5 20.9c.1.3.2.7.3 1l20.8-21.3z" fill="#808080"/><path d="m236 585-20 20.3c.1.3.2.7.3 1l19.6-20.1v-1.2z" fill="#808080"/><path d="m236 590.1-18.8 19.2c.1.3.2.7.3 1l18.5-18.9z" fill="#808080"/><path d="m236 595.2-17.6 18c.1.3.2.7.3 1l17.3-17.7z" fill="#808080"/><path d="m236 600.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m236 605.5-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 616.5h.8v-.8z" fill="#808080"/><path d="m200.7 545.1-1.8 1.9c.3 1 .6 2 .8 3l1-1z" fill="#e8e7e8"/><path d="m200 550.9c.2.8.5 1.6.7 2.5v-3.2z" fill="#e8e7e8"/><path d="m198.2 544.4c.1.5.3 1 .4 1.5l1.5-1.5z" fill="#e8e7e8"/><path d="m200.7 544.4h-.6l-1.5 1.5c.1.3.2.7.3 1l1.8-1.9z" fill="#808080"/><path d="m200.7 548.9-1 1c.1.3.2.7.3 1l.7-.7z" fill="#808080"/><path d="m231.6 652.5h3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-.9c3.4 11.9 6.8 24 10 36h1 1.5z" fill="#e8e7e8"/><path d="m231.6 652.5-1.8 1.9c.3 1 .5 2 .8 3l4.8-4.9z" fill="#e8e7e8"/><path d="m236 663.4-3.1 3.2c.3 1 .5 2.1.7 3.1l2.4-2.4z" fill="#e8e7e8"/><path d="m229.3 652.5c.1.3.1.6.2.8l.8-.8z" fill="#e8e7e8"/><path d="m236 658.3-4.1 4.2c.3 1 .5 2 .8 3.1l3.4-3.4v-3.9z" fill="#e8e7e8"/><path d="m236 653.2-5.2 5.3c.3 1 .5 2 .8 3l4.4-4.5z" fill="#e8e7e8"/><path d="m235.8 679c.1.3.1.5.2.8v-1z" fill="#e8e7e8"/><path d="m236 668.6-2.1 2.2c.2 1 .5 2.1.7 3.1l1.4-1.4z" fill="#e8e7e8"/><path d="m236 673.7-1.1 1.2c.2 1 .5 2.1.7 3.1l.4-.4z" fill="#e8e7e8"/><path d="m230.3 652.5-.8.8c.1.3.2.7.3 1l1.8-1.9h-1.3z" fill="#808080"/><path d="m236 652.5h-.6l-4.8 4.9c.1.3.2.7.3 1l5.2-5.3v-.6z" fill="#808080"/><path d="m236 657-4.4 4.5c.1.3.2.7.3 1l4.1-4.2z" fill="#808080"/><path d="m236 662.1-3.4 3.4c.1.3.2.7.3 1l3.1-3.2z" fill="#808080"/><path d="m236 667.3-2.4 2.4c.1.3.2.7.2 1l2.1-2.2v-1.2z" fill="#808080"/><path d="m236 672.4-1.4 1.4c.1.3.2.7.2 1l1.1-1.2v-1.2z" fill="#808080"/><path d="m236 677.5-.4.4c.1.3.2.7.2 1l.2-.2z" fill="#808080"/><path d="m303.3 226.2h2.3c-1-7.8-1.9-15.5-2.9-22.8-4.9-37.9-10.3-148.4 115.9-148.4 114.3 0 120.8 110.5 115.9 148.3-1 7.3-1.9 15-2.9 22.8h2.3c20.1-14.9 21.8 23.9 13.4 37.2-6.9 11-7.1 12.2-11.3 24.2-3.1 8.9-8.2 10.1-12.5 9.1-.5 5.3-1 9.9-1.3 13.5-1.8 20.4-50.9 61.2-62 74-10.4 12-27.8 7.3-33.3 7-5.6-.3-8.3-.4-8.3-.4s-2.7.1-8.3.4-22.9 4.9-33.3-7c-11.1-12.8-60.1-53.6-62-74-.3-3.7-.8-8.3-1.3-13.5-4.3 1-9.4-.2-12.5-9.1-4.2-12.1-4.3-13.3-11.3-24.2-8.3-13.2-6.7-52 13.4-37.1z" fill="#b56441"/><path d="m321.1 287.5s2.3 6 2.3 6c16.8 51.4 66 65.6 92.2 66.4 1 0 1.5-22.8 1.5-22.8-1.5 0 6.4-.3 6.8 0 0 0 .6 22.6 1.1 22.6 24.5-1.1 73-12.5 88.9-61.1 0 0 2.2-11.1 2.2-11.1.4-1.5 11.9-47.9 13-43.6-.4 3.4-.8 6.8-1.3 10.2 0 0-2.5 29.6-4.3 42.7-.5 5.3-.9 9.9-1.3 13.5-2.5 20.2-8 26.7-12.8 34.2 0 0 0 .1-.1.1-15.8 19.6-36.1 41.7-43.7 50.4-10.4 12-33.1 12.7-38.7 12.4-5.2-.2-7.9-.4-8.2-.4h-.1c-.4 0-3 .2-8.2.4-5.6.3-28.3-.4-38.7-12.4-7.7-8.8-27.9-30.9-43.7-50.4 0 0 0-.1-.1-.1-4.9-7.5-10.4-14-12.8-34.2-.4-3.6-.8-8.3-1.3-13.5-1.9-13.1-4.3-42.7-4.3-42.7-.4-3.4-.8-6.8-1.3-10.2 1-4.4 12.6 42.1 12.9 43.6z" fill="#582d11"/><path d="m422.1 298c10.9-.1 49 14 46.4 17.9-8.2 10.1-30.4-10.9-46.9-10.1-27 1.4-38.7 20.2-46.9 10.1-2.6-3.9 34.3-17.8 47.4-17.9z" fill="#582d11"/><path d="m533.7 209.3c-4.6 2.5-13.2-25.6-37.2-44.9-6.7-5.4-26.4-21.5-78-21.5v-92.5s51.9-3.6 86.9 33.7c35.2 37.3 44.1 116.9 28.3 125.2z" fill="#b56441"/><path d="m303.5 209.3c4.7 2.5 13.2-25.6 37.2-44.9 6.7-5.4 26.4-21.5 78-21.5v-92.5s-51.9-3.6-86.9 33.7c-35.1 37.3-44 116.9-28.3 125.2z" fill="#b56441"/><path d="m481.8 392.2-63 31.3 5.4 67.5 90.7-59.1z" fill="#e0e0e0"/><path d="m355.2 392.8 63.6 30.7-4.9 67.5-94.8-57z" fill="#e0e0e0"/><path d="m533.6 994.8-40.1-.1 73.2-559.5c6.2.6 27.9 3 31.9 4.3 3.9 1.3-65 555.3-65 555.3z" fill="#4189c6"/><path d="m318.7 980.6 43 4.6-67.6-552.1c-6.2.6-30.1 3.4-35.2 3.9z" fill="#4189c6"/><path d="m407.9 693.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7s-2.6-5.7-5.7-5.7c-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m407.9 601.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m405.2 508.5c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m413.7 786.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m417.4 878.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m365.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m470.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m433.9 443s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m418.6 435.7c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.2-15.3.2-2.2-.1-17.3z" fill="#4189c6"/><path d="m367.1 164.6c-24.7.5-39 8.6-39 16.9 0 8.4 13.2 6 23 2.1s22.9-3.6 28.3.4 17.2 5.2 17.7-3.3-21.5-16.3-30-16.1z" fill="#582d11"/><path d="m467.9 164.4c24.7.5 39.1 8.5 39.1 16.9 0 8.3-13.2 6-23 2.1-9.9-3.9-22.9-3.6-28.4.4s-17.2 5.1-17.7-3.3c-.5-8.5 21.6-16.3 30-16.1z" fill="#582d11"/><path d="m388 323s8.4 14.5 31.7 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1s-17.7.8-17.7.8z" fill="#c18c7e"/><path d="m366.4 996-47 6.4c-.6.1-1.2-.4-1.3-1l-9-66.2c-.1-.6.4-1.2 1-1.3l47-6.4c.6-.1 1.2.4 1.3 1l9 66.2c.1.6-.4 1.2-1 1.3z" fill="#474b56"/><path d="m536.9 1006.1-47.1-6c-.6-.1-1.1-.6-1-1.3l8.4-66.3c.1-.6.6-1.1 1.3-1l47.1 6c.6.1 1.1.6 1 1.3l-8.4 66.3c-.1.6-.7 1-1.3 1z" fill="#474b56"/><path d="m241.3 769.1c-8.2 5.4-16.6 10.4-25.2 14.9-2.1 1.1-5 3.4-7.5 2-1.4-.8-2.8-4.6-3.6-6-2.5-4.4-4.7-8.9-6.7-13.6-.7-1.8-3.6-1-2.9.8 2.3 5.4 4.8 10.7 7.8 15.8 1.6 2.8 3.2 7.1 7.1 6.8 2-.1 4-1.5 5.6-2.4 3.1-1.6 6.2-3.3 9.2-5 6-3.4 11.9-7 17.7-10.8 1.6-.9.1-3.5-1.5-2.5z" fill="#3a3032"/><path d="m529.4 158.2c-.2-.1-.4-.2-.6-.3-51.9-25-108.1-49.9-163.6-34.2-35.2 10-65.9 21.4-76.3 23-11.3 1.8-23.8-10.9-17.8-17.3 22.9-24 55.4-29.7 62.5-30.1 23-1.4 39.3-1.7 62.2-1.4 43.9.5 87.4-3.2 130.8-10 8-1.3 12.2-10 23.8 1.7 16.4 16.5 13.6 54-2.6 77.3-3.1 4.8-11.8-4.1-18.4-8.7z" fill="#474b56"/><path d="m556.4 102.9c-51.3 10.2-107.5 6.7-159.7 6.8-47.7 0-71.5 7.9-112.2 37.3-9.4 6.8-19.2 11.1-8.3-13.4 16.8-37.7 65.3-74.1 132.5-85.3 49.3-8.2 100.3 5.2 138.7 38.8 7 6 7.6 13.2 9 15.8z" fill="#474b56"/><path d="m340.5 131.4c-12.4 3.6-11.9 11.5-62.3 22.3-22.4 4.8-19.1-20.2-19-20.6 3.9-16.6 37.5-30 59.9-25.4 5.6 1.2 75.4-23.5 143.1 8.6 28.7 13.6 39.8 12.1 82.3 48.9.9.7-.1 2.1-1.1 1.5-12.9-8.7-31.9-20-47-22.3 0 0 0 0-.1 0-36.8-9.2-50.8-24.8-92.3-22.7-50.7 2.6-64.3 8.3-63.5 9.7z" fill="#474b56"/><path d="m259.7 140.9s-10-18.5 36.9-37.8c57.3-23.6 109-.6 169.6 21.1 11.6 4.2 30.9 15.5 32.6 20.8.5 1.6-75-18.5-147.3-28.3-59.3-8.1-79.8-.1-91.8 24.2z" fill="#3d4251"/><path d="m133.7 771.9 10.7-50.9s32.1-9.9 72.6-5.6c40.5 4.2 56.3 24.5 56.3 24.5l-27.3 69-90.8-13.1c-14.4-2-23.9-12.6-21.5-23.9z" fill="#e0e0e0"/><path d="m171.2 781.3c26.6-56.3 75.4-163.5 85.6-211.3 1.7-7.9 5.1-15.3 10.4-21.3 13.1-15.3 24.5-10.5 32.9-1.2 11 12.3 14.6 29.5 10.1 45.4l-37.8 133.7s-35.9 100.9-45 121.5c-7.5 16.8-21 7.4-39.7-5.4-19.7-13.7-26.7-39.7-16.5-61.4z" fill="#b5694e"/><path d="m273.8 601.5c-12.3-11.8-48.4-109.2-33.7-123.2s36.1-36 47.8-39.8c11.8-3.8 20-7.6 28.2-3.8s30.3 17.3 32.6 29.1c2.3 11.9-28.1 33.4-32.5 44.3-4.4 10.8 3.8 43.4 1.5 52.2s-3.8 44.4-22.9 46.8c-19.1 2.3-8.8 6.3-21-5.6z" fill="#b56441"/><path d="m221.5 772c-1.2 1.4-2.3 2.5-3.2 3.3s-1.8 1.4-2.5 1.8c-.8.4-1.5.6-2.1.6-.7 0-1.4-.2-2.1-.5s-1.2-.7-1.5-1.2-.5-1.1-.5-1.7c-.1-.6-.1-1.3 0-2.1s.1-1.6.1-2.4c0 0 0-.3 0-.8s0-1.2 0-2.1c0-.8 0-1.8 0-2.8s0-2 .1-3c0-1 .1-1.9.1-2.8s.1-1.6.1-2.1c0-.3.1-.6.2-.9s.3-.6.6-.7c.2-.2.5-.3.8-.3.3-.1.6-.1.9 0 .3 0 .6.1.8.1.2.1.4.1.6.2s.2.1.3.1c.5.2.8.5.9.9s.2.8.1 1.3l-1.7 16.9 9.7-10.2c.2-.2.4-.3.7-.5s.6-.4 1-.5.8-.2 1.2-.2.8 0 1.2.2.7.5.8 1 .1 1-.2 1.6c-.2.5-.6 1.1-1.1 1.6-.5.6-1 1.1-1.6 1.7s-1.2 1.2-1.9 1.8c-.7.5-1.3 1.1-1.8 1.7z" fill="#333"/><path d="m238.4 760c-1.7-.7-3.2-1.8-4.7-3.2s-2.7-3-3.7-4.9c-1-1.8-1.8-3.9-2.3-6-.5-2.2-.6-4.4-.3-6.7-1.3.7-2.6 1.3-4 1.8-1.3.5-2.6.9-3.9 1.1s-2.5.4-3.7.3c-1.2 0-2.2-.3-3.2-.7-1.3-.5-2.4-1.2-3.4-2s-1.9-1.6-2.6-2.5c-.8-.9-1.4-1.9-1.9-2.9s-.8-2-1.1-3c-.2-1-.3-2-.2-2.9.1-1 .3-1.9.7-2.7.5-1.1 1.2-2.1 2.3-2.8 1-.8 2.3-1.3 3.9-1.6s3.5-.2 5.6.2c2.2.4 4.6 1.2 7.4 2.4 2 .9 3.9 1.8 5.6 2.7s3.4 1.9 4.9 2.9c.8-.5 1.6-1.1 2.4-1.7l2.4-1.8c.2-.1.4-.3.6-.4.2-.2.5-.4.7-.5.3-.2.5-.3.7-.4s.4-.1.5-.1c.1.1.2.2.3.3.1.2.1.3.2.5 0 .2.1.4.1.5v.4c0 .3 0 .6-.2.9-.3.7-.8 1.4-1.5 2.3-.7.8-1.5 1.7-2.4 2.6 2 1.5 3.8 3.1 5.4 4.7s2.9 3.2 4 4.7c1.1 1.6 2 3.1 2.7 4.6s1.2 2.9 1.4 4.3c.3 1.4.4 2.6.3 3.8s-.3 2.2-.7 3.2-1 1.8-1.8 2.4c-.8.7-1.7 1.1-2.7 1.4-1.1.3-2.2.3-3.5.2-1.3-.3-2.7-.7-4.3-1.4zm3.3-4.2c1.3.5 2.3.7 3.2.5s1.5-.7 1.8-1.5c.4-.8.4-1.9.1-3.2s-.9-2.9-2-4.5c-1-1.7-2.5-3.5-4.4-5.5s-4.3-3.9-7.2-6l-.7.5c-.3 1.4-.4 2.8-.3 4.2s.4 2.8.8 4.1.9 2.6 1.6 3.9c.7 1.2 1.4 2.3 2.2 3.4.8 1 1.6 1.9 2.4 2.6.9.6 1.7 1.2 2.5 1.5zm-28.2-19.4c1 .4 2.1.6 3.2.6 1.2 0 2.4-.2 3.7-.5 1.3-.4 2.6-.9 4-1.5 1.4-.7 2.8-1.4 4.3-2.3-1.6-1-3.4-1.9-5.2-2.9s-3.8-1.9-6-2.8c-1.5-.6-2.7-1.1-3.8-1.3-1.1-.3-2-.4-2.8-.3-.8 0-1.4.2-1.8.5-.5.3-.8.7-1 1.2s-.3 1-.3 1.5c0 .6.1 1.2.3 1.8s.5 1.2.8 1.9c.3.6.7 1.2 1.2 1.7l1.5 1.5c.7.3 1.3.7 1.9.9z" fill="#333"/><path d="m245.5 693.2c1.3 1.1 2.6 2.1 3.8 2.9s2.3 1.5 3.2 1.9c.8.4 1.6.5 2.2.3.6-.1 1.1-.6 1.5-1.4.1-.3.2-.7.2-1.2s-.1-1.1-.2-1.8-.4-1.6-.7-2.5-.7-2-1.2-3.2h.6 1.2c.6 0 1.3.1 2.3.1.6 1.3 1 2.7 1.4 3.9.3 1.3.6 2.4.7 3.5s.1 2.1 0 3-.3 1.7-.6 2.4c-.3.8-.8 1.4-1.4 2-.6.5-1.3.9-2 1.2-.8.2-1.6.3-2.5.3-.9-.1-1.9-.3-2.9-.8-.4-.2-.8-.4-1.3-.7s-1.1-.7-1.7-1.1-1.3-.9-2-1.5-1.5-1.2-2.3-1.8c-.5 1.7-1.1 3.4-1.6 5s-1 3.2-1.6 4.7c.9.8 1.7 1.6 2.6 2.4.8.8 1.6 1.5 2.4 2.2.7.7 1.4 1.3 2 1.9l1.5 1.5c1 1.2 1.7 2.2 2 3s.3 1.4.1 1.9c-.1.3-.3.6-.5.8s-.5.4-.8.6c-.3.1-.6.2-.9.2s-.6 0-1-.2c-.2-.1-.4-.2-.5-.3-1.7-1.3-3.2-2.7-4.7-4.1s-2.9-2.7-4.3-4.1c-.3.7-.6 1.3-1 1.9s-.8 1.1-1.3 1.5-1.1.7-1.7.9-1.4.3-2.2.3c-.2 0-.5-.1-.6-.1-.2 0-.4-.1-.5-.2-.5-.2-.7-.5-.6-.9.1-.2.3-.4.7-.6s.9-.4 1.7-.6c.2-.6.5-1.2.7-1.8s.5-1.2.8-1.9l.8-1.8c-1-.9-1.9-1.9-2.8-2.7-.9-.9-1.8-1.7-2.6-2.5-.6-.5-1.1-.9-1.7-1.4-.6-.4-1.2-.7-1.8-1-.5-.2-.9-.4-1.4-.5-.4-.1-.9-.1-1.2 0-.4.1-.7.2-1 .5-.3.2-.5.6-.7 1s-.3.8-.4 1.4c-.1.5-.1 1.2-.1 1.9s.1 1.5.2 2.4.4 1.9.7 3c.1.4.2.7.2 1s-.1.5-.1.7c0 .1-.2.1-.6 0-.3-.1-.8-.2-1.2-.5-.6-.3-1.2-.7-1.6-1.3s-.8-1.2-1.1-1.9-.5-1.5-.6-2.3-.2-1.7-.1-2.5c0-.8.1-1.6.3-2.4s.4-1.4.6-2c.4-.9.9-1.6 1.4-2.3.6-.7 1.3-1.2 2-1.6.8-.4 1.7-.6 2.6-.5 1 0 2.1.3 3.2.8.6.2 1.2.6 1.9 1.1s1.5 1 2.4 1.7c.9.6 1.8 1.3 2.7 2.1s1.9 1.6 2.9 2.4c.5-1.3 1-2.8 1.6-4.4s1.2-3.3 1.8-4.9c-1.8-1.5-3.6-3.2-5.5-4.9s-3.7-3.5-5.4-5.2c-.6-.6-1-1.2-1.2-1.9-.2-.6-.2-1.3.1-1.9.1-.3.3-.5.4-.7.2-.2.4-.4.6-.5s.5-.2.8-.2.6.1.9.2.6.3 1 .5.7.5 1.1.8c.6.6 1.3 1.3 2.1 2 .7.7 1.5 1.4 2.3 2.1s1.6 1.5 2.4 2.2 1.6 1.5 2.5 2.2c.3-.8.5-1.5.8-2.1.2-.6.4-1.1.5-1.4 0-.1.1-.3.1-.4s.1-.2.1-.3c.2-.4.3-.7.5-.8s.4-.3.5-.4c.2-.1.4-.1.6-.1s.4.1.7.2.5.3.6.4c.1.2.2.4.2.6v.6c0 .2-.1.4-.1.6-.1.4-.2.6-.2.8s-.1.3-.1.3v.1.1c0 .1-.1.2-.1.4-.1.2-.2.5-.3.9-.1.5-.3.9-.4 1.4-.5.6-.7 1-.8 1.4z" fill="#333"/><path d="m265.3 671.2c-.1.8-.1 1.7-.2 2.6 0 .9-.1 1.7-.1 2.6 0 .8-.1 1.6-.2 2.3s-.3 1.4-.5 1.9c-.3.6-.6 1-1 1.2s-.8.2-1.2.1c-.4-.2-.7-.4-1-.6-.3-.3-.5-.5-.7-.8s-.3-.6-.4-.8c-.1-.3-.1-.5-.2-.7l.9-14.7-9.7 11.6c-.3.4-.7.7-1 .8-.3.2-.8.1-1.2-.1 0 0-.1 0-.2-.1s-.3-.2-.5-.3-.4-.3-.6-.5-.4-.4-.5-.7c-.1-.2-.2-.5-.3-.8 0-.3 0-.6.2-.9.1-.3.3-.5.5-.8.3-.4.7-.8 1.2-1.4.5-.5 1.1-1.1 1.7-1.7l1.8-1.8c.6-.6 1.2-1.2 1.7-1.7s.9-.9 1.3-1.2c.3-.3.5-.5.5-.5.6-.6 1.2-1.1 1.7-1.7s1-1 1.5-1.4 1-.7 1.6-.8c.5-.1 1.2-.1 1.8.2.7.3 1.4.7 1.8 1.2.5.5.8 1.1 1.1 1.9.2.8.4 1.8.4 3.1 0 1.2-.1 2.7-.2 4.5z" fill="#333"/><path d="m705.2 772.5-16.2-49.3s-33-6.3-72.8 2.4-53.3 30.5-53.3 30.5l34.9 65.7 88.8-23c14-3.7 22.2-15.3 18.6-26.3z" fill="#e0e0e0"/><path d="m670.7 775.2c-26.6-56.3-75.4-163.5-85.6-211.3-1.7-7.9-5.1-15.3-10.4-21.3-13.1-15.3-24.5-10.5-32.9-1.2-11 12.3-14.6 29.5-10.1 45.4l37.8 133.7s35.9 100.9 45 121.5c7.5 16.8 21 7.4 39.7-5.4 19.6-13.7 26.7-39.7 16.5-61.4z" fill="#b5694e"/><path d="m568.1 595.4c12.3-11.8 48.4-109.2 33.7-123.2-14.7-14.1-36.1-36-47.8-39.8-11.8-3.8-20-7.6-28.2-3.8s-30.3 17.3-32.6 29.1c-2.3 11.9 28.1 33.4 32.5 44.3s-3.8 43.4-1.5 52.2 3.8 44.4 22.9 46.8c19 2.3 8.7 6.3 21-5.6z" fill="#b56441"/></svg>
\ No newline at end of file
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png
new file mode 100755
index 0000000000000000000000000000000000000000..ac5f2a00ac809809f7e48628d79e04849ebad98b
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png
new file mode 100755
index 0000000000000000000000000000000000000000..443822e8ea1f8db01adc11f33e8685fb14b997dc
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png
new file mode 100755
index 0000000000000000000000000000000000000000..4a5e9fe4775b79347fcf33c97a7ad10e3f693b2c
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png
new file mode 100755
index 0000000000000000000000000000000000000000..66c625c10626011b5e142ce32ca009cbaea5f0bb
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg
new file mode 100755
index 0000000000000000000000000000000000000000..51c6a5a9865606b4cd332e008cb1ec79b39e7e40
--- /dev/null
+++ b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg
@@ -0,0 +1 @@
+<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m218.1 566.3h368.4v119.1h-368.4z" transform="matrix(.9975 -.0707811 .0707811 .9975 -43.287 30.0417)"/></clipPath><linearGradient id="b"><stop offset="0" stop-color="#a8aaaa"/><stop offset=".06716418" stop-color="#a1a3a3"/><stop offset=".08773019" stop-color="#a8aaaa"/><stop offset=".1178" stop-color="#bcbdbd"/><stop offset=".1535" stop-color="#dcdcdc"/><stop offset=".1766" stop-color="#f4f4f4"/><stop offset=".1785" stop-color="#eff0f0"/><stop offset=".1907" stop-color="#d7d7d7"/><stop offset=".2045" stop-color="#c3c4c4"/><stop offset=".2203" stop-color="#b5b6b6"/><stop offset=".2401" stop-color="#adaeae"/><stop offset=".2761" stop-color="#abacac"/><stop offset=".2957" stop-color="#9a9b9b"/><stop offset=".3202" stop-color="#8f9090"/><stop offset=".3546" stop-color="#888989"/><stop offset=".4502" stop-color="#868787"/><stop offset=".4883" stop-color="#8e8f8f"/><stop offset=".5924" stop-color="#9d9f9f"/><stop offset=".7107" stop-color="#a6a8a8"/><stop offset=".8731" stop-color="#a9abab"/><stop offset=".9627" stop-color="#dcdcdc"/></linearGradient><linearGradient id="c" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-188.9606" x2="-59.2798" xlink:href="#b" y1="1678.3533" y2="1603.4819"/><linearGradient id="d" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1841" x2="-26.456" xlink:href="#b" y1="1696.2814" y2="1600.5984"/><linearGradient id="e" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-180.3568" x2="-42.2597" xlink:href="#b" y1="1695.8671" y2="1616.1365"/><linearGradient id="f" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-163.5929" x2="-66.7436" xlink:href="#b" y1="1682.6437" y2="1626.7278"/><linearGradient id="g" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-173.0439" x2="-37.0958" xlink:href="#b" y1="1698.9542" y2="1620.4646"/><linearGradient id="h" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1338" x2="-12.7169" xlink:href="#b" y1="1720.593" y2="1617.0066"/><linearGradient id="i" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-182.9737" x2="-16.82" xlink:href="#b" y1="1715.4465" y2="1619.5176"/><linearGradient id="j" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-165.1052" x2="-31.8849" xlink:href="#b" y1="1710.3193" y2="1633.4045"/><path d="m417.8 361.5c-2 1.3-4 35-5.5 69.5-1.5-34.6-3.5-68.2-5.5-69.5-4.2-2.8-142.6 4.1-142.6 4.1v134.9s56.9 6.5 148.1 5.8c91.2.7 148.1-5.8 148.1-5.8v-134.8s-138.4-6.9-142.6-4.2z" fill="#0d0905"/><path d="m603.3 547.2c-5.5-36.5-43.2-50.6-61.7-56.1s-49.1-7.6-68.5-18.6c-19.4-11.1-16.3-66.4-16.3-66.4h-41.8-41.9s3.1 55.4-16.3 66.4c-19.4 11.1-50 13.1-68.5 18.6s-49.6 19.7-55.2 56.1c-4.4 29.2-17.6 113.7-17.6 113.7h199.4 199.4c.1.1-6.5-84.5-11-113.7z" fill="#fca65b"/><path d="m369.6 451.1c22.5-4.2 66-18.1 87.2-33.9 0-1.7 0-3.2 0-4.5v-.1c0-.6 0-1.1 0-1.7 0-.1 0-.2 0-.3 0-.4 0-.8.1-1.3 0-.1 0-.2 0-.3 0-.4 0-.7 0-1 0-.1 0-.2 0-.2 0-.3 0-.5 0-.8v-.1c0-.2 0-.3 0-.5s0-.3 0-.3h-41.8-41.9c0-.1 1.4 25.2-3.6 45z" fill="#eb9449"/><path d="m534.2 267.8s17.7-75.4-2.9-117.4c-22.2-45.2-55.4-71.1-116.3-71.1s-94.1 25.8-116.3 71.1c-20.6 41.9-2.9 117.4-2.9 117.4-27.7-5.5-22.5 24.7-13.9 38.4 7.2 11.4 7.3 12.6 11.7 25.1 6.2 18 20.5 5.6 20.5 5.6 8.3 23.1 14.2 28.5 47.3 59.1 28.8 26.6 38.9 26.3 53.5 26.3s24.4.3 53.5-26.3c33.2-30.4 39-36 47.3-59.1 0 0 14.3 12.5 20.5-5.6 4.3-12.5 4.5-13.7 11.6-25.1 8.9-13.7 14.1-44-13.6-38.4z" fill="#f29b50"/><path d="m225 519s-6.4 249-25.4 299.8 71.8 9.2 71.8 9.2l17-36.3s7.9-45.5 7.8-58.4c0-12.8-71.2-214.3-71.2-214.3z" fill="#d31616"/><path d="m608.9 535.4s6.4 208.8 25.4 259.6-81.9 25.4-81.9 25.4l-18.1-42s3.3-15.9 3.3-28.7c.2-12.8 71.3-214.3 71.3-214.3z" fill="#d31616"/><path d="m220.6 575.1c-1.5-34.3-3.9-66.7 31.7-73.2 13.4-2.4 56.6-11.1 56.6-11.1l41-15.2s3.3 64 62.7 64 60.6-67.1 60.6-67.1l58.1 22.8c29 2.3 29.2 4.1 42.5 6.6 32.7 6 37.9 29.2 36.9 62.6-.5 15.3-40.9 134.5-52 225.6-14.3 116.5 17.6 180.3 1.5 197-21 21.7-145.4 20.6-145.4 20.6s-136.4-3.6-153.1-23.6c-17.1-20.6 13.6-122.8-2-225-11.6-75.9-37.7-151.8-39.1-184z" fill="#ea1818"/><path d="m387.8 353.7c-11.6-4 11 18.6 29.3 18s41.4-25.3 26.2-17.9c-5 2.4-12-14.1-21.2-8.9-6.6 3.7-3.4 5.4-9.4-.2-8.1-5.7-16.6 11.8-24.9 9z" fill="#ea1818"/><path d="m364.7 222.9c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m468.5 220.5c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m398.9 159.6s5.5 16.4 6.7 25.7c1.3 9.3 2.3 20.4 2.3 20.4s2.1-7-.3-20.9-8.7-25.2-8.7-25.2z" fill="#261e14"/><path d="m358.3 216.3s-1.5-15.4 4.6-33.1 21.1-21.5 21.1-21.5-10.7 5.9-17.3 21.8c-6.7 15.8-8.4 32.8-8.4 32.8z" fill="#261e14"/><path d="m450.5 202.9s-.7-13.8-8.5-28.5-21.5-16.1-21.5-16.1 10.2 3.8 18.2 16.8 11.8 27.8 11.8 27.8z" fill="#261e14"/><path d="m484.8 475.4s1.2.1 3.3.3c44 11.9 60.7 14.4 92 19.3 17.5-2.2 40.9 21.1 30.6 42.9s-41.6 218.7-41.6 254.5 1.1 183.8 2.5 196.6-91.6 32.4-104.7 18.7c-7.1-7.4 13.5-91.5 34.2-190.2 17.5-83 8.7-188.6 4.8-211.3-8.7-49.6-41.2-86.6-41.2-86.6" fill="#3d4251"/><path d="m612.7 527.9s21.2 250.4 39.5 298.8-77.8 40.3-77.8 40.3l-16.8-98.2s-5.3-42.4-5.3-54.7c-.1-12.1 60.4-186.2 60.4-186.2z" fill="#363a47"/><path d="m280.9 121.7c.1-.4-23.1 40 .2-1.2 13.1-31.2 178.2-53.9 260.2 0 23.8 25.1 39.9 101.5 23.6 109.1-5.8 2.7-25.3-25.7-55.4-46.8-8.4-5.9-33.2-23.6-98.1-23.6s-89.7 17.7-98.1 23.6c-30.1 21.1-43.4 52.1-49.3 49.3-15.9-7.5-8.9-66.7 16.9-110.4z" fill="#474b56"/><path d="m348.9 482.4s-4.2-4.3-6.3-4.1c-44 11.9-57.7 18.8-89 23.7-17.5-2.2-40.9 21.1-30.6 42.9s41.6 218.7 41.6 254.5-8.9 168.7-10.4 181.5 90.2 38.3 103.3 24.7c7.1-7.4 2.1-94-18.7-192.7-17.5-83-15.1-177-11.1-199.7 8.7-49.6 41.2-86.6 41.2-86.6" fill="#3d4251"/><path d="m221 534.9s-33.4 200.8-40.4 283.7c-2.3 41.2 95.7 21.2 95.7 21.2l-2.7-54.3s14.7-33.9 14.7-46.2-67.3-204.4-67.3-204.4z" fill="#363a47"/><path d="m404.3 268.8h25.1v10.2h-25.1z" fill="#4189c6"/><path d="m553.6 182.8c-34.2-120.3-137.8-120.3-137.8-120.3s-103.6 0-137.9 120.2c-2.9 10.1-.3 24.3-7.1 36.8-49.1 89.1 9.6 380.1 13.7 380.7 1.2-7.3 2.3-20.1 2.3-20.1l2.1 19.6c5.5.4 12.9.7 18.5.2l.2-27.7 4.6 26.6c5.2-.7 17.2-2.1 22.1-3.1l-.5-12.7 4.8 11.9c19-4.7-9.1-359.4-9.1-359.4s17.6-.8 27.6-2l3.9-16 3.7 15.1c4.4-.4 9.1-.9 13.8-1.4l7.5-38.7 5.3 37.4c7.8-.6 19.9-1.4 24.6-1.4h.1l3-22.2 4.7 22.4c10.5.5 25.2 1.9 38.3 3.3l3-37.5 4.9 38.3c12.4 1.4 32.3 2.5 32.3 2.5s-21.8 352.7-6.3 355.7l9.9-33.3-4.5 34.3c6.8 1.2 14.2 2.2 21.8 2.8l6-20.5 2.1 20.9c12.5.4 82.3-278.9 29.6-378.8-6.3-11.1-4.5-24.2-7.2-33.6z" fill="#1c140a"/><path d="m396.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m500.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m289.6 113.8c.1-.4.1-.7.2-1.1 5.5-20.3 14.6-35.1 26.4-46.7.3-.4.6-.8 1-1.2 16-17.4 21-19.7 27.7-30.6s15.4-20.8 34.7-20.1c10.2.4 10.6 3.2 28.4 2.6 19.9-.6 30-2.9 36.3 0 10.7 4.9 8.3 8 38.7 29.6 6.3 4.5 13 9.7 18.6 16.2 19.6 19 30.5 50.2 30.5 50.2 24.7 40.7 34.4 96.6 19.3 103.6-5.4 2.5-20.9-26.2-48.9-45.8-7.8-5.5-30.9-21.9-91.4-21.9-60.4 0-83.6 16.4-91.4 21.9-28 19.6-38.1 48.2-43.6 45.6-14.8-6.9-10.7-61.7 13.5-102.3z" fill="#3d4251"/><path d="m291.2 106.5c2.2-6.8 3.5-10.2 5.4-13.8 1-.4 11.5-5.4 12.6-5.8 34.9-14.4 83.8-15.5 98-15.5h4.3 4.2c13.9 0 61.7 0 109.3 24.3 2 4.3 4.3 9.3 4.3 9.3 1 2.2 1.4 3.4 2.2 5.4-3.1-8-22.5-14.2-33.1-18.6-31.7-13.1-61.2-12.4-82.7-13.6-2.4-.1-3.8 0-3.9 0h-.3-.5c-.1 0-1.5 0-3.9 0-13.1 0-58.3 1-89.9 14.1-10.7 4.4-20.5 9.9-26.6 16.1" fill="#474b56"/><path d="m471.8 470.6c15.8 23.9 13.3 52.2-6.3 64.5s-49.1 4.1-67.6-18.1z" fill="#d31616"/><path d="m349.9 475.5c-12.3 30.7-8.8 60.9 8.7 68.7 17.5 7.9 42.4-9.5 57.2-39.1z" fill="#d31616"/><path d="m427.7 529.6s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m412.5 522.2c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m229.2 671.5 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l120-138.2c4.3-5 3.8-12.6-1.2-16.9l-236.2-205c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e1e1e1"/><path clip-path="url(#a)" d="m230.1 672.2 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l119.9-138.3c4.3-5 3.8-12.6-1.2-16.9l-236.1-204.9c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e6e6e6"/><path d="m462.9 875.1-232.6-201.7c-.5-.4-.5-1.2-.1-1.6l.2-.2c.4-.5 1.2-.5 1.6-.1l232.5 201.7c.5.4.5 1.2.1 1.6l-.2.2c-.3.5-1.1.5-1.5.1z" fill="#b2b1b1"/><circle cx="415.2" cy="695.8" fill="#ededed" r="22.6"/><path d="m374 673.3c.7-.8 1.5-1.4 2.5-2 1-.5 2.1-.9 3.2-1.2 1.2-.2 2.4-.3 3.6-.2 1.3.1 2.5.4 3.7.9-.1-.8-.2-1.6-.3-2.4 0-.8 0-1.6.1-2.3s.2-1.4.4-2 .5-1.2.9-1.6c.5-.6 1.1-1.1 1.6-1.5.6-.4 1.2-.7 1.8-1s1.2-.4 1.9-.5c.6-.1 1.2-.1 1.8-.1.6.1 1.1.2 1.6.4s1 .5 1.3.8c.5.4.9 1 1.1 1.7s.3 1.5.2 2.4-.5 1.9-1 3c-.6 1.1-1.4 2.3-2.5 3.6-.8.9-1.6 1.8-2.4 2.6s-1.6 1.5-2.4 2.2c.2.5.3 1 .5 1.6.2.5.4 1 .5 1.6 0 .1.1.2.1.4.1.2.1.3.2.5 0 .2.1.3.1.4s0 .2-.1.3c0 .1-.1.1-.2.1s-.2 0-.3 0-.2 0-.3 0-.2 0-.2-.1c-.1 0-.3-.1-.4-.3-.3-.3-.6-.7-1-1.2-.3-.5-.7-1.1-1-1.7-1.2.8-2.3 1.5-3.4 2.1s-2.2 1-3.2 1.4c-1 .3-2 .6-2.9.7s-1.8.1-2.5.1c-.8-.1-1.5-.2-2.1-.5-.6-.2-1.1-.5-1.6-.9s-.8-.8-1-1.4c-.2-.5-.3-1.1-.3-1.7s.2-1.3.5-1.9c.4-.9.8-1.6 1.5-2.3zm1.7 2.5c-.5.6-.8 1.1-.8 1.6s.1.9.5 1.2.9.5 1.7.6 1.7 0 2.8-.3 2.3-.8 3.7-1.5 2.8-1.6 4.4-2.9l-.1-.5c-.7-.4-1.4-.7-2.2-.9s-1.6-.3-2.3-.3c-.8 0-1.6.1-2.3.2-.8.1-1.5.3-2.2.6-.7.2-1.3.5-1.8.9-.7.5-1.1.9-1.4 1.3zm15.1-11.9c-.4.5-.7 1-.9 1.6s-.3 1.3-.3 2.1 0 1.6.1 2.4c.1.9.3 1.8.5 2.7.8-.7 1.6-1.5 2.4-2.3s1.7-1.7 2.5-2.7c.6-.7 1-1.3 1.4-1.8.3-.5.5-1 .6-1.4s.1-.8 0-1.1-.2-.5-.5-.7c-.2-.2-.5-.3-.8-.4s-.6-.1-1-.1-.7 0-1.1.1-.8.2-1.1.4c-.4.2-.7.3-1.1.6-.2 0-.5.3-.7.6z" fill="url(#c)"/><path d="m408.7 688.3c-.8.5-1.5 1-2.2 1.6-.6.5-1.2 1-1.6 1.4-.3.4-.5.8-.5 1.1 0 .4.1.7.5 1 .1.1.4.2.6.3.3.1.6.2 1 .2s.9.1 1.5.1 1.2 0 1.9-.1c0 0 0 .2-.1.3 0 .1-.1.4-.2.7s-.3.7-.4 1.2c-.8.1-1.6.1-2.3.1s-1.4-.1-2-.2-1.2-.3-1.6-.5c-.5-.2-.9-.4-1.2-.7-.4-.3-.6-.7-.8-1.1s-.3-.8-.3-1.3.1-.9.3-1.4.5-1 .9-1.5c.1-.2.3-.4.6-.6s.6-.5.9-.7c.3-.3.7-.5 1.2-.8.4-.3.9-.6 1.4-.9-.8-.6-1.6-1.1-2.4-1.7-.8-.5-1.5-1.1-2.3-1.6-.6.3-1.1.7-1.7 1s-1.1.6-1.6.9-.9.5-1.4.8c-.4.2-.8.4-1.1.6-.8.4-1.5.6-1.9.6-.5 0-.8-.1-1-.2-.1-.1-.3-.3-.3-.4-.1-.2-.2-.3-.2-.5s0-.3 0-.5.1-.3.3-.5c.1-.1.2-.2.3-.2 1-.7 2-1.3 3-1.9s2-1.1 2.9-1.6c-.3-.3-.6-.6-.8-.9s-.4-.6-.6-.9c-.1-.3-.2-.7-.2-1.1s.1-.8.2-1.2c.1-.1.1-.2.2-.3s.1-.2.2-.3c.2-.3.4-.3.6-.1.1.1.2.3.2.5s0 .6 0 1c.3.2.6.4.8.7.3.2.6.5.9.7l.8.7c.7-.4 1.3-.7 1.9-1s1.2-.7 1.8-1c.4-.2.7-.5 1-.7.3-.3.6-.5.8-.8.2-.2.4-.4.5-.7.1-.2.2-.4.2-.7 0-.2 0-.4-.1-.6s-.2-.4-.4-.6c-.2-.1-.4-.3-.7-.4s-.6-.3-1-.4-.8-.2-1.3-.3-1.1-.1-1.7-.1c-.2 0-.4 0-.6-.1s-.3-.1-.4-.2c0 0 0-.1.1-.3s.3-.4.5-.6c.3-.3.6-.5.9-.7l1.2-.3c.4 0 .9 0 1.3.1.5.1.9.2 1.4.3.4.2.8.3 1.2.5s.7.4 1 .7c.4.3.7.7 1 1.2.3.4.4.9.5 1.4s0 1-.2 1.5-.5 1.1-1 1.6c-.2.3-.5.5-.9.9-.4.3-.8.7-1.3 1-.5.4-1 .7-1.6 1.1s-1.2.8-1.8 1.1c.6.5 1.3 1 2.1 1.6s1.5 1.2 2.3 1.8c1.1-.7 2.3-1.4 3.5-2.1s2.5-1.4 3.7-2c.4-.2.8-.3 1.2-.3s.7.1 1 .4c.1.1.2.2.3.4.1.1.1.3.2.4v.4c0 .2-.1.3-.3.5-.1.1-.3.3-.4.4-.2.2-.4.3-.6.4-.4.2-.9.5-1.4.8s-1 .6-1.5.9-1.1.6-1.6.9-1.1.6-1.6 1c.4.3.7.5 1 .8.3.2.5.4.6.5.1 0 .1.1.2.1s.1.1.2.1c.2.1.3.3.4.4s.1.2.1.4 0 .2-.1.3-.1.2-.2.3-.2.2-.3.2-.2 0-.4 0c-.1 0-.2-.1-.3-.1-.1-.1-.2-.1-.3-.2-.2-.1-.3-.2-.4-.3s-.1-.1-.2-.1h-.1s0 0-.1 0c0 0-.1-.1-.2-.1-.1-.1-.2-.2-.4-.3-.2-.2-.4-.3-.7-.5-.1-.4-.3-.6-.5-.7z" fill="url(#d)"/><path d="m413.7 700.7c-.4 0-.8 0-1.3-.1s-1-.1-1.5-.3c-.5-.1-1-.3-1.5-.5s-.9-.4-1.2-.7-.5-.5-.6-.8-.2-.5-.2-.8.1-.5.2-.8.3-.5.5-.8c.3-.4.7-.7 1.2-1.1s1-.8 1.6-1.2 1.1-.8 1.7-1.2 1.1-.8 1.6-1.1c.2-.1.4-.2.6-.2s.4 0 .6.1.4.2.6.3.4.2.5.3c.2.2.4.4.4.6s-.1.3-.2.5c-.1.1-.3.3-.6.5s-.6.4-.9.6-.7.5-1.1.7c-.4.3-.8.5-1.2.8s-.7.5-1.1.8c-.3.3-.6.6-.9.8-.2.3-.4.5-.4.7-.1.2 0 .4.2.5.2.2.5.3.9.4s.8.1 1.2.1h1.3s.8 0 1.1 0zm3.8-12.1c.1-.1.3-.3.5-.4s.4-.2.7-.2.5 0 .8.1.6.3.9.5c.2.2.4.4.5.6l.3.6v.6c-.1.2-.2.4-.4.6s-.4.4-.6.5-.5.2-.7.2c-.3 0-.5 0-.8-.1s-.6-.3-.9-.5c-.5-.4-.8-.9-.8-1.3s.1-.9.5-1.2z" fill="url(#e)"/><path d="m416.3 703.5c.6.5 1.2.9 1.7 1.2.6.3 1.1.5 1.7.7.6.1 1.1.2 1.6.2s1.1 0 1.6-.1l-1.6 2c-.4.1-.8.1-1.2.1s-.9-.1-1.3-.2-.9-.3-1.3-.5-.8-.4-1.1-.7l-.1-.1c-.1-.1-.1-.2-.3-.3-.1-.2-.3-.4-.5-.7s-.6-.7-1-1.2l-.1.2c-.9 1-1.8 1.9-2.7 2.6s-1.8 1.2-2.6 1.6-1.5.5-2.2.5-1.2-.2-1.6-.5c-.3-.3-.5-.6-.6-.9s-.1-.7 0-1.1.3-.8.6-1.2.6-.8.9-1.2c.2-.2.5-.5.8-.7s.7-.5 1.1-.7.8-.4 1.3-.6c.4-.2.9-.4 1.3-.6 1-.4 2.1-.8 3.3-1.1.4-.4.9-.8 1.4-1.2s.9-.8 1.4-1.1c.5-.4 1-.7 1.5-.9.5-.3 1-.4 1.5-.5s1-.1 1.5 0 1 .4 1.4.8c.3.3.6.6.9 1 .2.4.4.7.4 1.2 0 .4 0 .8-.2 1.3-.2.4-.4.9-.9 1.4-.3.4-.7.7-1.1 1s-.9.5-1.4.6-1.1.2-1.7.1c-.6 0-1.3-.2-2-.4zm-8.7 1.8s-.1.1-.2.2-.1.3-.2.4c0 .1-.1.3-.1.4s.1.3.2.4.2.1.4 0 .3-.1.5-.3c.2-.1.4-.3.6-.5s.4-.4.6-.6.4-.4.6-.7.4-.4.5-.6c.3-.3.5-.5.7-.8.2-.2.4-.4.5-.5.1-.2.3-.3.4-.4-.3.1-.6.2-.9.4s-.6.3-1 .5c-.3.2-.6.4-.9.6s-.6.4-.8.6c-.3.2-.5.3-.6.5s-.2.3-.3.4zm8.4-3.6c.5.1 1 .2 1.4.2s.8 0 1.2-.1.8-.2 1.1-.4.7-.3 1-.6c.1-.1.3-.2.4-.4.2-.2.3-.3.4-.5s.1-.4.1-.6-.1-.4-.3-.5c-.2-.2-.4-.3-.7-.3s-.5 0-.8.1-.6.3-.9.5-.6.4-1 .7c-.3.3-.6.6-1 .9-.3.3-.7.7-.9 1z" fill="url(#f)"/><path d="m421.4 704.8h1.4s.7 0 .9-.1c.3 0 .5-.1.8-.1.3-.1.5-.1.9-.2.3-.1.8-.2 1.3-.3s1.1-.2 1.9-.4c.2 0 .3-.1.5-.1s.4 0 .5 0c.2 0 .4.1.5.1.2.1.3.2.5.3.3.2.5.5.6.6.1.2.1.4.1.5s0 .3-.1.4-.1.2-.2.3-.3.2-.6.3-.5.1-.8.2c-.3 0-.5.1-.7.1s-.4.1-.5.1c-.2.2-.3.3-.4.5s-.2.3-.3.5-.2.4-.3.6-.2.4-.3.7c-.1.2-.3.5-.5.8s-.5.6-.8 1c.3 0 .7.1 1 .2s.7.2 1 .3c.4.1.7.2 1.1.3s.8.2 1.3.2l-1.7 1.9c-.6 0-1.2-.1-1.9-.3s-1.3-.4-2-.6c-.7-.3-1.3-.6-1.9-.9s-1.2-.7-1.6-1.1c-.3-.3-.6-.6-.9-.9-.2-.3-.4-.6-.5-1-.1-.3-.1-.7-.1-1 .1-.3.2-.7.4-1-.1-.1-.2-.1-.3-.2s-.2-.1-.2-.2c-.1-.1-.2-.2-.2-.2-.1-.1-.1-.2-.1-.2 0-.1 0-.2 0-.3s.1-.2.3-.4c.1-.1.3-.2.4-.3.2-.1.3-.1.5-.1s.3 0 .5 0zm.1 2.1c.1.1.1.2.1.3v.5s.1.4.1.6c.1.2.2.4.4.6s.4.3.6.4.4.1.6 0c.2 0 .4-.1.6-.3.2-.1.3-.3.5-.5.1-.2.3-.3.4-.5s.2-.4.3-.5c.1-.2.2-.3.3-.5s.1-.3.2-.4z" fill="url(#g)"/><path d="m435 719c-.8-.2-1.6-.3-2.2-.4s-1.2-.3-1.7-.4-.9-.3-1.2-.4-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.4s-.1-1.2.2-1.9c.2-.7.6-1.4 1.1-2.2s1.1-1.6 1.9-2.5c.3-.3.6-.7 1-1.1l1.1-1.1c-.2-.2-.3-.3-.3-.4-.1-.1-.2-.2-.2-.3-.1-.1-.2-.2-.3-.4s-.4-.4-.6-.7c-.1-.1-.2-.3-.2-.4s0-.2 0-.3.1-.2.1-.3c.1-.1.1-.1.2-.2s.2-.2.4-.1c.2 0 .3.1.5.2s.4.3.6.5.4.4.6.5c.2.2.4.3.5.5.1.1.3.2.3.3.8-.6 1.7-1.2 2.5-1.7.9-.5 1.7-.9 2.5-1.2s1.5-.5 2.1-.5 1.2.1 1.5.4c.2.2.4.5.5.8s.1.6 0 1-.2.7-.4 1.1-.4.7-.7 1.1c-.2.3-.5.5-.9.8s-.7.5-1.2.7c-.4.2-.9.4-1.3.6-.5.2-1 .3-1.4.5 0 .1.1.1.2.2s.3.2.4.4c.2.1.3.3.5.5s.3.3.5.5.3.3.5.4c.1.1.3.2.4.3s.1.2.1.4-.1.3-.3.5-.4.3-.6.3-.4 0-.5-.1l-3.3-2.9c-.4.1-.7.2-1.1.2-.4.1-.7.1-1 .2-.3.3-.7.7-1 1-.1.1-.3.3-.4.4-.1.2-.3.3-.4.5-.1.1-.3.3-.4.4s-.2.3-.3.4c-.3.3-.5.6-.6.9s-.2.5-.2.7 0 .4.1.6.3.4.4.5.3.2.5.3.5.2.8.3.6.2 1 .2c.4.1.7.1 1.1.2.4 0 .7.1 1.1.1s.7 0 1.1-.1zm6.7-13.2.2-.2c.1-.1.1-.2.1-.3s0-.2 0-.3-.1-.2-.2-.3-.4-.1-.8 0-.8.3-1.3.6-1 .6-1.6 1c-.5.4-1.1.8-1.6 1.1.1.1.2.2.2.3.1.1.2.2.2.3.4-.1.9-.3 1.4-.5s.9-.4 1.4-.6c.4-.2.8-.4 1.2-.6.4-.1.6-.3.8-.5z" fill="url(#h)"/><path d="m436 723.3c-.5-.5-.9-1-1.2-1.5-.2-.5-.3-1.1-.3-1.7s.1-1.1.4-1.7c.2-.5.6-1.1 1-1.5.3-.3.6-.6 1-.9s.8-.6 1.2-.8.9-.4 1.3-.6c.5-.1.9-.2 1.4-.2s.9.1 1.4.2c.4.1.9.4 1.3.7.3.3.6.6.8.9s.3.7.3 1.1 0 .7-.1 1.1-.3.7-.6 1c-.3.4-.7.6-1.2.8s-1 .3-1.6.4c-.6 0-1.2 0-1.8-.1s-1.3-.3-1.9-.6c0 .2-.1.4-.1.6v.5c0 .1.1.2.2.4l.3.3c.3.3.8.5 1.3.7s1 .3 1.6.4c.5.1 1.1.2 1.6.2s1 0 1.4 0l.1 2.1c-1 .1-1.9.1-2.8 0-.4 0-.8-.1-1.2-.2s-.9-.2-1.3-.3-.8-.3-1.2-.5c-.6-.3-1-.6-1.3-.8zm2.3-5.1c.2.2.5.3.8.4s.7.2 1 .2c.4 0 .7 0 1-.1s.5-.2.7-.4c.2-.3.4-.5.4-.8s0-.4-.1-.5c-.2-.2-.5-.3-.7-.4-.3-.1-.5-.1-.7 0-.2 0-.5.1-.7.3-.2.1-.4.3-.7.4-.2.2-.4.3-.5.5-.2.2-.4.3-.5.4z" fill="url(#i)"/><path d="m441.4 724.8c.2-.3.5-.5.8-.8s.7-.6 1-1 .8-.7 1.2-1 .8-.6 1.2-.9.7-.5 1.1-.8c.3-.2.6-.4.8-.5s.3-.1.4-.2h.3c.1 0 .2 0 .3.1s.2.2.3.3.3.2.3.3c.1.1.1.2.1.3s-.1.2-.1.3c-.1.1-.2.3-.4.4-.2.2-.4.5-.7.8s-.5.6-.8.9l.1.1c.3-.1.7-.3 1.1-.4.4-.2.8-.3 1.2-.4s.8-.1 1.2-.1.7.2 1.1.5l.3.3c.1.1.1.3.1.4v.4c0 .1-.1.3-.2.4s-.2.2-.4.4c-.2.1-.4.3-.6.5s-.4.3-.6.5-.3.3-.4.4c-.2.2-.3.4-.4.6s-.1.3-.1.5c0 .1 0 .3.1.4s.1.2.2.3c.3.2.6.4.9.5.4.1.7.2 1.1.3s.8.1 1.3.1l-1.9 1.9c-.2 0-.5-.1-.8-.1s-.6-.1-.9-.2-.6-.2-.9-.3-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.2s-.1-.8 0-1.2.3-.8.5-1.2.5-.8.7-1.2l-.1-.1-5.2 2.9c-.3.2-.5.3-.7.4s-.4.1-.5.2c-.2 0-.3 0-.4 0s-.2-.1-.3-.2c-.2-.2-.4-.4-.4-.6-.1-.2 0-.5 0-.7.1-.2.2-.5.3-.7 0-.6.2-.9.4-1.1z" fill="url(#j)"/><path d="m638.7 781s-176.3-27.6-228.3-54.7c-66.8-6.7-22.1 54.2-22.1 54.2l149 51.6s67.8 33.9 81.5 35.1c13.7 1.3 19.9-86.2 19.9-86.2z" fill="#eb9449"/><path d="m400.5 780.8s-61.6 12.8-74.9 5.1-35.9-20.1-35.3-35.1c.7-15 21.6-58.5 40.6-58.3s86 39.7 86 39.7z" fill="#fca65b"/><path d="m620.4 877.8s21.8-31.8 25.7-44c4-12.2 3.3-50.8 3.3-50.8l-66.8-15.2s-24.6 38.4-27.1 49.6c-2.6 11.2.6 43.4.6 43.4z" fill="#d31616"/><path d="m274.6 739.1s181.5-16.3 234.3-41.9c66.9-4.8 20.6 54.8 20.6 54.8l-150.5 47.4s-85.4 26.6-99.1 27.5c-13.6.8-5.3-87.8-5.3-87.8z" fill="#eb9449"/><path d="m493.1 758.6s61.4 17.7 74.6 10.4 35.6-18.9 34.8-34.8c-.7-15.8-21.9-63.2-40.7-64.3-18.8-1-84.7 38.3-84.7 38.3z" fill="#fca65b"/><path d="m246.1 746.8s-1.7 38.5 1.4 51 24 44.9 24 44.9l64.8-22.3s.6-45.5-3.1-56.4-23.4-36.6-23.4-36.6z" fill="#d31616"/><g fill="#333"><path d="m503.4 780.3c-.7-.5-1.2-.9-1.6-1.3s-.7-.7-.9-1-.3-.6-.4-.9c0-.3 0-.6.1-1 .1-.3.3-.6.5-.7.2-.2.5-.3.7-.3.3-.1.6-.1.9-.1s.7 0 1.1-.1h.4c.2 0 .5-.1.9-.1s.8-.1 1.2-.1c.5 0 .9-.1 1.4-.1.4 0 .9-.1 1.2-.1h.9c.1 0 .3 0 .4.1.2 0 .3.1.4.2s.1.2.2.3c0 .1.1.3.1.4v.4.3s0 .1 0 .1c-.1.2-.2.4-.3.5-.2.1-.3.1-.6.1l-7.6.1 5 3.8c.1.1.2.2.3.3s.2.3.3.4c.1.2.1.3.2.5v.6c-.1.2-.2.3-.4.4s-.4.1-.7 0c-.2-.1-.5-.2-.8-.4s-.6-.4-.8-.6c-.3-.2-.6-.5-.9-.7-.6-.5-.9-.8-1.2-1z"/><path d="m509.6 787.2c.2-.8.6-1.5 1.2-2.2.5-.7 1.2-1.4 2-1.9.8-.6 1.6-1 2.6-1.3.9-.3 1.9-.5 3-.5-.4-.5-.7-1.1-1-1.7s-.5-1.1-.7-1.7-.3-1.1-.3-1.6 0-1 .1-1.5c.2-.6.4-1.1.7-1.6s.6-.9 1-1.3.8-.7 1.2-1 .9-.5 1.3-.6.9-.2 1.3-.3c.4 0 .8 0 1.2.1.5.2 1 .4 1.4.9.4.4.7 1 .9 1.7s.3 1.5.2 2.5-.3 2.1-.7 3.4c-.3.9-.6 1.8-.9 2.6s-.7 1.6-1 2.3c.3.3.6.6.9 1 .3.3.6.6.9 1 .1.1.1.2.2.2l.3.3s.2.2.2.3c.1.1.1.2.1.2 0 .1-.1.1-.1.1-.1 0-.1.1-.2.1s-.2.1-.2.1c-.1 0-.1 0-.2 0s-.2 0-.4 0c-.3-.1-.7-.3-1.1-.5-.4-.3-.8-.6-1.3-.9-.6 1-1.2 1.9-1.8 2.6-.6.8-1.3 1.5-1.9 2-.6.6-1.3 1.1-1.9 1.4-.6.4-1.2.7-1.8.9s-1.1.3-1.7.3c-.5 0-1 0-1.4-.2-.5-.1-.8-.4-1.2-.7-.3-.3-.6-.7-.8-1.1-.2-.5-.3-1-.3-1.6-.1-.4 0-1.1.2-1.8zm2.1 1.2c-.2.6-.2 1.1-.1 1.4.1.4.4.6.8.7s.9.1 1.4-.1c.6-.2 1.2-.6 1.9-1.1.7-.6 1.4-1.3 2.2-2.2s1.5-2.1 2.3-3.5l-.3-.3c-.6-.1-1.2 0-1.9.1-.6.1-1.2.3-1.8.6s-1.1.6-1.6.9c-.5.4-1 .7-1.4 1.1s-.8.8-1 1.2c-.2.5-.4.9-.5 1.2zm7.1-13.5c-.1.5-.2.9-.1 1.5.1.5.2 1.1.4 1.6.2.6.5 1.1.9 1.7s.8 1.2 1.3 1.8c.3-.8.7-1.6 1-2.5s.6-1.8.9-2.8c.2-.7.3-1.3.4-1.8s.1-.9 0-1.3c-.1-.3-.2-.6-.3-.8-.2-.2-.3-.3-.6-.4-.2-.1-.4-.1-.7 0-.3 0-.5.1-.8.2s-.5.3-.8.5-.5.4-.7.6-.4.5-.6.7c-.1.4-.2.7-.3 1z"/><path d="m539.7 786.8c-.4.6-.8 1.3-1.1 1.8-.3.6-.5 1.1-.7 1.5-.1.4-.1.7 0 1s.3.5.7.6c.1 0 .3.1.6 0 .2 0 .5-.1.8-.2s.7-.2 1.1-.4.9-.4 1.4-.7v.3.6c0 .2 0 .6.1 1-.6.3-1.1.6-1.7.8-.5.2-1.1.4-1.5.5-.5.1-.9.2-1.3.2s-.8 0-1.1-.1c-.4-.1-.7-.3-.9-.5-.3-.2-.5-.5-.6-.8s-.2-.7-.3-1.1c0-.4 0-.9.2-1.4.1-.2.1-.4.2-.6s.2-.5.4-.8.4-.6.6-1 .4-.7.7-1.1c-.8-.2-1.6-.3-2.3-.4s-1.5-.3-2.2-.4c-.3.4-.6.9-.9 1.3s-.6.8-.9 1.2-.5.7-.7 1-.4.6-.6.8c-.5.5-.9.9-1.2 1-.3.2-.6.2-.8.2-.1 0-.3-.1-.4-.2s-.2-.2-.3-.3-.1-.2-.2-.4c0-.1 0-.3 0-.4s.1-.2.1-.3c.5-.8 1-1.6 1.6-2.3.5-.7 1.1-1.4 1.6-2.1-.3-.1-.6-.2-.9-.4-.3-.1-.5-.3-.7-.5s-.4-.4-.5-.7-.2-.6-.2-1c0-.1 0-.2 0-.3s0-.2.1-.2c.1-.3.2-.4.4-.3.1 0 .2.1.3.3s.2.4.3.7c.3.1.5.1.8.2l.9.3.8.3c.4-.5.7-.9 1.1-1.4.3-.4.7-.9 1-1.3.2-.3.4-.6.5-.8.2-.3.3-.6.4-.8s.1-.4.1-.6 0-.4-.1-.5c-.1-.2-.1-.3-.3-.4-.1-.1-.3-.2-.5-.3s-.4-.1-.6-.1-.5 0-.8.1c-.3 0-.7.1-1.1.2s-.8.3-1.3.5c-.2.1-.3.1-.4.1s-.2 0-.3 0c0 0-.1-.1 0-.3 0-.2.1-.4.1-.6.1-.3.2-.6.5-.8.2-.2.5-.4.8-.6s.6-.3 1-.4.7-.2 1.1-.2h1.1c.3 0 .7.1.9.2.4.1.8.3 1.1.5s.6.5.8.8.3.7.4 1.1c0 .4 0 .9-.2 1.5-.1.3-.2.6-.4.9-.2.4-.4.7-.6 1.2-.2.4-.5.9-.8 1.3-.3.5-.6.9-.9 1.4.6.1 1.3.3 2 .5.8.2 1.5.4 2.3.6.6-.9 1.2-1.8 1.9-2.7s1.3-1.8 2-2.7c.2-.3.5-.5.8-.6s.6-.2.9-.1c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.1.3s0 .3 0 .4-.1.3-.2.5-.2.3-.3.5c-.2.3-.5.7-.8 1-.3.4-.6.7-.8 1.1-.3.4-.6.8-.9 1.2s-.6.8-.8 1.2c.4.1.7.2 1 .2.3.1.5.1.6.1s.1 0 .2 0h.2c.2.1.3.1.4.2s.2.1.2.2.1.2.1.3 0 .2-.1.3c0 .1-.1.2-.2.3s-.2.1-.3.1-.2 0-.3 0-.2 0-.3 0c-.2 0-.3-.1-.4-.1s-.1 0-.2 0c0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2 0s-.2 0-.4-.1c-.2 0-.4-.1-.6-.1-.1-.4-.3-.4-.5-.5z"/><path d="m550.5 794.5c-.4 0-.8 0-1.1.1-.4 0-.8.1-1.1.1-.4 0-.7 0-1 0s-.6 0-.9-.1-.5-.2-.6-.4-.2-.4-.1-.5c.1-.2.1-.3.2-.5.1-.1.2-.3.3-.3.1-.1.2-.2.3-.2.1-.1.2-.1.3-.1l6.6-.4-5.7-3.7c-.2-.1-.3-.3-.4-.4s-.1-.3 0-.5c0 0 0 0 0-.1s.1-.2.1-.2c.1-.1.1-.2.2-.3l.3-.3s.2-.1.3-.2h.4c.1 0 .2.1.4.2s.4.3.7.5.6.4.9.7c.3.2.6.5.9.7s.6.5.8.7c.3.2.5.4.6.5s.2.2.3.2c.3.2.6.5.8.7.3.2.5.4.7.6s.3.4.4.7c.1.2.1.5 0 .8s-.3.6-.4.9c-.2.2-.5.4-.8.6-.3.1-.8.3-1.3.3-.6-.2-1.2-.1-2.1-.1z"/></g><ellipse cx="365.00674" cy="268.59839" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m373.36754 271.42775c-1.1 4.10001-5.6 6.4-10.1 5.2-3.3-.89999-5.6-3.5-6.1-6.39999.4.39999.9.69999 1.5.89999 1.8.5 3.7-.5 4.2-2.1.5-1.69999-.6-3.5-2.5-4-.7-.19999-1.5-.19999-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.30001 6.1 9.4z" fill="#333"/><ellipse cx="465.42307" cy="269.16895" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m473.78386 271.42775c-1.1 4.1-5.6 6.4-10.1 5.2-3.3-.9-5.6-3.5-6.1-6.4.4.4.9.7 1.5.9 1.8.5 3.7-.5 4.2-2.1.5-1.7-.6-3.5-2.5-4-.7-.2-1.5-.2-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.3 6.1 9.4z" fill="#333"/></svg>
\ No newline at end of file
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png
new file mode 100755
index 0000000000000000000000000000000000000000..24baf78ce8326c3c2756f10ebed90829d0bddf30
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png
new file mode 100755
index 0000000000000000000000000000000000000000..7b25f52f93d109da2df18f8442ef2104a6e14b8f
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png
new file mode 100755
index 0000000000000000000000000000000000000000..e89e120c2f015ccb140678ffff8ccbacb1ae1f20
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png
new file mode 100755
index 0000000000000000000000000000000000000000..3c0e6cb9af31e2e46d9e9b6c8cec99c0d4c5e5c6
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg
new file mode 100755
index 0000000000000000000000000000000000000000..cc0d01f1ea00f8c4b12b2318363f398766cf64d4
--- /dev/null
+++ b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg
@@ -0,0 +1 @@
+<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m487.4 224.4s22.2 223.1-23.5 212.7c-27.6-6.3 8.8.1-69.6-41.2-64.6-34-129.8-110.9-146.5-141-10.1-18.2-8.5-87.6 48.5-127.4s127.3-65.3 201.3-25.8z" fill="#d4410d"/><path d="m471.5 172.3-54.6 207.7 108.9 56.4s37.7-8.4 36.4-35.4c-1.3-26.9-13.7-18.4 12.9-61.9 26-42.7 17.9-78 13.4-122.4-3.9-38.4-28.3-72.7-30.9-96.9-2.7-24.2-29.6-76.7-86.1-76z" fill="#d4410d"/><path d="m212.9 520.4c6.2-40.9 39.1-58.7 61.9-63 24.6-4.6 51.7-4.7 73.5-17.1 21.7-12.4 21.6-78.3 21.6-78.3h47 46.9s-3.5 62.1 18.3 74.5 56.1 14.7 76.8 20.9 55.7 22.1 61.9 63c5 32.8 9.8 104.5 9.8 104.5l-213.9 2.9-207.7 4.4s-1.1-79.1 3.9-111.8z" fill="#f2b181"/><path d="m468 412.5c-25.3-4.7-74.1-20.3-97.9-38.1 0-1.9 0-3.5 0-5.1 0-.1 0-.1 0-.1 0-.7 0-1.3 0-1.9 0-.1 0-.3 0-.4 0-.5 0-1 0-1.4 0-.1 0-.2 0-.3 0-.4 0-.8 0-1.1 0-.1 0-.2 0-.2 0-.3 0-.6 0-.9 0 0 0-.1 0-.2 0-.2 0-.4 0-.5 0-.2 0-.3 0-.3h47 46.9c-.1-.1-1.7 28.3 4 50.5z" fill="#eb9850"/><path d="m283.2 206.8s-20.1-31.2 3-78.3c24.8-50.7 59.9-84.7 128.3-84.7 68.3 0 107.8 34 132.7 84.7 23.1 47.1 3.4 78.3 3.4 78.3 31.1-6.2 25.3 27.8 15.5 43.1-8 12.7-8.2 14.1-13.1 28.1-6.9 20.2-23 6.2-23 6.2-9.3 25.9-15.9 32-53.1 66.3-32.4 29.8-43.7 29.5-60.1 29.5s-27.4.4-60.1-29.5c-37.3-34.1-43.8-40.4-53.1-66.3 0 0-16.1 14-23-6.2-4.9-14-5-15.4-13.1-28.1-9.6-15.4-15.4-49.3 15.7-43.1z" fill="#f2b181"/><path d="m212.9 520.4c6.2-40.9 37.1-58.7 61.9-63 13.7-2.4 32.9-4.7 50-10.9 7.6-2.7 29-13.7 29-13.7l23.6 34.4h78.7l23.7-34.4s21.5 11 29 13.7c17.2 6.2 36.7 6.9 50 10.9 20.7 6.2 55.7 22.1 61.9 63 5 32.8 45.8 223.2 45.8 223.2l-85.2 27.4-22.3-138.1s-10.4 81.7 9.4 186.9 41.3 123.4 14.6 131.6c-26.6 8.2-259.8 29.5-291.1 24.7-31.3-4.9-18.1-41.5-11.7-100s-18.8-266-18.8-266l-60.4 43.6s6.9-100.6 11.9-133.3z" fill="#f7f6f5"/><path d="m365.3 117.9s-1.3 22.6-21 42.3c-19.7 19.8-36 28.3-32.3 71.5s19.7 58 6.2 80.2c-13.6 22.2-24 28.4-16.3 48.1 7.7 19.8 5.1 27.2-3.5 40.7-8.5 13.6 0 32.1 0 32.1s-15.9-18.5-11-37-19.8-25.9-18.5-50.6c1.2-24.7 17.3-53 1.2-83.9-10.2-19.6-36.3-73.1-24.7-112.3 6.6-22.2 17.5-44.2 32.1-61.2 8.2-9.6 28.8-48 87-44z" fill="#e6511c"/><path d="m478 431.7c13.2 24.4 8.5 51.3-11.4 61.3-19.9 10.1-47.7-.4-63.7-23.4z" fill="#fff"/><path d="m358.9 423.8c-15 29.5-14.1 59.9 2.6 69.2 16.7 9.4 43.1-5.7 60.5-33.9z" fill="#fff"/><path d="m358.9 103.3s-9.3 37.4 43.7 73.2c0 0-7.9-20.1-10.4-39.2 0 0-7 23.2 42.7 34.9 0 0-9.3-3-9.3-15 0 0 77 5.5 90 40.6 13 35.2 17.9 54.5-5.2 79.5s-5.6 47.2.9 77.7c6.4 30.6-2.4 38.6-10.2 50-11.4 16.6 2.1 37.6 2.1 37.6s-12.3-17.3 10.9-32.4c9.7-6.3 24.9-15.4 19.3-46.9s.9-57.4 12.9-68.5c12.1-11.1 41.7-29.6 32.4-71.2-9.3-41.7-9.3-50-4.6-68.5 4.6-18.5-27.9-62-42.3-78.5-32.4-37.1-119-62.8-167.5-32.9z" fill="#e6511c"/><path d="m524.8 960.4 22.7-505.1-22.4-8-23.1 515.3z" fill="#4189c6"/><path d="m342 975.7 25.2-1.5-58-523.1-22.9 4.2z" fill="#4189c6"/><path d="m375.2 310.7c-2.5-1.4-1 .8-.6 1.3 3.4 3.6 19.8 16.6 43.2 16.2 24.1-.4 34.9-9.9 37.8-13 .4-.4.2-1.1-.4-1.3-4.4-1.1-19.9-4.6-32.8-4.6-6.5 0-13.3 2.9-21.8 4.1-6.8.9-15.6 2.7-25.4-2.7z" fill="#ea1818"/><path d="m365.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m470.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m373.2 84s28.6-7.8 44.6-9.1 35.1-2 35.1-2-11.8-4.3-35.8-1.5-43.9 12.6-43.9 12.6z" fill="#d4410d"/><path d="m378.3 100.2s26.3-4.8 57.6 3.4c31.3 8.1 40 33.3 40 33.3s-11.7-17.6-39.9-26.8c-28.1-9.2-57.7-9.9-57.7-9.9z" fill="#d4410d"/><path d="m364.9 174.8c-24.7.5-36.3 6.7-39.6 12.5-4.1 7.3 6.9 4 16.8.1 9.8-3.9 26.3-6.6 36.4-2.6 10 3.9 15.8 6.8 15.8 1.7-2.7-5.1-14.4-11.7-29.4-11.7z" fill="#e6511c"/><path d="m435 186.5c0 5.2 5.8 2.3 15.8-1.7 10.1-4 26.6-1.3 36.4 2.6s20.9 7.2 16.8-.1c-3.3-5.9-14.9-12-39.6-12.5-14.9 0-26.7 6.6-29.4 11.7z" fill="#e6511c"/><path d="m418.9 436.7c-.8-.1-1.5-.2-2.1-.3-.5-.1-1-.2-1.3-.4s-.6-.4-.8-.6-.3-.5-.4-.9c-.1-.3-.1-.6 0-.9.1-.2.3-.5.5-.7s.5-.4.8-.6.6-.4.9-.6c0 0 .1-.1.3-.2s.4-.3.7-.6c.3-.2.6-.5 1-.7.4-.3.7-.5 1.1-.8s.7-.5 1-.7.6-.4.8-.5c.1-.1.2-.1.4-.2h.4c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.2.3 0 .1.1.2.1.3v.1c.1.2 0 .4-.1.6-.1.1-.2.3-.4.4l-6.5 3.9 6.3.7c.1 0 .2 0 .4.1s.3.1.4.2.3.2.4.4c.1.1.2.3.3.5 0 .2 0 .4-.1.6s-.3.3-.6.4-.5.1-.9.1c-.3 0-.7-.1-1-.1-.4-.1-.7-.1-1.1-.2-.5-.1-.9-.1-1.2-.1z" fill="#333"/><path d="m427.7 439.5c-.2-.8-.2-1.6-.1-2.5s.4-1.8.7-2.6c.4-.9.9-1.7 1.5-2.4.6-.8 1.4-1.4 2.3-1.9-.6-.3-1.2-.6-1.7-.9s-1-.7-1.5-1.1c-.4-.4-.8-.8-1.1-1.2s-.5-.9-.6-1.3c-.1-.6-.2-1.2-.2-1.8s.1-1.1.2-1.6.3-1 .5-1.4.5-.8.8-1.2c.3-.3.6-.6 1-.9.4-.2.7-.4 1.1-.5.5-.1 1.1-.1 1.6 0 .6.2 1.1.5 1.6 1s1 1.2 1.5 2.1c.4.9.8 2 1.1 3.3.2 1 .4 1.9.5 2.7.1.9.2 1.7.3 2.5.4.1.8.3 1.2.4s.8.2 1.3.4c.1 0 .2.1.3.1s.3.1.4.1.2.1.3.2l.2.2v.2c0 .1-.1.1-.1.2-.1.1-.1.1-.2.2s-.1.1-.1.1c-.1.1-.2.1-.4.2-.3.1-.7.1-1.2.1s-1-.1-1.6-.2c0 1.1-.1 2.2-.2 3.2s-.4 1.9-.6 2.7c-.3.8-.6 1.5-.9 2.2-.4.6-.7 1.2-1.1 1.7s-.8.8-1.3 1.1c-.4.3-.9.5-1.3.6-.5.1-.9.1-1.4 0-.4-.1-.9-.3-1.2-.6-.4-.3-.7-.7-1-1.2-.2-.9-.4-1.5-.6-2.2zm2.4 0c.1.6.4 1 .7 1.3s.6.3 1 .2.8-.4 1.2-.8c.4-.5.8-1.1 1.1-1.9s.6-1.8.8-3 .3-2.6.2-4.2l-.4-.1c-.6.3-1.1.6-1.6 1s-.9.9-1.3 1.4-.7 1-1 1.6-.5 1.1-.6 1.7c-.2.5-.2 1.1-.3 1.6.1.4.1.8.2 1.2zm-.7-15.3c.1.5.3.9.6 1.3s.7.8 1.2 1.2 1 .7 1.6 1 1.3.6 2 .9c-.1-.8-.2-1.7-.4-2.6s-.4-1.9-.6-2.9c-.2-.7-.3-1.3-.5-1.7-.2-.5-.4-.8-.6-1.1s-.4-.4-.7-.5c-.2-.1-.5-.1-.7 0s-.4.2-.6.3c-.2.2-.4.4-.5.6-.2.2-.3.5-.4.8s-.2.6-.3.9-.1.6-.1.9c-.1.3 0 .6 0 .9z" fill="#333"/><path d="m453.5 424.1v2.1c0 .7.1 1.2.2 1.7.1.4.3.7.5.9s.5.2.9.1c.1 0 .3-.1.5-.3.2-.1.4-.3.6-.6.2-.2.5-.5.7-.9.3-.4.5-.8.8-1.3 0 0 .1.1.2.2s.2.3.3.5.3.5.6.8c-.3.6-.7 1.1-1 1.5-.4.5-.7.9-1.1 1.2s-.7.6-1.1.8-.7.4-1 .4c-.4.1-.7.1-1.1 0-.3-.1-.7-.2-1-.4s-.6-.5-.8-.8c-.2-.4-.4-.8-.5-1.3 0-.2-.1-.4-.1-.7s0-.6-.1-.9c0-.3 0-.7 0-1.1s0-.8 0-1.3c-.8.3-1.5.5-2.2.8s-1.4.5-2.1.7c0 .5-.1 1.1-.1 1.6s-.1 1-.2 1.4-.1.9-.1 1.2c0 .4-.1.7-.1 1-.1.7-.3 1.2-.5 1.5s-.4.5-.6.6c-.1 0-.3 0-.4 0s-.3-.1-.4-.1c-.1-.1-.2-.1-.3-.3-.1-.1-.2-.2-.2-.4 0-.1 0-.2 0-.3 0-1 .1-1.9.2-2.8s.2-1.8.3-2.6c-.3.1-.6.1-.9.1s-.6 0-.9-.1-.5-.2-.8-.4c-.2-.2-.5-.4-.7-.7 0-.1-.1-.2-.1-.3s-.1-.2-.1-.2c-.1-.3 0-.4.2-.5.1 0 .2 0 .4.1s.4.2.7.5c.3-.1.5-.2.8-.2.3-.1.6-.1.9-.2l.8-.2c.1-.6.2-1.2.2-1.7.1-.6.1-1.1.2-1.6 0-.3 0-.7 0-1s-.1-.6-.1-.9c-.1-.2-.1-.4-.2-.6s-.2-.3-.3-.4-.3-.2-.4-.2c-.2 0-.4 0-.6 0s-.4.1-.6.2-.5.3-.7.5c-.3.2-.5.4-.8.7s-.6.6-.9 1c-.1.1-.2.3-.3.3-.1.1-.2.1-.3.1 0 0-.1-.1-.2-.2s-.1-.3-.2-.6-.1-.6 0-.9.2-.6.4-.9.4-.6.7-.8c.3-.3.6-.5.9-.7s.6-.4.9-.5.6-.3.9-.3c.4-.1.8-.1 1.2-.1s.8.1 1.1.3.6.4.9.8.5.8.6 1.4c.1.3.1.6.1 1v1.3 1.5c0 .5-.1 1.1-.1 1.7.6-.2 1.3-.4 2-.6s1.5-.4 2.2-.7c.1-1 .2-2.1.3-3.3.1-1.1.3-2.2.4-3.4.1-.4.2-.7.3-.9.2-.3.4-.4.7-.5h.4c.1 0 .2 0 .3.1s.2.1.3.2.1.2.2.4c0 .1.1.3.1.5v.6c0 .4-.1.8-.2 1.3-.1.4-.1.9-.2 1.4s-.1 1-.1 1.5-.1 1-.1 1.5c.4-.1.7-.2 1-.3s.5-.2.6-.2.1 0 .2-.1h.2c.2 0 .3-.1.4 0 .1 0 .2 0 .3.1.1 0 .1.1.2.2 0 .1.1.2.1.3v.3c0 .1-.1.2-.2.2-.1.1-.1.1-.2.2-.1 0-.2.1-.2.1-.2.1-.3.1-.3.1-.1 0-.1 0-.1.1 0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2.1-.1 0-.2.1-.4.1-.2.1-.4.1-.6.2-.3.1-.5.2-.7.3z" fill="#333"/><path d="m466.7 425.2c-.3.2-.6.4-1 .6-.3.2-.6.4-.9.7-.3.2-.6.4-.9.6s-.6.3-.8.3c-.3.1-.5.1-.7 0s-.3-.2-.4-.4c0-.2-.1-.4 0-.5 0-.2.1-.3.1-.5.1-.1.1-.3.2-.4s.1-.2.2-.2l5.5-3.6-6.8-.3c-.2 0-.4-.1-.6-.1-.1-.1-.3-.2-.3-.5 0 0 0 0 0-.1s0-.2 0-.3 0-.2 0-.3 0-.2.1-.4c0-.1.1-.2.2-.3s.2-.2.4-.2h.4c.2 0 .5 0 .8.1.3 0 .7.1 1.1.1.4.1.8.1 1.2.2s.7.1 1.1.2c.3 0 .6.1.8.1s.3 0 .3.1c.4.1.7.1 1.1.1.3 0 .6.1.9.2s.5.2.7.3c.2.2.3.4.4.7.1.4.1.7.1 1s-.2.6-.4.9-.6.6-1 1c-.5.1-1.1.5-1.8.9z" fill="#333"/><path d="m432.1 484.9s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m416.9 477.6c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m532.2 968.6h-34.7c-.6 0-1.1-.5-1.1-1.1v-49.1c0-.6.5-1.1 1.1-1.1h34.7c.6 0 1.1.5 1.1 1.1v49.1c0 .6-.5 1.1-1.1 1.1z" fill="#ccc"/><path d="m373.6 979.7-34.4 4.7c-.6.1-1.2-.4-1.3-1l-6.6-48.7c-.1-.6.4-1.2 1-1.3l34.4-4.7c.6-.1 1.2.4 1.3 1l6.6 48.7c0 .7-.4 1.3-1 1.3z" fill="#ccc"/><path d="m538.1 526.2c5.3 8.7 5.1 17.9 2.6 27.4-5.1-1.8-1.1-6.2-3.1-10.1-4.2 5.1-9.9 7.9-15.9 12.9 5.6.5 8.3-2.2 11.5-3.5 3.7-1.5 3.8-1.4 4.6 2.8-2.7 2.2-5.2 4.9-8.6 6-1.6.6-3.4.6-5.6 1.7 2.9-1.1 5.4-1.3 7.7-2.1.6 0 1.2.2 1.7.6.9 2.7 1.7 5.4 2.6 8.1.8 1.1 0 1.7-.8 2.2-4.7 5.6-8.4 11.9-12.7 17.9 4.3-1.7 6.4-6.1 10.4-8.1.6-.1 1.3 0 1.8.3 1.2 2.4-.2 4.1-1.4 5.8 1.4-.5 1.3-2.7 2.8-3.3 1.1.2 1.8.6 1.2 1.8-.7 5.9-5.2 11.5-1.5 17.8-.6 3.8-4.3 8 1.3 11.1.5 5.3-3.5 9.5-3.8 14.6.5 1.2.8 2.4-.5 3.4-3.7 2.2-3.9 6.9-7 9.6-.4 1.1-2.7 2.4.4 3.1 2.7.4 4.3-3.2 7.2-1.9.2.6.2 1.2-.2 1.7-.9 3.3-1.5 5.1 2.2 8.5 4.3 4 5.1 12.3 4.1 18.8-1.7 10.2-1.1 19.7 2.3 29.5 2.5 7.1.8 14.2-5.6 21.2-.2-3.7-.4-6-.5-8.8-2.7 2.1-1.6 6.2-5.1 7.8-.2-3.8-.4-7.5-.5-11.2-1-1.3-2.8-1.7-3.7-3.1-1.6-6.1-5.6-10.9-9-16.1-7.3-11.3-10.4-22.9-2.2-35.1 1.5-2.3.3-3.2-1-4.5-2.2-2.3-4-5.5-2.1-8 3.7-5 .6-8.7-1.2-12.8-.2-.6-.2-1.3 0-1.9.5-.4 1.2-.5 1.8-.4 1.9.6 3.1 2.4 5 3 .8.3 1.9.6 2.2-.5.2-.9-.7-1.5-1.3-2-2.3-2.6-6-3.3-8.5-5.7-3.3-3.5-1.2-8.3-3-12.1-4-4.9-4.6-10.5-3.9-16.5 5.5.6 3.9 5.9 5.8 8.9 1.3 1.9 2.7 3.7 5.1 4.3-2.1-1.3-4.9-2-4-5.5 3.3-1.4 5.9 1.6 9 1.4.1.9 0-.6.7 0 .5.5.9 0 .4-.3-2.7-1.5-5.2-3.3-8-4.8-2.9-2.4-6-4.7-7.8-8.2 4.1-7 3.6-13.4-.8-20.5-3.5-5.6-2.5-12.4-1.6-18.8.3-2 .7-3.8-1.4-5.5-9.9-7.8-11.4-18.2-8.6-29.7 1-3.9.7-6.6-2.1-9.8-6.8-7.6-8-16.9-5.1-26.4 1.7-5.5.9-9.2-3.3-13.8-9.5-10.1-10.3-23.1-8-36.1.7-3.9.3-6.4-2.2-9.2-3.7-4.1-6.4-8.9-8.2-14.2-2.8-8.3-.4-13.8 7.9-16.8 9.8-3.5 19.5-1.8 28.8 2 5.5 2.2 10.4 7.3 15.8 7.6 5 .3 9.3-5.8 14.8-7.7 9.2-3.2 18.3-4.1 27.5-.3 5.9 2.4 8.7 6.4 8.6 13.2-.2 15.1-2.4 29.2-13.9 40.3-2.1 2-1.1 4.2-1.2 6.4.7 1.1 0 1.7-.8 2.2-5.2 2.5-5.9 9.2-11 11.9-5.8 3.8-12 6.9-17.4 10.4 4-.9 7.4-5.8 12.8-3.7-2.7 7.9-10.1 7.5-15 9.7 7.7-1.5 15.1-6 22.3-10.9 2-1.3 5-6 8-5.2 1.8 5.2-4 9.9-6.7 12.9-2.3 2.5-5.2 4.2-8.3 5.6-4.3.4-8.1 2.8-11.1 3.4 3.4-1.2 8-2.8 12.7-4 2-1 3.8-2.6 6.2-2.6 1 .3 1.8.8 1.3 2.1 3.6 6.9 5.3 14.1 4 21.9-2.3.7-2.4-2-3.8-2.6-5.7 2.4-8.9 8.6-15.3 9.9 1.8-.2 3.8-2.2 5.1-.3 1.4 2.1-1 3.1-2.6 3.8s-3.2 1.3-4.1 1.8c3.9-1.1 7.7-3.9 11.7-6.4 3.9-2.4 4.9-.4 4.3 3.4-1.5 2.2-3.2 4.2-5.9 5.2-3 0-5.7 1.1-8.4 2.2-.9.3.1 1.2-.3.4 0-.1.1-.3.5-.3 2.5-.6 4.8-2.8 7.7-1.3.9 1.5.2 3.2 1.2 4.1z" fill="#d4410d"/><g fill="#e6511c"><path d="m536.8 555.1c1.2-2.5.1-2.7-1.8-1.7-3.4 1.8-6.7 3.8-10.2 5.5-1.4.7-3.4.9-4.2-.9-.7-1.6-.7-3.4 1.4-4.6 5.6-3.4 11.7-6.2 15.1-12.4.2-.4 1.5-.8 1.7-.6 1.2 1.1 1.8 2.6 1.9 4.2.2 3-2.7 6 0 9-.3 2.3-1.1 4.3-3.8 4.6-1.1-1-.9-2-.1-3.1z"/><path d="m507.9 605.9c-3.5-2.2-1.5-7.6-5.4-9.6-.3-1.6-.2-3 1.2-4 4.3.4 5.1 5.1 8.3 6.9.6 2.4 2.7 3.2 4.5 4.4 1.4.8 3.4 1.5 2.4 3.9-4 1.3-6.5-3.2-10.3-2.7.1.4-.1.9-.7 1.1z"/><path d="m536.8 520.8c2-1.5 4-3 6-4.4 1-4.5-1.2-9.6 2.5-13.6.8 1.4 1.6 2.8 2.5 4.2.4 5.7-2.6 9.9-6 13.9-1.4 1.7-3.8 2.6-3.6 5.4-1.3-.6-1.3-1.9-1.4-3.1-.8-.8-.8-1.6 0-2.4z"/><path d="m536.6 615.7c-1.1-.3-2.1-.9-3.2-.8-1.2.1-5.5.9-8.1 2.5-2.9 1.8 4.8-5.5 5.7-6.7 1.5-1.9 2.8-4.1 4.2-6.1 2 3.5 2.1 7.2 1.4 11.1z"/><path d="m536.9 586.8c-.4-.4-.8-.9-1.2-1.3-1.4-.5-.6-2.1-1.4-2.9-.5 0-.9.1-1.4.1-.9-3.9.7-7.6 1.3-11.3.4-.5.9-.9 1.3-1.4 2.6 5.5 3.8 11 1.4 16.8z"/><path d="m510.7 630.8c-.1.6-.2 1.2-.3 1.7-4.9-5.8-3.7-12.9-3.9-19.7 2.4 3.6 1.3 8.5 4.4 11.8-.5 2.1 1.8 4.1-.2 6.2z"/><path d="m549.2 454.8c.5-.5 1-1.1 1.5-1.6 2.6 5.4 3 11 1 16.7-.6.4-1.2.4-1.7-.1-.9-1-1.4-2.2-1.5-3.6.7-3.7-.6-7.7.7-11.4z"/><path d="m550.5 469.9h1.2c-1.4 5.7-3.4 11.1-7.9 15.2-.5-.5-1-1-1.5-1.5 1.5-5.3 4.9-9.5 8.2-13.7z"/><path d="m536.8 555.1c0 1 .1 2 .1 3.1-.8 1.8-1.9 3.3-4 3.8-.5 0-1.1 0-1.6 0-1.5.9-2.7 1.1-2.6-1.3 2.7-1.8 5.4-3.7 8.1-5.6z"/><path d="m532.8 646.1c-.1-.5-.1-.9-.2-1.4-2.6-3.6-2.6-7.4-1-11.4.4-1 .8-2 1.2-3 2.7 5.3 2.7 10.5 0 15.8z"/><path d="m525.9 708.9c1.8.4 4.3-.1 3.7 3.1-1.1.9-1.4 2.8-3.3 3.1-1.1-1.9-.5-4.1-.4-6.2z"/><path d="m497 457.4c6.1 4.4 13.2 6.9 19.6 10.7-14.5-2.4-27.3-8.2-37.6-19-3.5-4.5-4.7-9.5-3-14.9 1.1-5.6.3-4.9 2.5-1.7 3.1 4.5 7.4 8.8 10.2 12.6 2 1.4-4.4 3.4.3 4.7 2.7 2.6 6.4 4 8 7.6z"/><path d="m518.7 663.5c.4-1.3.3-3.1 1.9-3.2 1.6-.2 1.2 1.6 1.4 2.6.6 2.9.9 5.8 1.4 8.8 2-.5.3-2.8 2.1-3.8 1.1 8.8-2.2 16.9-2.5 26.4-6.8-10.2-14.6-18.9-6.8-30.9.8.9 1.2 1.9 1.2 3.1.3-1.2.5-2.2 1.3-3z"/><path d="m549.2 454.8c1.8 4.5 2.7 8.9-1 12.9-.1.3-.2.5-.3.8-7.7 10.1-18.7 13.7-30.3 16.4 5.1-4.4 12.5-5.2 16.7-10.9.2-1.4 1.1-2.6 2.3-3.1 2.5-1.1 4-2.3 1.6-4.9 3.1-2.9 5.7-6.1 7.8-9.9.7-1.4 1.1-3.3 3.2-1.3z"/><path d="m545.1 415.9c2.9-2.5 5.3-5.3 7.5-8.5 1-1.4 4.2-5.7 4.7-8.2 1.7-8.6 1.3 7.5 1.4 9.7.1 1.9.9 3.8-.3 5.6-1.2 2.2-1.7 4.9-4.5 5.8-6.9 8-19.1 14.2-29.1 14.3 4.8-2.6 8.9-4.9 13-7.1 1.7-3.7 5.5-5.2 8.2-7.8 2.2-1.8-2.7-2-.9-3.8z"/><path d="m545.2 502.9c-.2 4.2-.2 8.5-2 12.4-.2.4-.8.4-.9-.1-.2-1.4-.2-3.1-2.9-.7-4.2 3.7-9.4 5.4-15.6 7.4-.5.2-.9-.5-.5-.8 3-2.3 6.2-3.2 9-5.7.4-.4 0-1-.5-.8-2.5 1.1-4.6 2-7 3-.4.2-.8-.3-.6-.7 1.4-2.6 3.7-3.3 5.6-4.4 4.6-2.6 10.1-4.9 11.8-10.1 1.9-5.7 1.4-4.9 3.5.3.1 0 .1.1.1.2z"/><path d="m488.7 493.2c-.2-.1-.5-.2-.5-.4-1-4.2-4.8-9.6-.4-12.2 2.1-1.2 5.8 5.6 9.1 8.4 1.3 4.8 8 4.5 9.1 9.6 2.2 2.9 6.3 2.5 10.1 6.2-9.9-2.6-17.6-5.5-24.2-11.1-.7-.6-1.9-4.8-3.4-.4z"/><path d="m488.8 450.7c-2.7-.2-4.4-1.6-5.3-4.4 1.9-.3 4.4 2.3 5.2-1.2 10.3 5.9 21.1 11 31.2 18.7-8.2-1.2-14.6-5.3-21.5-7.8-3.8-.7-6.7-3.1-9.6-5.3z"/><path d="m513.6 542.5c1.1.6 2.2 1.3 5 2.9-9.4-.2-14.5-5.9-20.8-8.4-1.1.4-1.6-.3-2.1-1.1-2.1-4.2-3.9-8.5-.9-13.6 3.2 3.4 6.1 6.5 9 9.6.5 1.2.1 2.7 1.3 3.6 2.7 2.5 6.4 3.7 8.5 7z"/><path d="m534.2 571.4c2.5 4.1.2 7.7-1.3 11.3-2.3 3.7-5.7 6.5-9.1 9.3-.7.6-1.6 1.7-2.8.8 1.6-1.7-2.2-2.1-.8-3.9 4.5-5.9 9.6-11.3 12.4-18.4.5.3 1 .6 1.6.9z"/><path d="m506.5 570.2c-2.6-3.6-3.9-9.1-2.1-13.6 11.6 20 17.5 17.6 19.9 20-6.8-.6-11.2-4.6-16.6-6.4-.4.7-.8.7-1.2 0z"/><path d="m476.3 434.2c-.8 5.3.9 10.1 2.7 14.9 3.5 9.4 10.3 15.5 19.2 19.6.6 1.4-.1 2.1-1.3 2.6-14.6-4.5-25.4-23.9-20.6-37.1z"/><path d="m538.2 465.9c1.1 2.9 3 1.6 5.9-.4-2.3 5.7-7 5.9-9.8 8.4-5.6.7-9.9 5.3-16.4 5.6 6.1-6.4 13.4-9.7 20.3-13.6z"/><path d="m545.1 415.9c.5.4 1.1.9 1.6 1.3 1.2.8 3.3-1.4 3.6.5.3 2-1.8 2.5-3.6 2.6-3.3 2.2-6.4 4.9-10.5 5.8-4.9 1.8-9.5 4.6-15.9 5.5 8.7-6.1 16.4-11.5 24.8-15.7z"/><path d="m553.1 419.4c1.1-2 1.6-4.5 4.2-5.5-.1 10.1-4.4 17.6-13.7 22.1-1.6.2-3.7 2-4.1-1.4 5.8-2.7 10.7-6.5 13.9-12.2.7-1.1 1.7-2.2-.3-3z"/><path d="m531.6 633.3c1.6 3.7.7 7.6 1 11.4-2.5 0-3.2 5.3-6.8 2.4-.2-1.7-1-3-2.3-4 3.2-2.9 3.8-7.8 8.1-9.8z"/><path d="m531.1 698.3c-3.2-7.1-4.1-14 2.3-21.2 1.8 6.5-1.5 11.6-.9 16.9-1.2 1.2.3 3.3-1.4 4.3z"/><path d="m547.9 468.4c0-.3.1-.6.3-.8 1.9-.4 2 1 2.3 2.2-2.5 4.7-4.4 9.8-8.2 13.7-1.8 1-3.5 2-5.3 3-1.5.4-3.1 1.1-2.9-1.6 6.1-4.1 12.9-7.8 13.8-16.5z"/><path d="m506.1 498.6c-2.7-3.5-9.8-2.8-9.1-9.5 5 2.5 10.2 4.5 14.8 8.6-1.9 1.8-4 .2-5.7.9z"/><path d="m503.4 535.8c-4.8-1.7.2-2.6.3-3.9 5.6 2.7 11.3 5.4 16.2 9.8-2 1.7-3.4-.6-5-.4-4.3-.8-7.7-3.7-11.5-5.5z"/><path d="m495.6 535.8c.7.4 1.4.8 2.1 1.1 2.3 5.6 8.1 7.7 12.4 11.6-6.4.5-11.9-4.4-14.5-12.7z"/><path d="m518.9 629.4c1.7 1.2 4.9 2.2 3.2 4.9-1.6 2.6-4.5 1.6-6.7.2-1.3-.8-2.3-2.1-3.4-3.2-1-2.6.8-2.6 2.4-2.5 1.5 0 2.8 1.5 4.5.6z"/><path d="m488.8 492.9c5.8 6.5 7.8 9.2 13.6 11.4.1 2.6-1.2 2.2-2.8 1.4-5.4-2.6-9.9-6.9-11.4-12.9-.1-3.3.6.1.6.1z"/><path d="m518.9 607.4c-.8-2.2-2.8-2.4-4.6-3.2-2.1-.9-3.9-2.3-2.3-5 4 2.3 8.5 3.9 12.2 7.9-2.2 0-3.7.2-5.3.3z"/><path d="m477.4 402.7c-3.2-5-2.7-28.7-2.3-27.2 1.7 5.3 3.7 9.3 4.2 10.3 2.7 4.6 6.7 8 10.6 11.4.7 1.1 0 2.1-.3 3.1.5 2.9 2 2.3 4.6 6.3 7.3 5.4 15.9 8.3 23.6 12.9-13.1-2.5-25.3-7.1-35.6-15.8-.9-.8-1.5-3.4-3.5-1.1-.4.7-.8.7-1.3.1z"/><path d="m488.7 400.3c.4-1 .9-2 1.3-3.1 9.4 4.4 18.4 9.6 27.8 16.6-9.4-1.3-16.2-5.9-23.6-8.9-2.1-1.2-5.2-1.3-5.5-4.6z"/><path d="m477.4 402.7c.4 0 .8-.1 1.2-.1 4.7 7 10.7 12.6 18.2 16.7 1.1 1.6 1.1 2.6-1.3 2.5-9.1-3.4-15-9.8-18.1-19.1z"/><path d="m495.6 421.9c1-.5 1.3-1.4 1.3-2.5 5.4 1.2 10.5 3.4 15.3 6.5-5.6-1.3-11.1-2.7-16.6-4z"/><path d="m518.9 629.4c-.9 2.3-2.2 2.4-4 .9-1.3-1.1-2.4-.8-2.9.9-.4-.3-.8-.4-1.3-.5.4-2-2.5-4.1.1-6.1 2.9 1.3 5.7 2.6 8.1 4.8z"/><path d="m539.5 434.7c1 1.6 2.6 1.1 4.1 1.3-4.9 1.4-9.9 2.8-14.8 4.2-.2-.5-.4-1-.6-1.5 3.8-1.3 7.5-2.7 11.3-4z"/><path d="m534 485c.6 1.3 1.8 1.3 2.9 1.6-5.1 1.4-10.1 2.8-15.2 4.2 3.8-3.1 7.9-4.9 12.3-5.8z"/><path d="m531.1 698.3c.3-1.5-.2-3.2 1.4-4.3.6 4.7 4.9 7.2 6.7 11.3-3-2.2-6.9-3-8.1-7z"/><path d="m523.5 643.1c1.1-.1 2.7-.6 3-.1 1 1.4.9 3-.7 4.1-1.4.2-2.9 2.3-4.3.3-1.3-2.1.8-3.1 2-4.3z"/><path d="m518.7 663.5v9.1c-3.4-2.9-2.1-6.2-2.5-9.3 1-1.3 1.7.2 2.5.2z"/><path d="m536.8 520.8v2.4c-3.7.8-7.4 1.7-11.1 2.5 3.3-2.7 6.8-4.8 11.1-4.9z"/><path d="m499.6 505.7c1.1-.1 2.3-.1 2.8-1.4 3 .7 6.1 1.3 9.3 4-4.7-.3-8.5-.9-12.1-2.6z"/><path d="m503.4 535.8c4.3.8 8 2.9 11.5 5.4-.4.4-.8.8-1.2 1.2-4.1-1.3-7.4-3.6-10.3-6.6z"/><path d="m496.9 471.3c.4-.9.9-1.8 1.3-2.6 2.7 1 5.4 1.9 8.1 2.9.3 1.2.1 1.8-1.3 1.3-2.7-.5-5.4-1-8.1-1.6z"/><path d="m534.2 582.6c.5 1 1 1.9 1.4 2.9-1.1 2.9-2.6 5.5-7.1 7.1 2.4-4 5.5-6.3 5.7-10z"/><path d="m507.9 605.9c.3-.4.5-.9.8-1.3 2.2 2.7 5.2 4.2 9.4 6.8-5.7 0-8.2-2.3-10.2-5.5z"/><path d="m488.8 450.7c3.6 1 6.5 3.3 9.6 5.4-.5.4-.9.9-1.4 1.3-3-2-6.5-3.2-8.2-6.7z"/><path d="m506.5 570.2c.4 0 .8 0 1.2-.1 1.8 2.3 3.7 4.6 5.7 7.1-3.5-1-6-3-6.9-7z"/><path d="m505 472.9 1.3-1.3c2.5.9 5 1.7 9.1 3.2-5 .9-7.8-.3-10.4-1.9z"/><path d="m528.7 560.7c.5 1.3 1.6 1.1 2.6 1.3-2.8 2.2-6.5 1.2-10.8 3.6 2.8-4 5.9-3.7 8.2-4.9z"/><path d="m485.7 412.8c1.8 1.5 3.7 3.1 5.5 4.6 0 .6.1 1.1.1 1.7-2.4-1.7-5.1-3-7-5.1-1.6-1.7.5-1.2 1.4-1.2z"/><path d="m581.5 273.2s-6.7 28.9-13.1 43.6c-6.5 14.7-14.9 31.9-14.9 31.9s9.4-8.4 18.3-30.8c8.8-22.5 9.7-44.7 9.7-44.7z"/></g><path d="m262.7 616.1c-1.7 7.4 4.6 2.4 4.6 2.4l-13.3 184.4s-64.7-9.3-72-72.7c18-87.4 28.3-199.2 28.3-199.2s32.9-6.4 52.4 85.1z" fill="#f7f6f5"/><path d="m255.8 834.7s53.1-13.4 70.8-3.6 47.6 25.7 48.1 42.5-22.3 64.3-46.5 62.5-88.9-47.9-88.9-47.9z" fill="#f2b181"/><path d="m295 873.4c10.3-3.1 26.4-30.9 21.5-39.3-24.5 3.9-61.9-107-57.5-100 4.7 7.4-21.6-48.5-70-23.2-23.2 28 9.7 124.8 45.7 167.9 6.8 8.1 19.6 9.1 24.2 7.4 6.6-2.5 25.6-9.6 36.1-12.8z" fill="#f7f6f5"/><path d="m226.2 875.5s14.7-35.7 22.7-45.7 40.7-30.6 40.7-30.6l30.9 33.8s-18.6 41.6-26.6 49.9-36.6 23.3-36.6 23.3z" fill="#fff"/><path d="m576.7 826.7s-54.2-14.1-71.6-3.8c-17.5 10.2-47 26.7-46.8 44.3s25.1 67.1 49.4 65.3 87.8-49.9 87.8-49.9z" fill="#f2b181"/><path d="m536.9 857.7c-8.4-4.4-12.2-16.4-6.5-22.8.9-.8 73.9-111.9 69-106.6-5.3 5.6 26.6-24.2 64.5 5.4 15.5 27.8-37.2 107.4-75.5 138.4-7.2 5.8-18.5 4.6-22.2 2.4-5.4-3.2-20.7-12.4-29.3-16.8z" fill="#f7f6f5"/><path d="m610.7 876.3s-11.8-36.7-19-47.3-38.1-33.7-38.1-33.7l-37.6 27.2s15.3 42.9 22.6 51.8 34.7 26.1 34.7 26.1z" fill="#fff"/></svg>
\ No newline at end of file
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png
new file mode 100755
index 0000000000000000000000000000000000000000..b1e4fb3c8654570012950a3c888f11cb92c23bdd
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png
new file mode 100755
index 0000000000000000000000000000000000000000..aa058c7a0aba654a4991c8bbd5d3e2d32517acd1
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png
new file mode 100755
index 0000000000000000000000000000000000000000..1d10bd5da3d4d417aedfd3bf2e8515eff092c506
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png differ
diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png
new file mode 100755
index 0000000000000000000000000000000000000000..e719f1df805db311c8e4c4e8e62a5b00d2cc90ed
Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png differ
diff --git a/borestop/src/main/webapp/content/images/logo-jhipster.png b/borestop/src/main/webapp/content/images/logo-jhipster.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a005bf5e4b6d9d1cffd5aa688612a7a67be3809
Binary files /dev/null and b/borestop/src/main/webapp/content/images/logo-jhipster.png differ
diff --git a/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a64158a6942a5ff6ab603f749e3f85cabc3ea4a4
--- /dev/null
+++ b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss
@@ -0,0 +1,45 @@
+/*
+* Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/
+* All values defined in bootstrap source
+* https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here
+* Make sure not to add !default to values here
+*/
+
+// Colors:
+// Grayscale and brand colors for use across Bootstrap.
+
+$primary: #3e8acc;
+$success: #28a745;
+$info: #17a2b8;
+$warning: #ffc107;
+$danger: #dc3545;
+
+// Options:
+// Quickly modify global styling by enabling or disabling optional features.
+$enable-rounded: true;
+$enable-shadows: false;
+$enable-gradients: false;
+$enable-transitions: true;
+$enable-hover-media-query: false;
+$enable-grid-classes: true;
+$enable-print-styles: true;
+
+// Components:
+// Define common padding and border radius sizes and more.
+
+$border-radius: 0.15rem;
+$border-radius-lg: 0.125rem;
+$border-radius-sm: 0.1rem;
+
+// Body:
+// Settings for the `<body>` element.
+
+$body-bg: #e4e5e6;
+
+// Typography:
+// Font, line-height, and color for body text, headings, and more.
+
+$font-size-base: 1rem;
+
+$dropdown-link-hover-color: white;
+$dropdown-link-hover-bg: #343a40;
diff --git a/borestop/src/main/webapp/content/scss/global.scss b/borestop/src/main/webapp/content/scss/global.scss
new file mode 100644
index 0000000000000000000000000000000000000000..543a62c1a8d47c6b637b0e68d654c38e45a5bb97
--- /dev/null
+++ b/borestop/src/main/webapp/content/scss/global.scss
@@ -0,0 +1,195 @@
+@import 'bootstrap-variables';
+@import '~bootstrap/scss/functions';
+@import '~bootstrap/scss/variables';
+
+/* ==============================================================
+Bootstrap tweaks
+===============================================================*/
+
+body,
+h1,
+h2,
+h3,
+h4 {
+  font-weight: 300;
+}
+
+/* Increase contrast of links to get 100% on Lighthouse Accessability Audit. Override this color if you want to change the link color, or use a Bootswatch theme */
+a {
+  color: #533f03;
+  font-weight: bold;
+}
+
+a:hover {
+  color: #533f03;
+}
+
+/* override hover color for dropdown-item forced by bootstrap to all a:not([href]):not([tabindex]) elements in _reboot.scss */
+a:not([href]):not([tabindex]):hover.dropdown-item {
+  color: $dropdown-link-hover-color;
+}
+
+/* override .dropdown-item.active background-color on hover */
+.dropdown-item.active:hover {
+  background-color: mix($dropdown-link-hover-bg, $dropdown-link-active-bg, 50%);
+}
+
+a:hover {
+  /* make sure browsers use the pointer cursor for anchors, even with no href */
+  cursor: pointer;
+}
+
+.dropdown-item:hover {
+  color: $dropdown-link-hover-color;
+}
+
+/* ==========================================================================
+Browser Upgrade Prompt
+========================================================================== */
+.browserupgrade {
+  margin: 0.2em 0;
+  background: #ccc;
+  color: #000;
+  padding: 0.2em 0;
+}
+
+/* ==========================================================================
+Generic styles
+========================================================================== */
+
+/* Error highlight on input fields */
+.ng-valid[required],
+.ng-valid.required {
+  border-left: 5px solid green;
+}
+
+.ng-invalid:not(form) {
+  border-left: 5px solid red;
+}
+
+/* other generic styles */
+
+.jh-card {
+  padding: 1.5%;
+  margin-top: 20px;
+  border: none;
+}
+
+.error {
+  color: white;
+  background-color: red;
+}
+
+.pad {
+  padding: 10px;
+}
+
+.w-40 {
+  width: 40% !important;
+}
+
+.w-60 {
+  width: 60% !important;
+}
+
+.break {
+  white-space: normal;
+  word-break: break-all;
+}
+
+.readonly {
+  background-color: #eee;
+  opacity: 1;
+}
+
+.footer {
+  border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.hand,
+[jhisortby] {
+  cursor: pointer;
+}
+
+/* ==========================================================================
+Custom alerts for notification
+========================================================================== */
+.alerts {
+  .alert {
+    text-overflow: ellipsis;
+    pre {
+      background: none;
+      border: none;
+      font: inherit;
+      color: inherit;
+      padding: 0;
+      margin: 0;
+    }
+    .popover pre {
+      font-size: 10px;
+    }
+  }
+  .jhi-toast {
+    position: fixed;
+    width: 100%;
+    &.left {
+      left: 5px;
+    }
+    &.right {
+      right: 5px;
+    }
+    &.top {
+      top: 55px;
+    }
+    &.bottom {
+      bottom: 55px;
+    }
+  }
+}
+
+@media screen and (min-width: 480px) {
+  .alerts .jhi-toast {
+    width: 50%;
+  }
+}
+
+/* ==========================================================================
+entity detail page css
+========================================================================== */
+.row.jh-entity-details > {
+  dd {
+    margin-bottom: 15px;
+  }
+}
+
+@media screen and (min-width: 768px) {
+  .row.jh-entity-details > {
+    dt {
+      margin-bottom: 15px;
+    }
+    dd {
+      border-bottom: 1px solid #eee;
+      padding-left: 180px;
+      margin-left: 0;
+    }
+  }
+}
+
+/* ==========================================================================
+ui bootstrap tweaks
+========================================================================== */
+.nav,
+.pagination,
+.carousel,
+.panel-title a {
+  cursor: pointer;
+}
+
+.thread-dump-modal-lock {
+  max-width: 450px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* jhipster-needle-scss-add-main JHipster will add new css style */
diff --git a/borestop/src/main/webapp/content/scss/vendor.scss b/borestop/src/main/webapp/content/scss/vendor.scss
new file mode 100644
index 0000000000000000000000000000000000000000..31688d043ce70644ed265a9f630c4cc11307fb70
--- /dev/null
+++ b/borestop/src/main/webapp/content/scss/vendor.scss
@@ -0,0 +1,12 @@
+/* after changing this file run 'npm run webpack:build' */
+
+/***************************
+put Sass variables here:
+eg $input-color: red;
+****************************/
+// Override Bootstrap variables
+@import 'bootstrap-variables';
+// Import Bootstrap source files from node_modules
+@import '~bootstrap/scss/bootstrap';
+
+/* jhipster-needle-scss-add-vendor JHipster will add new css style */
diff --git a/borestop/src/main/webapp/favicon.ico b/borestop/src/main/webapp/favicon.ico
new file mode 100755
index 0000000000000000000000000000000000000000..4179874f53b3c3b0ba9e2a401412f814ab6296bd
Binary files /dev/null and b/borestop/src/main/webapp/favicon.ico differ
diff --git a/borestop/src/main/webapp/i18n/en/activate.json b/borestop/src/main/webapp/i18n/en/activate.json
new file mode 100644
index 0000000000000000000000000000000000000000..058bd497fbebac324ac113e2517f7a7577c721b4
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/activate.json
@@ -0,0 +1,9 @@
+{
+  "activate": {
+    "title": "Activation",
+    "messages": {
+      "success": "<strong>Your user account has been activated.</strong> Please ",
+      "error": "<strong>Your user could not be activated.</strong> Please use the registration form to sign up."
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/audits.json b/borestop/src/main/webapp/i18n/en/audits.json
new file mode 100644
index 0000000000000000000000000000000000000000..8af22b200aec4b8c07435d685c24250924292d6c
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/audits.json
@@ -0,0 +1,28 @@
+{
+  "audits": {
+    "title": "Audits",
+    "filter": {
+      "title": "Filter per date",
+      "from": "from",
+      "to": "to",
+      "button": {
+        "weeks": "Weeks",
+        "today": "today",
+        "clear": "clear",
+        "close": "close"
+      }
+    },
+    "table": {
+      "header": {
+        "principal": "User",
+        "date": "Date",
+        "status": "State",
+        "data": "Extra data"
+      },
+      "data": {
+        "remoteAddress": "Remote Address:"
+      }
+    },
+    "notFound": "No audit found"
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/configuration.json b/borestop/src/main/webapp/i18n/en/configuration.json
new file mode 100644
index 0000000000000000000000000000000000000000..09c9a1af0f508ffcce441a2a27a51acc959d896a
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/configuration.json
@@ -0,0 +1,10 @@
+{
+  "configuration": {
+    "title": "Configuration",
+    "filter": "Filter (by prefix)",
+    "table": {
+      "prefix": "Prefix",
+      "properties": "Properties"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/error.json b/borestop/src/main/webapp/i18n/en/error.json
new file mode 100644
index 0000000000000000000000000000000000000000..d2575632769fbed14ae2ece28c1a599091450d4e
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/error.json
@@ -0,0 +1,14 @@
+{
+  "error": {
+    "title": "Error page!",
+    "http": {
+      "400": "Bad request.",
+      "403": "You are not authorized to access this page.",
+      "404": "The page does not exist.",
+      "405": "The HTTP verb you used is not supported for this URL.",
+      "500": "Internal server error."
+    },
+    "concurrencyFailure": "Another user modified this data at the same time as you. Your changes were rejected.",
+    "validation": "Validation error on the server."
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/global.json b/borestop/src/main/webapp/i18n/en/global.json
new file mode 100644
index 0000000000000000000000000000000000000000..8d7ada0739b084709f12733e3828adc0294678d7
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/global.json
@@ -0,0 +1,140 @@
+{
+  "global": {
+    "title": "Borestop",
+    "browsehappy": "You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/?locale=en\">upgrade your browser</a> to improve your experience.",
+    "menu": {
+      "home": "Home",
+      "jhipster-needle-menu-add-element": "JHipster will add additional menu entries here (do not translate!)",
+      "entities": {
+        "main": "Entities",
+        "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)"
+      },
+      "account": {
+        "main": "Account",
+        "settings": "Settings",
+        "password": "Password",
+        "sessions": "Sessions",
+        "login": "Sign in",
+        "logout": "Sign out",
+        "register": "Register"
+      },
+      "admin": {
+        "main": "Administration",
+        "userManagement": "User management",
+        "tracker": "User tracker",
+        "metrics": "Metrics",
+        "health": "Health",
+        "configuration": "Configuration",
+        "logs": "Logs",
+        "audits": "Audits",
+        "apidocs": "API",
+        "database": "Database",
+        "jhipster-needle-menu-add-admin-element": "JHipster will add additional menu entries here (do not translate!)"
+      },
+      "language": "Language"
+    },
+    "form": {
+      "username.label": "Username",
+      "username.placeholder": "Your username",
+      "currentpassword.label": "Current password",
+      "currentpassword.placeholder": "Current password",
+      "newpassword.label": "New password",
+      "newpassword.placeholder": "New password",
+      "confirmpassword.label": "New password confirmation",
+      "confirmpassword.placeholder": "Confirm the new password",
+      "email.label": "Email",
+      "email.placeholder": "Your email"
+    },
+    "messages": {
+      "info": {
+        "authenticated": {
+          "prefix": "If you want to ",
+          "link": "sign in",
+          "suffix": ", you can try the default accounts:<br/>- Administrator (login=\"admin\" and password=\"admin\") <br/>- User (login=\"user\" and password=\"user\")."
+        },
+        "register": {
+          "noaccount": "You don't have an account yet?",
+          "link": "Register a new account"
+        }
+      },
+      "error": {
+        "dontmatch": "The password and its confirmation do not match!"
+      },
+      "validate": {
+        "newpassword": {
+          "required": "Your password is required.",
+          "minlength": "Your password is required to be at least 4 characters.",
+          "maxlength": "Your password cannot be longer than 50 characters.",
+          "strength": "Password strength:"
+        },
+        "confirmpassword": {
+          "required": "Your confirmation password is required.",
+          "minlength": "Your confirmation password is required to be at least 4 characters.",
+          "maxlength": "Your confirmation password cannot be longer than 50 characters."
+        },
+        "email": {
+          "required": "Your email is required.",
+          "invalid": "Your email is invalid.",
+          "minlength": "Your email is required to be at least 5 characters.",
+          "maxlength": "Your email cannot be longer than 50 characters."
+        }
+      }
+    },
+    "field": {
+      "id": "ID"
+    },
+    "ribbon": {
+      "dev": "Development"
+    },
+    "item-count": "Showing {{first}} - {{second}} of {{total}} items."
+  },
+  "entity": {
+    "action": {
+      "addblob": "Add blob",
+      "addimage": "Add image",
+      "back": "Back",
+      "cancel": "Cancel",
+      "delete": "Delete",
+      "edit": "Edit",
+      "open": "Open",
+      "save": "Save",
+      "view": "View"
+    },
+    "detail": {
+      "field": "Field",
+      "value": "Value"
+    },
+    "delete": {
+      "title": "Confirm delete operation"
+    },
+    "validation": {
+      "required": "This field is required.",
+      "minlength": "This field is required to be at least {{ min }} characters.",
+      "maxlength": "This field cannot be longer than {{ max }} characters.",
+      "min": "This field should be at least {{ min }}.",
+      "max": "This field cannot be more than {{ max }}.",
+      "minbytes": "This field should be at least {{ min }} bytes.",
+      "maxbytes": "This field cannot be more than {{ max }} bytes.",
+      "pattern": "This field should follow pattern for {{ pattern }}.",
+      "number": "This field should be a number.",
+      "datetimelocal": "This field should be a date and time.",
+      "patternLogin": "This field can only contain letters, digits and e-mail addresses."
+    }
+  },
+  "error": {
+    "internalServerError": "Internal server error",
+    "server.not.reachable": "Server not reachable",
+    "url.not.found": "Not found",
+    "NotNull": "Field {{ fieldName }} cannot be empty!",
+    "Size": "Field {{ fieldName }} does not meet min/max size requirements!",
+    "userexists": "Login name already used!",
+    "emailexists": "Email is already in use!",
+    "idexists": "A new {{ entityName }} cannot already have an ID",
+    "idnull": "Invalid ID",
+    "file": {
+      "could.not.extract": "Could not extract file",
+      "not.image": "File was expected to be an image but was found to be \"{{ fileType }}\""
+    }
+  },
+  "footer": "This is your footer"
+}
diff --git a/borestop/src/main/webapp/i18n/en/health.json b/borestop/src/main/webapp/i18n/en/health.json
new file mode 100644
index 0000000000000000000000000000000000000000..0cbff2660c9e3b1698ba16a22a99d70b9b60d881
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/health.json
@@ -0,0 +1,29 @@
+{
+  "health": {
+    "title": "Health Checks",
+    "refresh.button": "Refresh",
+    "stacktrace": "Stacktrace",
+    "details": {
+      "details": "Details",
+      "properties": "Properties",
+      "name": "Name",
+      "value": "Value",
+      "error": "Error"
+    },
+    "indicator": {
+      "diskSpace": "Disk space",
+      "mail": "Email",
+      "ping": "Application",
+      "db": "Database"
+    },
+    "table": {
+      "service": "Service name",
+      "status": "Status"
+    },
+    "status": {
+      "UNKNOWN": "UNKNOWN",
+      "UP": "UP",
+      "DOWN": "DOWN"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/home.json b/borestop/src/main/webapp/i18n/en/home.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9fc499067e53a6b1d79b2cfb96ab30529bf2aae
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/home.json
@@ -0,0 +1,19 @@
+{
+  "home": {
+    "title": "Welcome, Java Hipster!",
+    "subtitle": "This is your homepage",
+    "logged": {
+      "message": "You are logged in as user \"{{username}}\"."
+    },
+    "question": "If you have any question on JHipster:",
+    "link": {
+      "homepage": "JHipster homepage",
+      "stackoverflow": "JHipster on Stack Overflow",
+      "bugtracker": "JHipster bug tracker",
+      "chat": "JHipster public chat room",
+      "follow": "follow @jhipster on Twitter"
+    },
+    "like": "If you like JHipster, don't forget to give us a star on",
+    "github": "GitHub"
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/login.json b/borestop/src/main/webapp/i18n/en/login.json
new file mode 100644
index 0000000000000000000000000000000000000000..4667958802c9cecdfdf9c55144ab08567b5cc801
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/login.json
@@ -0,0 +1,19 @@
+{
+  "login": {
+    "title": "Sign in",
+    "form": {
+      "password": "Password",
+      "password.placeholder": "Your password",
+      "rememberme": "Remember me",
+      "button": "Sign in"
+    },
+    "messages": {
+      "error": {
+        "authentication": "<strong>Failed to sign in!</strong> Please check your credentials and try again."
+      }
+    },
+    "password": {
+      "forgot": "Did you forget your password?"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/logs.json b/borestop/src/main/webapp/i18n/en/logs.json
new file mode 100644
index 0000000000000000000000000000000000000000..8ee0ba5a2a0c2b2bd34d561e8c2e5e2330e2438d
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/logs.json
@@ -0,0 +1,11 @@
+{
+  "logs": {
+    "title": "Logs",
+    "nbloggers": "There are {{ total }} loggers.",
+    "filter": "Filter",
+    "table": {
+      "name": "Name",
+      "level": "Level"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/metrics.json b/borestop/src/main/webapp/i18n/en/metrics.json
new file mode 100644
index 0000000000000000000000000000000000000000..c514dee72d6114d0353daa3f6737ba6cf60ea36f
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/metrics.json
@@ -0,0 +1,102 @@
+{
+  "metrics": {
+    "title": "Application Metrics",
+    "refresh.button": "Refresh",
+    "updating": "Updating...",
+    "jvm": {
+      "title": "JVM Metrics",
+      "memory": {
+        "title": "Memory",
+        "total": "Total Memory",
+        "heap": "Heap Memory",
+        "nonheap": "Non-Heap Memory"
+      },
+      "threads": {
+        "title": "Threads",
+        "all": "All",
+        "runnable": "Runnable",
+        "timedwaiting": "Timed waiting",
+        "waiting": "Waiting",
+        "blocked": "Blocked",
+        "dump": {
+          "title": "Threads dump",
+          "id": "Id: ",
+          "blockedtime": "Blocked Time",
+          "blockedcount": "Blocked Count",
+          "waitedtime": "Waited Time",
+          "waitedcount": "Waited Count",
+          "lockname": "Lock name",
+          "stacktrace": "Stacktrace",
+          "show": "Show Stacktrace",
+          "hide": "Hide Stacktrace"
+        }
+      },
+      "gc": {
+        "title": "Garbage collections",
+        "marksweepcount": "Mark Sweep count",
+        "marksweeptime": "Mark Sweep time",
+        "scavengecount": "Scavenge count",
+        "scavengetime": "Scavenge time"
+      },
+      "http": {
+        "title": "HTTP requests (time in millisecond)",
+        "active": "Active requests:",
+        "total": "Total requests:",
+        "table": {
+          "code": "Code",
+          "count": "Count",
+          "mean": "Mean",
+          "average": "Average",
+          "max": "Max"
+        },
+        "code": {
+          "ok": "Ok",
+          "notfound": "Not found",
+          "servererror": "Server Error"
+        }
+      }
+    },
+    "servicesstats": {
+      "title": "Services statistics (time in millisecond)",
+      "table": {
+        "name": "Service name",
+        "count": "Count",
+        "mean": "Mean",
+        "min": "Min",
+        "max": "Max",
+        "p50": "p50",
+        "p75": "p75",
+        "p95": "p95",
+        "p99": "p99"
+      }
+    },
+    "cache": {
+      "title": "Cache statistics",
+      "cachename": "Cache name",
+      "hits": "Cache Hits",
+      "misses": "Cache Misses",
+      "gets": "Cache Gets",
+      "puts": "Cache Puts",
+      "removals": "Cache Removals",
+      "evictions": "Cache Evictions",
+      "hitPercent": "Cache Hit %",
+      "missPercent": "Cache Miss %",
+      "averageGetTime": "Average get time (µs)",
+      "averagePutTime": "Average put time (µs)",
+      "averageRemoveTime": "Average remove time (µs)"
+    },
+    "datasource": {
+      "usage": "Connection Pool Usage",
+      "title": "DataSource statistics (time in millisecond)",
+      "name": "Pool usage",
+      "count": "Count",
+      "mean": "Mean",
+      "min": "Min",
+      "max": "Max",
+      "p50": "p50",
+      "p75": "p75",
+      "p95": "p95",
+      "p99": "p99"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/password.json b/borestop/src/main/webapp/i18n/en/password.json
new file mode 100644
index 0000000000000000000000000000000000000000..fc9b6c946d51be66a8257e8945b9ddda9692a3f4
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/password.json
@@ -0,0 +1,12 @@
+{
+  "password": {
+    "title": "Password for [<strong>{{username}}</strong>]",
+    "form": {
+      "button": "Save"
+    },
+    "messages": {
+      "error": "<strong>An error has occurred!</strong> The password could not be changed.",
+      "success": "<strong>Password changed!</strong>"
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/register.json b/borestop/src/main/webapp/i18n/en/register.json
new file mode 100644
index 0000000000000000000000000000000000000000..1a0aeecfcca6d62c5ae8362651c0943302858700
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/register.json
@@ -0,0 +1,24 @@
+{
+  "register": {
+    "title": "Registration",
+    "form": {
+      "button": "Register"
+    },
+    "messages": {
+      "validate": {
+        "login": {
+          "required": "Your username is required.",
+          "minlength": "Your username is required to be at least 1 character.",
+          "maxlength": "Your username cannot be longer than 50 characters.",
+          "pattern": "Your username is invalid."
+        }
+      },
+      "success": "<strong>Registration saved!</strong> Please check your email for confirmation.",
+      "error": {
+        "fail": "<strong>Registration failed!</strong> Please try again later.",
+        "userexists": "<strong>Login name already registered!</strong> Please choose another one.",
+        "emailexists": "<strong>Email is already in use!</strong> Please choose another one."
+      }
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/reset.json b/borestop/src/main/webapp/i18n/en/reset.json
new file mode 100644
index 0000000000000000000000000000000000000000..4c35e9a2c338108445acb78354998d192c7b5372
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/reset.json
@@ -0,0 +1,26 @@
+{
+  "reset": {
+    "request": {
+      "title": "Reset your password",
+      "form": {
+        "button": "Reset password"
+      },
+      "messages": {
+        "info": "Enter the email address you used to register",
+        "success": "Check your emails for details on how to reset your password."
+      }
+    },
+    "finish": {
+      "title": "Reset password",
+      "form": {
+        "button": "Validate new password"
+      },
+      "messages": {
+        "info": "Choose a new password",
+        "success": "<strong>Your password has been reset.</strong> Please ",
+        "keymissing": "The reset key is missing.",
+        "error": "Your password couldn't be reset. Remember a password request is only valid for 24 hours."
+      }
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/sessions.json b/borestop/src/main/webapp/i18n/en/sessions.json
new file mode 100644
index 0000000000000000000000000000000000000000..38bf44f70afe212b8944dd1d7bc28debb3fd2885
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/sessions.json
@@ -0,0 +1,15 @@
+{
+  "sessions": {
+    "title": "Active sessions for [<strong>{{username}}</strong>]",
+    "table": {
+      "ipaddress": "IP address",
+      "useragent": "User Agent",
+      "date": "Date",
+      "button": "Invalidate"
+    },
+    "messages": {
+      "success": "<strong>Session invalidated!</strong>",
+      "error": "<strong>An error has occurred!</strong> The session could not be invalidated."
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/settings.json b/borestop/src/main/webapp/i18n/en/settings.json
new file mode 100644
index 0000000000000000000000000000000000000000..508c037c3bce641047f8e5bdcb7c88e71f5f7e94
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/settings.json
@@ -0,0 +1,32 @@
+{
+  "settings": {
+    "title": "User settings for [<strong>{{username}}</strong>]",
+    "form": {
+      "firstname": "First Name",
+      "firstname.placeholder": "Your first name",
+      "lastname": "Last Name",
+      "lastname.placeholder": "Your last name",
+      "language": "Language",
+      "button": "Save"
+    },
+    "messages": {
+      "error": {
+        "fail": "<strong>An error has occurred!</strong> Settings could not be saved.",
+        "emailexists": "<strong>Email is already in use!</strong> Please choose another one."
+      },
+      "success": "<strong>Settings saved!</strong>",
+      "validate": {
+        "firstname": {
+          "required": "Your first name is required.",
+          "minlength": "Your first name is required to be at least 1 character",
+          "maxlength": "Your first name cannot be longer than 50 characters"
+        },
+        "lastname": {
+          "required": "Your last name is required.",
+          "minlength": "Your last name is required to be at least 1 character",
+          "maxlength": "Your last name cannot be longer than 50 characters"
+        }
+      }
+    }
+  }
+}
diff --git a/borestop/src/main/webapp/i18n/en/user-management.json b/borestop/src/main/webapp/i18n/en/user-management.json
new file mode 100644
index 0000000000000000000000000000000000000000..4923c0911836c00adda5086deff7ba83affbb25e
--- /dev/null
+++ b/borestop/src/main/webapp/i18n/en/user-management.json
@@ -0,0 +1,30 @@
+{
+  "userManagement": {
+    "home": {
+      "title": "Users",
+      "createLabel": "Create a new user",
+      "createOrEditLabel": "Create or edit a user"
+    },
+    "created": "A new user is created with identifier {{ param }}",
+    "updated": "A user is updated with identifier {{ param }}",
+    "deleted": "A user is deleted with identifier {{ param }}",
+    "delete": {
+      "question": "Are you sure you want to delete user {{ login }}?"
+    },
+    "detail": {
+      "title": "User"
+    },
+    "login": "Login",
+    "firstName": "First name",
+    "lastName": "Last name",
+    "email": "Email",
+    "activated": "Activated",
+    "deactivated": "Deactivated",
+    "profiles": "Profiles",
+    "langKey": "Language",
+    "createdBy": "Created by",
+    "createdDate": "Created date",
+    "lastModifiedBy": "Modified by",
+    "lastModifiedDate": "Modified date"
+  }
+}
diff --git a/borestop/src/main/webapp/index.html b/borestop/src/main/webapp/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..6f64fe50a1e00aff7f09209d05a7fb491d0275b7
--- /dev/null
+++ b/borestop/src/main/webapp/index.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<html class="no-js" lang="en" dir="ltr">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>borestop</title>
+    <meta name="description" content="Description for borestop">
+    <meta name="google" content="notranslate">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="theme-color" content="#000000">
+    <link rel="icon" href="favicon.ico" />
+    <link rel="manifest" href="manifest.webapp" />
+    <link rel="stylesheet" href="content/css/loading.css">
+    <!-- jhipster-needle-add-resources-to-root - JHipster will add new resources here -->
+</head>
+<body>
+    <!--[if lt IE 9]>
+        <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+    <![endif]-->
+    <jhi-main>
+        <div class="app-loading">
+            <div class="lds-css ng-scope">
+                <div class="lds-pacman">
+                    <div><div></div><div></div><div></div></div>
+                    <div><div></div><div></div><div></div></div>
+                </div>
+            </div>
+        </div>
+        <div class="app-loading">
+            <div id="jhipster-error" style="display:none">
+                <!-- This content is for troubleshooting purpose and will be removed when app renders -->
+                <h1>An error has occurred :-(</h1>
+                <h2>Usual error causes</h2>
+                <ol>
+                    <li>You started the application from an IDE and you didn't run <code style="color:red">npm start</code> or <code style="color:red">npm run webpack:build</code>.</li>
+                    <li>You had a network error while running <code style="color:red">npm install</code>. If you are behind a corporate proxy, it is likely that this error was caused by your proxy. Have a look at the JHipster error logs, you will probably have the cause of the error.</li>
+                    <li>You installed a Node.js version that doesn't work with JHipster: please use an LTS (long-term support) version, as it's the only version we support.</li>
+                </ol>
+                <h2>Building the client side code again</h2>
+                <p>If you want to go fast, run <code style="color:red">./mvnw</code> to build and run everything.</p>
+                <p>If you want to have more control, so you can debug your issue more easily, you should follow the following steps:</p>
+                <ol>
+                    <li>Install npm dependencies with the command <code style="color:red">npm install</code></li>
+                    <li>Build the client with the command <code style="color:red">npm run webpack:build</code> or <code style="color:red">npm start</code></li>
+                    <li>Start the server with <code style="color:red">./mvnw</code> or using your IDE</li>
+                </ol>
+
+                <h2>Getting more help</h2>
+
+                <h3>If you have a question on how to use JHipster</h3>
+                <p>
+                    Go to Stack Overflow with the <a href="http://stackoverflow.com/tags/jhipster" target="_blank" rel="noopener noreferrer">"jhipster"</a> tag.
+                </p>
+
+                <h3>If you have a bug or a feature request</h3>
+                <p>
+                    First read our <a href="https://github.com/jhipster/generator-jhipster/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contributing guidelines</a>.
+                </p>
+                <p>
+                    Then, fill a ticket on our <a href="https://github.com/jhipster/generator-jhipster/issues/new/choose" target="_blank" rel="noopener noreferrer">bug tracker</a>, we'll be happy to resolve your issue!
+                </p>
+
+                <h3>If you want to chat with contributors and other users</h3>
+                <p>
+                    Join our chat room on <a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer">Gitter.im</a>. Please note that this is a public chat room, and that we expect you to respect other people and write in a correct English language!
+                </p>
+                <!-- end of troubleshooting content -->
+            </div>
+        </div>
+    </jhi-main>
+    <noscript>
+        <h1>You must enable javascript to view this page.</h1>
+    </noscript>
+    <script type="text/javascript" language="javascript">
+        // show an error message if the app loading takes more than 5 sec
+        window.onload=function() {
+            setTimeout(showError, 4000);
+        }
+        function showError() {
+            var errorElm = document.getElementById("jhipster-error");
+            if (errorElm && errorElm.style) {
+                errorElm.style.display = "block";
+            }
+        }
+    </script>
+    <!-- uncomment this for adding service worker
+        <script>
+            if ('serviceWorker' in navigator) {
+                window.addEventListener('load', function() {
+                    navigator.serviceWorker.register('/service-worker.js')
+                        .then(function () {
+                            console.log('Service Worker Registered');
+                        });
+                });
+            }
+        </script>
+    -->
+    <!-- Google Analytics: uncomment and change UA-XXXXX-X to be your site's ID.
+    <script>
+        (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+        function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+        e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+        e.src='//www.google-analytics.com/analytics.js';
+        r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+        ga('create','UA-XXXXX-X');ga('send','pageview');
+    </script>-->
+</body>
+</html>
diff --git a/borestop/src/main/webapp/manifest.webapp b/borestop/src/main/webapp/manifest.webapp
new file mode 100644
index 0000000000000000000000000000000000000000..b74d738cf60de4994c1e6050b923371a3911fc08
--- /dev/null
+++ b/borestop/src/main/webapp/manifest.webapp
@@ -0,0 +1,31 @@
+{
+  "name": "Borestop",
+  "short_name": "Borestop",
+  "icons": [
+    {
+      "src": "./content/images/jhipster_family_member_2_head-192.png",
+      "sizes": "192x192",
+      "type": "image/png"
+    },
+    {
+      "src": "./content/images/jhipster_family_member_2_head-256.png",
+      "sizes": "256x256",
+      "type": "image/png"
+    },
+    {
+      "src": "./content/images/jhipster_family_member_2_head-384.png",
+      "sizes": "384x384",
+      "type": "image/png"
+    },
+    {
+      "src": "./content/images/jhipster_family_member_2_head-512.png",
+      "sizes": "512x512",
+      "type": "image/png"
+    }
+  ],
+  "theme_color": "#000000",
+  "background_color": "#e0e0e0",
+  "start_url": ".",
+  "display": "standalone",
+  "orientation": "portrait"
+}
diff --git a/borestop/src/main/webapp/robots.txt b/borestop/src/main/webapp/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7cda27477dd9534369494774fae9cecac511c77a
--- /dev/null
+++ b/borestop/src/main/webapp/robots.txt
@@ -0,0 +1,11 @@
+# robotstxt.org/
+
+User-agent: *
+Disallow: /api/account
+Disallow: /api/account/change-password
+Disallow: /api/account/sessions
+Disallow: /api/audits/
+Disallow: /api/logs/
+Disallow: /api/users/
+Disallow: /management/
+Disallow: /v2/api-docs/
diff --git a/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif b/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif
new file mode 100644
index 0000000000000000000000000000000000000000..06393889242fb3ea9e0205fa84369ec7bb66d15a
Binary files /dev/null and b/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif differ
diff --git a/borestop/src/main/webapp/swagger-ui/index.html b/borestop/src/main/webapp/swagger-ui/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..bdabf17ba19eca928e6a34b8e8b379fe9382b5fe
--- /dev/null
+++ b/borestop/src/main/webapp/swagger-ui/index.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>borestop - Swagger UI</title>
+    <link rel="stylesheet" type="text/css" href="./swagger-ui.css">
+    <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32"/>
+    <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16"/>
+</head>
+
+<body>
+<div id="swagger-ui"></div>
+
+<script src="./swagger-ui-bundle.js"></script>
+<script src="./swagger-ui-standalone-preset.js"></script>
+<script src="./axios.min.js"></script>
+
+
+<script type="text/javascript">
+    window.onload = function () {
+
+
+        var urls = [];
+        axios.get("/swagger-resources").then(function (response) {
+            response.data.forEach(function (resource) {
+                urls.push({"name": resource.name, "url": resource.location});
+            });
+
+            urls.sort(function (a, b) {
+                var x = a.name.toLowerCase(), y = b.name.toLowerCase();
+                return x < y ? -1 : x > y ? 1 : 0;
+            });
+
+            // Build a system
+            var ui = SwaggerUIBundle({
+                urls: urls,
+                dom_id: '#swagger-ui',
+                deepLinking: true,
+                filter: true,
+                layout: "StandaloneLayout",
+                withCredentials: true,
+                presets: [
+                    SwaggerUIBundle.presets.apis,
+                    SwaggerUIStandalonePreset
+                ],
+                plugins: [
+                    SwaggerUIBundle.plugins.DownloadUrl
+                ],
+                requestInterceptor: function (req) {
+                    var authToken = JSON.parse(localStorage.getItem("jhi-authenticationtoken")
+                        || sessionStorage.getItem("jhi-authenticationtoken"));
+                    if (authToken) {
+                        req.headers['Authorization'] = "Bearer " + authToken;
+                    }
+                    return req;
+                }
+            });
+
+            window.ui = ui
+        });
+
+    };
+</script>
+</body>
+</html>
diff --git a/borestop/src/test/java/com/ippon/borestop/ArchTest.java b/borestop/src/test/java/com/ippon/borestop/ArchTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a9744e82f50ee8fcf80381a3c97027c943d112f
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/ArchTest.java
@@ -0,0 +1,29 @@
+package com.ippon.borestop;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.core.importer.ImportOption;
+import org.junit.jupiter.api.Test;
+
+class ArchTest {
+
+  @Test
+  void servicesAndRepositoriesShouldNotDependOnWebLayer() {
+    JavaClasses importedClasses = new ClassFileImporter()
+      .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
+      .importPackages("com.ippon.borestop");
+
+    noClasses()
+      .that()
+      .resideInAnyPackage("com.ippon.borestop.service..")
+      .or()
+      .resideInAnyPackage("com.ippon.borestop.repository..")
+      .should()
+      .dependOnClassesThat()
+      .resideInAnyPackage("..com.ippon.borestop.web..")
+      .because("Services and repositories should not depend on web layer")
+      .check(importedClasses);
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..bfec6ca7a98d00f69bdf4e971279132de0642412
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java
@@ -0,0 +1,24 @@
+package com.ippon.borestop.config;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+
+import com.ippon.borestop.service.MailService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class NoOpMailConfiguration {
+  private final MailService mockMailService;
+
+  public NoOpMailConfiguration() {
+    mockMailService = mock(MailService.class);
+    doNothing().when(mockMailService).sendActivationEmail(any());
+  }
+
+  @Bean
+  public MailService mailService() {
+    return mockMailService;
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..959eb67137ba14f38a8dc7b69478dbcee338b5d7
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java
@@ -0,0 +1,75 @@
+package com.ippon.borestop.config;
+
+import static com.ippon.borestop.config.StaticResourcesWebConfiguration.*;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.*;
+
+import io.github.jhipster.config.JHipsterDefaults;
+import io.github.jhipster.config.JHipsterProperties;
+import java.util.concurrent.TimeUnit;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.http.CacheControl;
+import org.springframework.mock.web.MockServletContext;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+
+public class StaticResourcesWebConfigurerTest {
+  public static final int MAX_AGE_TEST = 5;
+  public StaticResourcesWebConfiguration staticResourcesWebConfiguration;
+  private ResourceHandlerRegistry resourceHandlerRegistry;
+  private MockServletContext servletContext;
+  private WebApplicationContext applicationContext;
+  private JHipsterProperties props;
+
+  @BeforeEach
+  void setUp() {
+    servletContext = spy(new MockServletContext());
+    applicationContext = mock(WebApplicationContext.class);
+    resourceHandlerRegistry = spy(new ResourceHandlerRegistry(applicationContext, servletContext));
+    props = new JHipsterProperties();
+    staticResourcesWebConfiguration = spy(new StaticResourcesWebConfiguration(props));
+  }
+
+  @Test
+  public void shouldAppendResourceHandlerAndInitiliazeIt() {
+    staticResourcesWebConfiguration.addResourceHandlers(resourceHandlerRegistry);
+
+    verify(resourceHandlerRegistry, times(1)).addResourceHandler(RESOURCE_PATHS);
+    verify(staticResourcesWebConfiguration, times(1)).initializeResourceHandler(any(ResourceHandlerRegistration.class));
+    for (String testingPath : RESOURCE_PATHS) {
+      assertThat(resourceHandlerRegistry.hasMappingForPattern(testingPath)).isTrue();
+    }
+  }
+
+  @Test
+  public void shouldInitializeResourceHandlerWithCacheControlAndLocations() {
+    CacheControl ccExpected = CacheControl.maxAge(5, TimeUnit.DAYS).cachePublic();
+    when(staticResourcesWebConfiguration.getCacheControl()).thenReturn(ccExpected);
+    ResourceHandlerRegistration resourceHandlerRegistration = spy(new ResourceHandlerRegistration(RESOURCE_PATHS));
+
+    staticResourcesWebConfiguration.initializeResourceHandler(resourceHandlerRegistration);
+
+    verify(staticResourcesWebConfiguration, times(1)).getCacheControl();
+    verify(resourceHandlerRegistration, times(1)).setCacheControl(ccExpected);
+    verify(resourceHandlerRegistration, times(1)).addResourceLocations(RESOURCE_LOCATIONS);
+  }
+
+  @Test
+  public void shoudCreateCacheControlBasedOnJhipsterDefaultProperties() {
+    CacheControl cacheExpected = CacheControl.maxAge(JHipsterDefaults.Http.Cache.timeToLiveInDays, TimeUnit.DAYS).cachePublic();
+    assertThat(staticResourcesWebConfiguration.getCacheControl())
+      .extracting(CacheControl::getHeaderValue)
+      .isEqualTo(cacheExpected.getHeaderValue());
+  }
+
+  @Test
+  public void shoudCreateCacheControlWithSpecificConfigurationInProperties() {
+    props.getHttp().getCache().setTimeToLiveInDays(MAX_AGE_TEST);
+    CacheControl cacheExpected = CacheControl.maxAge(MAX_AGE_TEST, TimeUnit.DAYS).cachePublic();
+    assertThat(staticResourcesWebConfiguration.getCacheControl())
+      .extracting(CacheControl::getHeaderValue)
+      .isEqualTo(cacheExpected.getHeaderValue());
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..dad507c5cff99e0740c8833306b2f5440480ff56
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java
@@ -0,0 +1,147 @@
+package com.ippon.borestop.config;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import io.github.jhipster.config.JHipsterConstants;
+import io.github.jhipster.config.JHipsterProperties;
+import io.github.jhipster.web.filter.CachingHttpHeadersFilter;
+import java.io.File;
+import java.util.*;
+import javax.servlet.*;
+import org.h2.server.web.WebServlet;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.mock.env.MockEnvironment;
+import org.springframework.mock.web.MockServletContext;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+/**
+ * Unit tests for the {@link WebConfigurer} class.
+ */
+public class WebConfigurerTest {
+  private WebConfigurer webConfigurer;
+
+  private MockServletContext servletContext;
+
+  private MockEnvironment env;
+
+  private JHipsterProperties props;
+
+  @BeforeEach
+  public void setup() {
+    servletContext = spy(new MockServletContext());
+    doReturn(mock(FilterRegistration.Dynamic.class)).when(servletContext).addFilter(anyString(), any(Filter.class));
+    doReturn(mock(ServletRegistration.Dynamic.class)).when(servletContext).addServlet(anyString(), any(Servlet.class));
+
+    env = new MockEnvironment();
+    props = new JHipsterProperties();
+
+    webConfigurer = new WebConfigurer(env, props);
+  }
+
+  @Test
+  public void testStartUpProdServletContext() throws ServletException {
+    env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION);
+    webConfigurer.onStartup(servletContext);
+
+    verify(servletContext, never()).addServlet(eq("H2Console"), any(WebServlet.class));
+  }
+
+  @Test
+  public void testStartUpDevServletContext() throws ServletException {
+    env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT);
+    webConfigurer.onStartup(servletContext);
+
+    verify(servletContext).addServlet(eq("H2Console"), any(WebServlet.class));
+  }
+
+  @Test
+  public void testCustomizeServletContainer() {
+    env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION);
+    UndertowServletWebServerFactory container = new UndertowServletWebServerFactory();
+    webConfigurer.customize(container);
+    assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg");
+    assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8");
+    assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8");
+    if (container.getDocumentRoot() != null) {
+      assertThat(container.getDocumentRoot()).isEqualTo(new File("target/classes/static/"));
+    }
+  }
+
+  @Test
+  public void testCorsFilterOnApiPath() throws Exception {
+    props.getCors().setAllowedOrigins(Collections.singletonList("*"));
+    props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
+    props.getCors().setAllowedHeaders(Collections.singletonList("*"));
+    props.getCors().setMaxAge(1800L);
+    props.getCors().setAllowCredentials(true);
+
+    MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build();
+
+    mockMvc
+      .perform(
+        options("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com").header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST")
+      )
+      .andExpect(status().isOk())
+      .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com"))
+      .andExpect(header().string(HttpHeaders.VARY, "Origin"))
+      .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE"))
+      .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"))
+      .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800"));
+
+    mockMvc
+      .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com"))
+      .andExpect(status().isOk())
+      .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com"));
+  }
+
+  @Test
+  public void testCorsFilterOnOtherPath() throws Exception {
+    props.getCors().setAllowedOrigins(Collections.singletonList("*"));
+    props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
+    props.getCors().setAllowedHeaders(Collections.singletonList("*"));
+    props.getCors().setMaxAge(1800L);
+    props.getCors().setAllowCredentials(true);
+
+    MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build();
+
+    mockMvc
+      .perform(get("/test/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com"))
+      .andExpect(status().isOk())
+      .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
+  }
+
+  @Test
+  public void testCorsFilterDeactivated() throws Exception {
+    props.getCors().setAllowedOrigins(null);
+
+    MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build();
+
+    mockMvc
+      .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com"))
+      .andExpect(status().isOk())
+      .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
+  }
+
+  @Test
+  public void testCorsFilterDeactivated2() throws Exception {
+    props.getCors().setAllowedOrigins(new ArrayList<>());
+
+    MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build();
+
+    mockMvc
+      .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com"))
+      .andExpect(status().isOk())
+      .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a9fdff2a73195b6571b5668d35d68506fef3319
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java
@@ -0,0 +1,14 @@
+package com.ippon.borestop.config;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class WebConfigurerTestController {
+
+  @GetMapping("/api/test-cors")
+  public void testCorsOnApiPath() {}
+
+  @GetMapping("/test/test-cors")
+  public void testCorsOnOtherPath() {}
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1a9932729e1b7bcf350e5df6d88197cd965a27e
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java
@@ -0,0 +1,162 @@
+package com.ippon.borestop.config.timezone;
+
+import static java.lang.String.format;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.repository.timezone.DateTimeWrapper;
+import com.ippon.borestop.repository.timezone.DateTimeWrapperRepository;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.rowset.SqlRowSet;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for the ZoneId Hibernate configuration.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+public class HibernateTimeZoneIT {
+  @Autowired
+  private DateTimeWrapperRepository dateTimeWrapperRepository;
+
+  @Autowired
+  private JdbcTemplate jdbcTemplate;
+
+  @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}")
+  private String zoneId;
+
+  private DateTimeWrapper dateTimeWrapper;
+  private DateTimeFormatter dateTimeFormatter;
+  private DateTimeFormatter timeFormatter;
+  private DateTimeFormatter dateFormatter;
+
+  @BeforeEach
+  public void setup() {
+    dateTimeWrapper = new DateTimeWrapper();
+    dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z"));
+    dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0"));
+    dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z"));
+    dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z"));
+    dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00"));
+    dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00"));
+    dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10"));
+
+    dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId));
+
+    timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId));
+
+    dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+  }
+
+  @Test
+  @Transactional
+  public void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("instant", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant());
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("local_time", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper
+      .getLocalTime()
+      .atDate(LocalDate.of(1970, Month.JANUARY, 1))
+      .atZone(ZoneId.systemDefault())
+      .format(timeFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("offset_time", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper
+      .getOffsetTime()
+      .toLocalTime()
+      .atDate(LocalDate.of(1970, Month.JANUARY, 1))
+      .atZone(ZoneId.systemDefault())
+      .format(timeFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  @Test
+  @Transactional
+  public void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() {
+    dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
+
+    String request = generateSqlRequest("local_date", dateTimeWrapper.getId());
+    SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
+    String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter);
+
+    assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
+  }
+
+  private String generateSqlRequest(String fieldName, long id) {
+    return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id);
+  }
+
+  private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) {
+    while (sqlRowSet.next()) {
+      String dbValue = sqlRowSet.getString(1);
+
+      assertThat(dbValue).isNotNull();
+      assertThat(dbValue).isEqualTo(expectedValue);
+    }
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..22d84fe994995b3c9e2a6d2ab0bdbdfbe3922015
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java
@@ -0,0 +1,154 @@
+package com.ippon.borestop.repository;
+
+import static com.ippon.borestop.repository.CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.config.audit.AuditEventConverter;
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpSession;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.audit.AuditEvent;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpSession;
+import org.springframework.security.web.authentication.WebAuthenticationDetails;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for {@link CustomAuditEventRepository}.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+@Transactional
+public class CustomAuditEventRepositoryIT {
+  @Autowired
+  private PersistenceAuditEventRepository persistenceAuditEventRepository;
+
+  @Autowired
+  private AuditEventConverter auditEventConverter;
+
+  private CustomAuditEventRepository customAuditEventRepository;
+
+  @BeforeEach
+  public void setup() {
+    customAuditEventRepository = new CustomAuditEventRepository(persistenceAuditEventRepository, auditEventConverter);
+    persistenceAuditEventRepository.deleteAll();
+    Instant oneHourAgo = Instant.now().minusSeconds(3600);
+
+    PersistentAuditEvent testUserEvent = new PersistentAuditEvent();
+    testUserEvent.setPrincipal("test-user");
+    testUserEvent.setAuditEventType("test-type");
+    testUserEvent.setAuditEventDate(oneHourAgo);
+    Map<String, String> data = new HashMap<>();
+    data.put("test-key", "test-value");
+    testUserEvent.setData(data);
+
+    PersistentAuditEvent testOldUserEvent = new PersistentAuditEvent();
+    testOldUserEvent.setPrincipal("test-user");
+    testOldUserEvent.setAuditEventType("test-type");
+    testOldUserEvent.setAuditEventDate(oneHourAgo.minusSeconds(10000));
+
+    PersistentAuditEvent testOtherUserEvent = new PersistentAuditEvent();
+    testOtherUserEvent.setPrincipal("other-test-user");
+    testOtherUserEvent.setAuditEventType("test-type");
+    testOtherUserEvent.setAuditEventDate(oneHourAgo);
+  }
+
+  @Test
+  public void addAuditEvent() {
+    Map<String, Object> data = new HashMap<>();
+    data.put("test-key", "test-value");
+    AuditEvent event = new AuditEvent("test-user", "test-type", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(1);
+    PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0);
+    assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal());
+    assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType());
+    assertThat(persistentAuditEvent.getData()).containsKey("test-key");
+    assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("test-value");
+    assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS))
+      .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS));
+  }
+
+  @Test
+  public void addAuditEventTruncateLargeData() {
+    Map<String, Object> data = new HashMap<>();
+    StringBuilder largeData = new StringBuilder();
+    for (int i = 0; i < EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) {
+      largeData.append("a");
+    }
+    data.put("test-key", largeData);
+    AuditEvent event = new AuditEvent("test-user", "test-type", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(1);
+    PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0);
+    assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal());
+    assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType());
+    assertThat(persistentAuditEvent.getData()).containsKey("test-key");
+    String actualData = persistentAuditEvent.getData().get("test-key");
+    assertThat(actualData.length()).isEqualTo(EVENT_DATA_COLUMN_MAX_LENGTH);
+    assertThat(actualData).isSubstringOf(largeData);
+    assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS))
+      .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS));
+  }
+
+  @Test
+  public void testAddEventWithWebAuthenticationDetails() {
+    HttpSession session = new MockHttpSession(null, "test-session-id");
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.setSession(session);
+    request.setRemoteAddr("1.2.3.4");
+    WebAuthenticationDetails details = new WebAuthenticationDetails(request);
+    Map<String, Object> data = new HashMap<>();
+    data.put("test-key", details);
+    AuditEvent event = new AuditEvent("test-user", "test-type", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(1);
+    PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0);
+    assertThat(persistentAuditEvent.getData().get("remoteAddress")).isEqualTo("1.2.3.4");
+    assertThat(persistentAuditEvent.getData().get("sessionId")).isEqualTo("test-session-id");
+  }
+
+  @Test
+  public void testAddEventWithNullData() {
+    Map<String, Object> data = new HashMap<>();
+    data.put("test-key", null);
+    AuditEvent event = new AuditEvent("test-user", "test-type", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(1);
+    PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0);
+    assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("null");
+  }
+
+  @Test
+  public void addAuditEventWithAnonymousUser() {
+    Map<String, Object> data = new HashMap<>();
+    data.put("test-key", "test-value");
+    AuditEvent event = new AuditEvent(Constants.ANONYMOUS_USER, "test-type", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(0);
+  }
+
+  @Test
+  public void addAuditEventWithAuthorizationFailureType() {
+    Map<String, Object> data = new HashMap<>();
+    data.put("test-key", "test-value");
+    AuditEvent event = new AuditEvent("test-user", "AUTHORIZATION_FAILURE", data);
+    customAuditEventRepository.add(event);
+    List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll();
+    assertThat(persistentAuditEvents).hasSize(0);
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..625d95d307ef08d8597cd329e58c5956f86e1371
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java
@@ -0,0 +1,132 @@
+package com.ippon.borestop.repository.timezone;
+
+import java.io.Serializable;
+import java.time.*;
+import java.util.Objects;
+import javax.persistence.*;
+
+@Entity
+@Table(name = "jhi_date_time_wrapper")
+public class DateTimeWrapper implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
+  @SequenceGenerator(name = "sequenceGenerator")
+  private Long id;
+
+  @Column(name = "instant")
+  private Instant instant;
+
+  @Column(name = "local_date_time")
+  private LocalDateTime localDateTime;
+
+  @Column(name = "offset_date_time")
+  private OffsetDateTime offsetDateTime;
+
+  @Column(name = "zoned_date_time")
+  private ZonedDateTime zonedDateTime;
+
+  @Column(name = "local_time")
+  private LocalTime localTime;
+
+  @Column(name = "offset_time")
+  private OffsetTime offsetTime;
+
+  @Column(name = "local_date")
+  private LocalDate localDate;
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public Instant getInstant() {
+    return instant;
+  }
+
+  public void setInstant(Instant instant) {
+    this.instant = instant;
+  }
+
+  public LocalDateTime getLocalDateTime() {
+    return localDateTime;
+  }
+
+  public void setLocalDateTime(LocalDateTime localDateTime) {
+    this.localDateTime = localDateTime;
+  }
+
+  public OffsetDateTime getOffsetDateTime() {
+    return offsetDateTime;
+  }
+
+  public void setOffsetDateTime(OffsetDateTime offsetDateTime) {
+    this.offsetDateTime = offsetDateTime;
+  }
+
+  public ZonedDateTime getZonedDateTime() {
+    return zonedDateTime;
+  }
+
+  public void setZonedDateTime(ZonedDateTime zonedDateTime) {
+    this.zonedDateTime = zonedDateTime;
+  }
+
+  public LocalTime getLocalTime() {
+    return localTime;
+  }
+
+  public void setLocalTime(LocalTime localTime) {
+    this.localTime = localTime;
+  }
+
+  public OffsetTime getOffsetTime() {
+    return offsetTime;
+  }
+
+  public void setOffsetTime(OffsetTime offsetTime) {
+    this.offsetTime = offsetTime;
+  }
+
+  public LocalDate getLocalDate() {
+    return localDate;
+  }
+
+  public void setLocalDate(LocalDate localDate) {
+    this.localDate = localDate;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+
+    DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o;
+    return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId());
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(getId());
+  }
+
+  // prettier-ignore
+    @Override
+    public String toString() {
+        return "TimeZoneTest{" +
+            "id=" + id +
+            ", instant=" + instant +
+            ", localDateTime=" + localDateTime +
+            ", offsetDateTime=" + offsetDateTime +
+            ", zonedDateTime=" + zonedDateTime +
+            '}';
+    }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..65e5603fdabd34529c2bc58f2003f31c28969850
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java
@@ -0,0 +1,10 @@
+package com.ippon.borestop.repository.timezone;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Spring Data JPA repository for the {@link DateTimeWrapper} entity.
+ */
+@Repository
+public interface DateTimeWrapperRepository extends JpaRepository<DateTimeWrapper, Long> {}
diff --git a/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..c922548b35063f9d038b68acd933eb967889511b
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java
@@ -0,0 +1,111 @@
+package com.ippon.borestop.security;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import java.util.Locale;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integrations tests for {@link DomainUserDetailsService}.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+@Transactional
+public class DomainUserDetailsServiceIT {
+  private static final String USER_ONE_LOGIN = "test-user-one";
+  private static final String USER_ONE_EMAIL = "test-user-one@localhost";
+  private static final String USER_TWO_LOGIN = "test-user-two";
+  private static final String USER_TWO_EMAIL = "test-user-two@localhost";
+  private static final String USER_THREE_LOGIN = "test-user-three";
+  private static final String USER_THREE_EMAIL = "test-user-three@localhost";
+
+  @Autowired
+  private UserRepository userRepository;
+
+  @Autowired
+  private UserDetailsService domainUserDetailsService;
+
+  @BeforeEach
+  public void init() {
+    User userOne = new User();
+    userOne.setLogin(USER_ONE_LOGIN);
+    userOne.setPassword(RandomStringUtils.random(60));
+    userOne.setActivated(true);
+    userOne.setEmail(USER_ONE_EMAIL);
+    userOne.setFirstName("userOne");
+    userOne.setLastName("doe");
+    userOne.setLangKey("en");
+    userRepository.save(userOne);
+
+    User userTwo = new User();
+    userTwo.setLogin(USER_TWO_LOGIN);
+    userTwo.setPassword(RandomStringUtils.random(60));
+    userTwo.setActivated(true);
+    userTwo.setEmail(USER_TWO_EMAIL);
+    userTwo.setFirstName("userTwo");
+    userTwo.setLastName("doe");
+    userTwo.setLangKey("en");
+    userRepository.save(userTwo);
+
+    User userThree = new User();
+    userThree.setLogin(USER_THREE_LOGIN);
+    userThree.setPassword(RandomStringUtils.random(60));
+    userThree.setActivated(false);
+    userThree.setEmail(USER_THREE_EMAIL);
+    userThree.setFirstName("userThree");
+    userThree.setLastName("doe");
+    userThree.setLangKey("en");
+    userRepository.save(userThree);
+  }
+
+  @Test
+  public void assertThatUserCanBeFoundByLogin() {
+    UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN);
+    assertThat(userDetails).isNotNull();
+    assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
+  }
+
+  @Test
+  public void assertThatUserCanBeFoundByLoginIgnoreCase() {
+    UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH));
+    assertThat(userDetails).isNotNull();
+    assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
+  }
+
+  @Test
+  public void assertThatUserCanBeFoundByEmail() {
+    UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL);
+    assertThat(userDetails).isNotNull();
+    assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN);
+  }
+
+  @Test
+  public void assertThatUserCanBeFoundByEmailIgnoreCase() {
+    UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH));
+    assertThat(userDetails).isNotNull();
+    assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN);
+  }
+
+  @Test
+  public void assertThatEmailIsPrioritizedOverLogin() {
+    UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL);
+    assertThat(userDetails).isNotNull();
+    assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
+  }
+
+  @Test
+  public void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() {
+    assertThatExceptionOfType(UserNotActivatedException.class)
+      .isThrownBy(() -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN));
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c69760720811d26ee2d6b029beffb210cb9095d8
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java
@@ -0,0 +1,69 @@
+package com.ippon.borestop.security;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Optional;
+import org.junit.jupiter.api.Test;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+/**
+ * Test class for the {@link SecurityUtils} utility class.
+ */
+public class SecurityUtilsUnitTest {
+
+  @Test
+  public void testGetCurrentUserLogin() {
+    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
+    securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin"));
+    SecurityContextHolder.setContext(securityContext);
+    Optional<String> login = SecurityUtils.getCurrentUserLogin();
+    assertThat(login).contains("admin");
+  }
+
+  @Test
+  public void testgetCurrentUserJWT() {
+    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
+    securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token"));
+    SecurityContextHolder.setContext(securityContext);
+    Optional<String> jwt = SecurityUtils.getCurrentUserJWT();
+    assertThat(jwt).contains("token");
+  }
+
+  @Test
+  public void testIsAuthenticated() {
+    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
+    securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin"));
+    SecurityContextHolder.setContext(securityContext);
+    boolean isAuthenticated = SecurityUtils.isAuthenticated();
+    assertThat(isAuthenticated).isTrue();
+  }
+
+  @Test
+  public void testAnonymousIsNotAuthenticated() {
+    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
+    Collection<GrantedAuthority> authorities = new ArrayList<>();
+    authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS));
+    securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities));
+    SecurityContextHolder.setContext(securityContext);
+    boolean isAuthenticated = SecurityUtils.isAuthenticated();
+    assertThat(isAuthenticated).isFalse();
+  }
+
+  @Test
+  public void testIsCurrentUserInRole() {
+    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
+    Collection<GrantedAuthority> authorities = new ArrayList<>();
+    authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER));
+    securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities));
+    SecurityContextHolder.setContext(securityContext);
+
+    assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.USER)).isTrue();
+    assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.ADMIN)).isFalse();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ea6d0153dc7f786129acf762f1670ca9d510d05
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java
@@ -0,0 +1,115 @@
+package com.ippon.borestop.security.jwt;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.security.AuthoritiesConstants;
+import io.github.jhipster.config.JHipsterProperties;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.security.Keys;
+import java.util.Collections;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.http.HttpStatus;
+import org.springframework.mock.web.MockFilterChain;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.util.ReflectionTestUtils;
+
+public class JWTFilterTest {
+  private TokenProvider tokenProvider;
+
+  private JWTFilter jwtFilter;
+
+  @BeforeEach
+  public void setup() {
+    JHipsterProperties jHipsterProperties = new JHipsterProperties();
+    tokenProvider = new TokenProvider(jHipsterProperties);
+    ReflectionTestUtils.setField(
+      tokenProvider,
+      "key",
+      Keys.hmacShaKeyFor(
+        Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")
+      )
+    );
+
+    ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000);
+    jwtFilter = new JWTFilter(tokenProvider);
+    SecurityContextHolder.getContext().setAuthentication(null);
+  }
+
+  @Test
+  public void testJWTFilter() throws Exception {
+    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
+      "test-user",
+      "test-password",
+      Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER))
+    );
+    String jwt = tokenProvider.createToken(authentication, false);
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
+    request.setRequestURI("/api/test");
+    MockHttpServletResponse response = new MockHttpServletResponse();
+    MockFilterChain filterChain = new MockFilterChain();
+    jwtFilter.doFilter(request, response, filterChain);
+    assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
+    assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user");
+    assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials().toString()).isEqualTo(jwt);
+  }
+
+  @Test
+  public void testJWTFilterInvalidToken() throws Exception {
+    String jwt = "wrong_jwt";
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
+    request.setRequestURI("/api/test");
+    MockHttpServletResponse response = new MockHttpServletResponse();
+    MockFilterChain filterChain = new MockFilterChain();
+    jwtFilter.doFilter(request, response, filterChain);
+    assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
+    assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull();
+  }
+
+  @Test
+  public void testJWTFilterMissingAuthorization() throws Exception {
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.setRequestURI("/api/test");
+    MockHttpServletResponse response = new MockHttpServletResponse();
+    MockFilterChain filterChain = new MockFilterChain();
+    jwtFilter.doFilter(request, response, filterChain);
+    assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
+    assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull();
+  }
+
+  @Test
+  public void testJWTFilterMissingToken() throws Exception {
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer ");
+    request.setRequestURI("/api/test");
+    MockHttpServletResponse response = new MockHttpServletResponse();
+    MockFilterChain filterChain = new MockFilterChain();
+    jwtFilter.doFilter(request, response, filterChain);
+    assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
+    assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull();
+  }
+
+  @Test
+  public void testJWTFilterWrongScheme() throws Exception {
+    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
+      "test-user",
+      "test-password",
+      Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER))
+    );
+    String jwt = tokenProvider.createToken(authentication, false);
+    MockHttpServletRequest request = new MockHttpServletRequest();
+    request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt);
+    request.setRequestURI("/api/test");
+    MockHttpServletResponse response = new MockHttpServletResponse();
+    MockFilterChain filterChain = new MockFilterChain();
+    jwtFilter.doFilter(request, response, filterChain);
+    assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
+    assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..72c5e1d38ecd49d2d5240b421d340a71dc8158bb
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java
@@ -0,0 +1,106 @@
+package com.ippon.borestop.security.jwt;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.security.AuthoritiesConstants;
+import io.github.jhipster.config.JHipsterProperties;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.security.Keys;
+import java.security.Key;
+import java.util.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.test.util.ReflectionTestUtils;
+
+public class TokenProviderTest {
+  private static final long ONE_MINUTE = 60000;
+
+  private Key key;
+  private TokenProvider tokenProvider;
+
+  @BeforeEach
+  public void setup() {
+    tokenProvider = new TokenProvider(new JHipsterProperties());
+    key =
+      Keys.hmacShaKeyFor(
+        Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")
+      );
+
+    ReflectionTestUtils.setField(tokenProvider, "key", key);
+    ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE);
+  }
+
+  @Test
+  public void testReturnFalseWhenJWThasInvalidSignature() {
+    boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature());
+
+    assertThat(isTokenValid).isEqualTo(false);
+  }
+
+  @Test
+  public void testReturnFalseWhenJWTisMalformed() {
+    Authentication authentication = createAuthentication();
+    String token = tokenProvider.createToken(authentication, false);
+    String invalidToken = token.substring(1);
+    boolean isTokenValid = tokenProvider.validateToken(invalidToken);
+
+    assertThat(isTokenValid).isEqualTo(false);
+  }
+
+  @Test
+  public void testReturnFalseWhenJWTisExpired() {
+    ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE);
+
+    Authentication authentication = createAuthentication();
+    String token = tokenProvider.createToken(authentication, false);
+
+    boolean isTokenValid = tokenProvider.validateToken(token);
+
+    assertThat(isTokenValid).isEqualTo(false);
+  }
+
+  @Test
+  public void testReturnFalseWhenJWTisUnsupported() {
+    String unsupportedToken = createUnsupportedToken();
+
+    boolean isTokenValid = tokenProvider.validateToken(unsupportedToken);
+
+    assertThat(isTokenValid).isEqualTo(false);
+  }
+
+  @Test
+  public void testReturnFalseWhenJWTisInvalid() {
+    boolean isTokenValid = tokenProvider.validateToken("");
+
+    assertThat(isTokenValid).isEqualTo(false);
+  }
+
+  private Authentication createAuthentication() {
+    Collection<GrantedAuthority> authorities = new ArrayList<>();
+    authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS));
+    return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities);
+  }
+
+  private String createUnsupportedToken() {
+    return Jwts.builder().setPayload("payload").signWith(key, SignatureAlgorithm.HS512).compact();
+  }
+
+  private String createTokenWithDifferentSignature() {
+    Key otherKey = Keys.hmacShaKeyFor(
+      Decoders.BASE64.decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")
+    );
+
+    return Jwts
+      .builder()
+      .setSubject("anonymous")
+      .signWith(otherKey, SignatureAlgorithm.HS512)
+      .setExpiration(new Date(new Date().getTime() + ONE_MINUTE))
+      .compact();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..984cd63b798370e6776d0a2b68ad65188df68b77
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java
@@ -0,0 +1,75 @@
+package com.ippon.borestop.service;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import com.ippon.borestop.repository.PersistenceAuditEventRepository;
+import io.github.jhipster.config.JHipsterProperties;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for {@link AuditEventService}.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+@Transactional
+public class AuditEventServiceIT {
+  @Autowired
+  private AuditEventService auditEventService;
+
+  @Autowired
+  private PersistenceAuditEventRepository persistenceAuditEventRepository;
+
+  @Autowired
+  private JHipsterProperties jHipsterProperties;
+
+  private PersistentAuditEvent auditEventOld;
+
+  private PersistentAuditEvent auditEventWithinRetention;
+
+  private PersistentAuditEvent auditEventNew;
+
+  @BeforeEach
+  public void init() {
+    auditEventOld = new PersistentAuditEvent();
+    auditEventOld.setAuditEventDate(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() + 1, ChronoUnit.DAYS));
+    auditEventOld.setPrincipal("test-user-old");
+    auditEventOld.setAuditEventType("test-type");
+
+    auditEventWithinRetention = new PersistentAuditEvent();
+    auditEventWithinRetention.setAuditEventDate(
+      Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() - 1, ChronoUnit.DAYS)
+    );
+    auditEventWithinRetention.setPrincipal("test-user-retention");
+    auditEventWithinRetention.setAuditEventType("test-type");
+
+    auditEventNew = new PersistentAuditEvent();
+    auditEventNew.setAuditEventDate(Instant.now());
+    auditEventNew.setPrincipal("test-user-new");
+    auditEventNew.setAuditEventType("test-type");
+  }
+
+  @Test
+  @Transactional
+  public void verifyOldAuditEventsAreDeleted() {
+    persistenceAuditEventRepository.deleteAll();
+    persistenceAuditEventRepository.save(auditEventOld);
+    persistenceAuditEventRepository.save(auditEventWithinRetention);
+    persistenceAuditEventRepository.save(auditEventNew);
+
+    persistenceAuditEventRepository.flush();
+    auditEventService.removeOldAuditEvents();
+    persistenceAuditEventRepository.flush();
+
+    assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(2);
+    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty();
+    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty();
+    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e9a8619244434f1742e089ae3eb3a4bbd9f6679
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java
@@ -0,0 +1,244 @@
+package com.ippon.borestop.service;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.User;
+import io.github.jhipster.config.JHipsterProperties;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.mail.Multipart;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.MessageSource;
+import org.springframework.mail.MailSendException;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.thymeleaf.spring5.SpringTemplateEngine;
+
+/**
+ * Integration tests for {@link MailService}.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+public class MailServiceIT {
+  private static final String[] languages = {
+    "en"
+  // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array
+  };
+  private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})");
+  private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})");
+
+  @Autowired
+  private JHipsterProperties jHipsterProperties;
+
+  @Autowired
+  private MessageSource messageSource;
+
+  @Autowired
+  private SpringTemplateEngine templateEngine;
+
+  @Spy
+  private JavaMailSenderImpl javaMailSender;
+
+  @Captor
+  private ArgumentCaptor<MimeMessage> messageCaptor;
+
+  private MailService mailService;
+
+  @BeforeEach
+  public void setup() {
+    MockitoAnnotations.initMocks(this);
+    doNothing().when(javaMailSender).send(any(MimeMessage.class));
+    mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine);
+  }
+
+  @Test
+  public void testSendEmail() throws Exception {
+    mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getSubject()).isEqualTo("testSubject");
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com");
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent()).isInstanceOf(String.class);
+    assertThat(message.getContent().toString()).isEqualTo("testContent");
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8");
+  }
+
+  @Test
+  public void testSendHtmlEmail() throws Exception {
+    mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getSubject()).isEqualTo("testSubject");
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com");
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent()).isInstanceOf(String.class);
+    assertThat(message.getContent().toString()).isEqualTo("testContent");
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testSendMultipartEmail() throws Exception {
+    mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    MimeMultipart mp = (MimeMultipart) message.getContent();
+    MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0);
+    ByteArrayOutputStream aos = new ByteArrayOutputStream();
+    part.writeTo(aos);
+    assertThat(message.getSubject()).isEqualTo("testSubject");
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com");
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent()).isInstanceOf(Multipart.class);
+    assertThat(aos.toString()).isEqualTo("\r\ntestContent");
+    assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8");
+  }
+
+  @Test
+  public void testSendMultipartHtmlEmail() throws Exception {
+    mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    MimeMultipart mp = (MimeMultipart) message.getContent();
+    MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0);
+    ByteArrayOutputStream aos = new ByteArrayOutputStream();
+    part.writeTo(aos);
+    assertThat(message.getSubject()).isEqualTo("testSubject");
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com");
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent()).isInstanceOf(Multipart.class);
+    assertThat(aos.toString()).isEqualTo("\r\ntestContent");
+    assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testSendEmailFromTemplate() throws Exception {
+    User user = new User();
+    user.setLogin("john");
+    user.setEmail("john.doe@example.com");
+    user.setLangKey("en");
+    mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title");
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getSubject()).isEqualTo("test title");
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail());
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("<html>test title, http://127.0.0.1:8080, john</html>\n");
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testSendActivationEmail() throws Exception {
+    User user = new User();
+    user.setLangKey(Constants.DEFAULT_LANGUAGE);
+    user.setLogin("john");
+    user.setEmail("john.doe@example.com");
+    mailService.sendActivationEmail(user);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail());
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent().toString()).isNotEmpty();
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testCreationEmail() throws Exception {
+    User user = new User();
+    user.setLangKey(Constants.DEFAULT_LANGUAGE);
+    user.setLogin("john");
+    user.setEmail("john.doe@example.com");
+    mailService.sendCreationEmail(user);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail());
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent().toString()).isNotEmpty();
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testSendPasswordResetMail() throws Exception {
+    User user = new User();
+    user.setLangKey(Constants.DEFAULT_LANGUAGE);
+    user.setLogin("john");
+    user.setEmail("john.doe@example.com");
+    mailService.sendPasswordResetMail(user);
+    verify(javaMailSender).send(messageCaptor.capture());
+    MimeMessage message = messageCaptor.getValue();
+    assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail());
+    assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+    assertThat(message.getContent().toString()).isNotEmpty();
+    assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+  }
+
+  @Test
+  public void testSendEmailWithException() {
+    doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class));
+    try {
+      mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false);
+    } catch (Exception e) {
+      fail("Exception shouldn't have been thrown");
+    }
+  }
+
+  @Test
+  public void testSendLocalizedEmailForAllSupportedLanguages() throws Exception {
+    User user = new User();
+    user.setLogin("john");
+    user.setEmail("john.doe@example.com");
+    for (String langKey : languages) {
+      user.setLangKey(langKey);
+      mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title");
+      verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture());
+      MimeMessage message = messageCaptor.getValue();
+
+      String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties";
+      URL resource = this.getClass().getClassLoader().getResource(propertyFilePath);
+      File file = new File(new URI(resource.getFile()).getPath());
+      Properties properties = new Properties();
+      properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")));
+
+      String emailTitle = (String) properties.get("email.test.title");
+      assertThat(message.getSubject()).isEqualTo(emailTitle);
+      assertThat(message.getContent().toString())
+        .isEqualToNormalizingNewlines("<html>" + emailTitle + ", http://127.0.0.1:8080, john</html>\n");
+    }
+  }
+
+  /**
+   * Convert a lang key to the Java locale.
+   */
+  private String getJavaLocale(String langKey) {
+    String javaLangKey = langKey;
+    Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey);
+    if (matcher2.matches()) {
+      javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase();
+    }
+    Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey);
+    if (matcher3.matches()) {
+      javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase();
+    }
+    return javaLangKey;
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d5c83d38c831bbbc3dc7fc951f0f566fc0faa16
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java
@@ -0,0 +1,197 @@
+package com.ippon.borestop.service;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.service.dto.UserDTO;
+import io.github.jhipster.security.RandomUtil;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.Optional;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.auditing.AuditingHandler;
+import org.springframework.data.auditing.DateTimeProvider;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for {@link UserService}.
+ */
+@SpringBootTest(classes = BorestopApp.class)
+@Transactional
+public class UserServiceIT {
+  private static final String DEFAULT_LOGIN = "johndoe";
+
+  private static final String DEFAULT_EMAIL = "johndoe@localhost";
+
+  private static final String DEFAULT_FIRSTNAME = "john";
+
+  private static final String DEFAULT_LASTNAME = "doe";
+
+  private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50";
+
+  private static final String DEFAULT_LANGKEY = "dummy";
+
+  @Autowired
+  private UserRepository userRepository;
+
+  @Autowired
+  private UserService userService;
+
+  @Autowired
+  private AuditingHandler auditingHandler;
+
+  @Mock
+  private DateTimeProvider dateTimeProvider;
+
+  private User user;
+
+  @BeforeEach
+  public void init() {
+    user = new User();
+    user.setLogin(DEFAULT_LOGIN);
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    user.setEmail(DEFAULT_EMAIL);
+    user.setFirstName(DEFAULT_FIRSTNAME);
+    user.setLastName(DEFAULT_LASTNAME);
+    user.setImageUrl(DEFAULT_IMAGEURL);
+    user.setLangKey(DEFAULT_LANGKEY);
+
+    when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now()));
+    auditingHandler.setDateTimeProvider(dateTimeProvider);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatUserMustExistToResetPassword() {
+    userRepository.saveAndFlush(user);
+    Optional<User> maybeUser = userService.requestPasswordReset("invalid.login@localhost");
+    assertThat(maybeUser).isNotPresent();
+
+    maybeUser = userService.requestPasswordReset(user.getEmail());
+    assertThat(maybeUser).isPresent();
+    assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail());
+    assertThat(maybeUser.orElse(null).getResetDate()).isNotNull();
+    assertThat(maybeUser.orElse(null).getResetKey()).isNotNull();
+  }
+
+  @Test
+  @Transactional
+  public void assertThatOnlyActivatedUserCanRequestPasswordReset() {
+    user.setActivated(false);
+    userRepository.saveAndFlush(user);
+
+    Optional<User> maybeUser = userService.requestPasswordReset(user.getLogin());
+    assertThat(maybeUser).isNotPresent();
+    userRepository.delete(user);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatResetKeyMustNotBeOlderThan24Hours() {
+    Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS);
+    String resetKey = RandomUtil.generateResetKey();
+    user.setActivated(true);
+    user.setResetDate(daysAgo);
+    user.setResetKey(resetKey);
+    userRepository.saveAndFlush(user);
+
+    Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
+    assertThat(maybeUser).isNotPresent();
+    userRepository.delete(user);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatResetKeyMustBeValid() {
+    Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS);
+    user.setActivated(true);
+    user.setResetDate(daysAgo);
+    user.setResetKey("1234");
+    userRepository.saveAndFlush(user);
+
+    Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
+    assertThat(maybeUser).isNotPresent();
+    userRepository.delete(user);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatUserCanResetPassword() {
+    String oldPassword = user.getPassword();
+    Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS);
+    String resetKey = RandomUtil.generateResetKey();
+    user.setActivated(true);
+    user.setResetDate(daysAgo);
+    user.setResetKey(resetKey);
+    userRepository.saveAndFlush(user);
+
+    Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey());
+    assertThat(maybeUser).isPresent();
+    assertThat(maybeUser.orElse(null).getResetDate()).isNull();
+    assertThat(maybeUser.orElse(null).getResetKey()).isNull();
+    assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword);
+
+    userRepository.delete(user);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() {
+    Instant now = Instant.now();
+    when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS)));
+    user.setActivated(false);
+    user.setActivationKey(RandomStringUtils.random(20));
+    User dbUser = userRepository.saveAndFlush(user);
+    dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS));
+    userRepository.saveAndFlush(user);
+    Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS);
+    List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
+    assertThat(users).isNotEmpty();
+    userService.removeNotActivatedUsers();
+    users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
+    assertThat(users).isEmpty();
+  }
+
+  @Test
+  @Transactional
+  public void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() {
+    Instant now = Instant.now();
+    when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS)));
+    user.setActivated(false);
+    User dbUser = userRepository.saveAndFlush(user);
+    dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS));
+    userRepository.saveAndFlush(user);
+    Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS);
+    List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo);
+    assertThat(users).isEmpty();
+    userService.removeNotActivatedUsers();
+    Optional<User> maybeDbUser = userRepository.findById(dbUser.getId());
+    assertThat(maybeDbUser).contains(dbUser);
+  }
+
+  @Test
+  @Transactional
+  public void assertThatAnonymousUserIsNotGet() {
+    user.setLogin(Constants.ANONYMOUS_USER);
+    if (!userRepository.findOneByLogin(Constants.ANONYMOUS_USER).isPresent()) {
+      userRepository.saveAndFlush(user);
+    }
+    final PageRequest pageable = PageRequest.of(0, (int) userRepository.count());
+    final Page<UserDTO> allManagedUsers = userService.getAllManagedUsers(pageable);
+    assertThat(allManagedUsers.getContent().stream().noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin()))).isTrue();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..172ef840b744d87b13fb37013fb822f396b5bb27
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java
@@ -0,0 +1,134 @@
+package com.ippon.borestop.service.mapper;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.service.dto.UserDTO;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit tests for {@link UserMapper}.
+ */
+public class UserMapperTest {
+  private static final String DEFAULT_LOGIN = "johndoe";
+  private static final Long DEFAULT_ID = 1L;
+
+  private UserMapper userMapper;
+  private User user;
+  private UserDTO userDto;
+
+  @BeforeEach
+  public void init() {
+    userMapper = new UserMapper();
+    user = new User();
+    user.setLogin(DEFAULT_LOGIN);
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    user.setEmail("johndoe@localhost");
+    user.setFirstName("john");
+    user.setLastName("doe");
+    user.setImageUrl("image_url");
+    user.setLangKey("en");
+
+    userDto = new UserDTO(user);
+  }
+
+  @Test
+  public void usersToUserDTOsShouldMapOnlyNonNullUsers() {
+    List<User> users = new ArrayList<>();
+    users.add(user);
+    users.add(null);
+
+    List<UserDTO> userDTOS = userMapper.usersToUserDTOs(users);
+
+    assertThat(userDTOS).isNotEmpty();
+    assertThat(userDTOS).size().isEqualTo(1);
+  }
+
+  @Test
+  public void userDTOsToUsersShouldMapOnlyNonNullUsers() {
+    List<UserDTO> usersDto = new ArrayList<>();
+    usersDto.add(userDto);
+    usersDto.add(null);
+
+    List<User> users = userMapper.userDTOsToUsers(usersDto);
+
+    assertThat(users).isNotEmpty();
+    assertThat(users).size().isEqualTo(1);
+  }
+
+  @Test
+  public void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() {
+    Set<String> authoritiesAsString = new HashSet<>();
+    authoritiesAsString.add("ADMIN");
+    userDto.setAuthorities(authoritiesAsString);
+
+    List<UserDTO> usersDto = new ArrayList<>();
+    usersDto.add(userDto);
+
+    List<User> users = userMapper.userDTOsToUsers(usersDto);
+
+    assertThat(users).isNotEmpty();
+    assertThat(users).size().isEqualTo(1);
+    assertThat(users.get(0).getAuthorities()).isNotNull();
+    assertThat(users.get(0).getAuthorities()).isNotEmpty();
+    assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN");
+  }
+
+  @Test
+  public void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() {
+    userDto.setAuthorities(null);
+
+    List<UserDTO> usersDto = new ArrayList<>();
+    usersDto.add(userDto);
+
+    List<User> users = userMapper.userDTOsToUsers(usersDto);
+
+    assertThat(users).isNotEmpty();
+    assertThat(users).size().isEqualTo(1);
+    assertThat(users.get(0).getAuthorities()).isNotNull();
+    assertThat(users.get(0).getAuthorities()).isEmpty();
+  }
+
+  @Test
+  public void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() {
+    Set<String> authoritiesAsString = new HashSet<>();
+    authoritiesAsString.add("ADMIN");
+    userDto.setAuthorities(authoritiesAsString);
+
+    User user = userMapper.userDTOToUser(userDto);
+
+    assertThat(user).isNotNull();
+    assertThat(user.getAuthorities()).isNotNull();
+    assertThat(user.getAuthorities()).isNotEmpty();
+    assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN");
+  }
+
+  @Test
+  public void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() {
+    userDto.setAuthorities(null);
+
+    User user = userMapper.userDTOToUser(userDto);
+
+    assertThat(user).isNotNull();
+    assertThat(user.getAuthorities()).isNotNull();
+    assertThat(user.getAuthorities()).isEmpty();
+  }
+
+  @Test
+  public void userDTOToUserMapWithNullUserShouldReturnNull() {
+    assertThat(userMapper.userDTOToUser(null)).isNull();
+  }
+
+  @Test
+  public void testUserFromId() {
+    assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID);
+    assertThat(userMapper.userFromId(null)).isNull();
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4cab98ce711f2720988f20e8d03893562e8543e
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java
@@ -0,0 +1,755 @@
+package com.ippon.borestop.web.rest;
+
+import static com.ippon.borestop.web.rest.AccountResourceIT.TEST_USER_LOGIN;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.config.Constants;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.AuthorityRepository;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.security.AuthoritiesConstants;
+import com.ippon.borestop.service.UserService;
+import com.ippon.borestop.service.dto.PasswordChangeDTO;
+import com.ippon.borestop.service.dto.UserDTO;
+import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM;
+import com.ippon.borestop.web.rest.vm.ManagedUserVM;
+import java.time.Instant;
+import java.util.*;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for the {@link AccountResource} REST controller.
+ */
+@AutoConfigureMockMvc
+@WithMockUser(value = TEST_USER_LOGIN)
+@SpringBootTest(classes = BorestopApp.class)
+public class AccountResourceIT {
+  static final String TEST_USER_LOGIN = "test";
+
+  @Autowired
+  private UserRepository userRepository;
+
+  @Autowired
+  private AuthorityRepository authorityRepository;
+
+  @Autowired
+  private UserService userService;
+
+  @Autowired
+  private PasswordEncoder passwordEncoder;
+
+  @Autowired
+  private MockMvc restAccountMockMvc;
+
+  @Test
+  @WithUnauthenticatedMockUser
+  public void testNonAuthenticatedUser() throws Exception {
+    restAccountMockMvc
+      .perform(get("/api/authenticate").accept(MediaType.APPLICATION_JSON))
+      .andExpect(status().isOk())
+      .andExpect(content().string(""));
+  }
+
+  @Test
+  public void testAuthenticatedUser() throws Exception {
+    restAccountMockMvc
+      .perform(
+        get("/api/authenticate")
+          .with(
+            request -> {
+              request.setRemoteUser(TEST_USER_LOGIN);
+              return request;
+            }
+          )
+          .accept(MediaType.APPLICATION_JSON)
+      )
+      .andExpect(status().isOk())
+      .andExpect(content().string(TEST_USER_LOGIN));
+  }
+
+  @Test
+  public void testGetExistingAccount() throws Exception {
+    Set<String> authorities = new HashSet<>();
+    authorities.add(AuthoritiesConstants.ADMIN);
+
+    UserDTO user = new UserDTO();
+    user.setLogin(TEST_USER_LOGIN);
+    user.setFirstName("john");
+    user.setLastName("doe");
+    user.setEmail("john.doe@jhipster.com");
+    user.setImageUrl("http://placehold.it/50x50");
+    user.setLangKey("en");
+    user.setAuthorities(authorities);
+    userService.createUser(user);
+
+    restAccountMockMvc
+      .perform(get("/api/account").accept(MediaType.APPLICATION_JSON))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.login").value(TEST_USER_LOGIN))
+      .andExpect(jsonPath("$.firstName").value("john"))
+      .andExpect(jsonPath("$.lastName").value("doe"))
+      .andExpect(jsonPath("$.email").value("john.doe@jhipster.com"))
+      .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50"))
+      .andExpect(jsonPath("$.langKey").value("en"))
+      .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN));
+  }
+
+  @Test
+  public void testGetUnknownAccount() throws Exception {
+    restAccountMockMvc.perform(get("/api/account").accept(MediaType.APPLICATION_PROBLEM_JSON)).andExpect(status().isInternalServerError());
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterValid() throws Exception {
+    ManagedUserVM validUser = new ManagedUserVM();
+    validUser.setLogin("test-register-valid");
+    validUser.setPassword("password");
+    validUser.setFirstName("Alice");
+    validUser.setLastName("Test");
+    validUser.setEmail("test-register-valid@example.com");
+    validUser.setImageUrl("http://placehold.it/50x50");
+    validUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+    assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isFalse();
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser)))
+      .andExpect(status().isCreated());
+
+    assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isTrue();
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterInvalidLogin() throws Exception {
+    ManagedUserVM invalidUser = new ManagedUserVM();
+    invalidUser.setLogin("funky-log(n"); // <-- invalid
+    invalidUser.setPassword("password");
+    invalidUser.setFirstName("Funky");
+    invalidUser.setLastName("One");
+    invalidUser.setEmail("funky@example.com");
+    invalidUser.setActivated(true);
+    invalidUser.setImageUrl("http://placehold.it/50x50");
+    invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser)))
+      .andExpect(status().isBadRequest());
+
+    Optional<User> user = userRepository.findOneByEmailIgnoreCase("funky@example.com");
+    assertThat(user.isPresent()).isFalse();
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterInvalidEmail() throws Exception {
+    ManagedUserVM invalidUser = new ManagedUserVM();
+    invalidUser.setLogin("bob");
+    invalidUser.setPassword("password");
+    invalidUser.setFirstName("Bob");
+    invalidUser.setLastName("Green");
+    invalidUser.setEmail("invalid"); // <-- invalid
+    invalidUser.setActivated(true);
+    invalidUser.setImageUrl("http://placehold.it/50x50");
+    invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser)))
+      .andExpect(status().isBadRequest());
+
+    Optional<User> user = userRepository.findOneByLogin("bob");
+    assertThat(user.isPresent()).isFalse();
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterInvalidPassword() throws Exception {
+    ManagedUserVM invalidUser = new ManagedUserVM();
+    invalidUser.setLogin("bob");
+    invalidUser.setPassword("123"); // password with only 3 digits
+    invalidUser.setFirstName("Bob");
+    invalidUser.setLastName("Green");
+    invalidUser.setEmail("bob@example.com");
+    invalidUser.setActivated(true);
+    invalidUser.setImageUrl("http://placehold.it/50x50");
+    invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser)))
+      .andExpect(status().isBadRequest());
+
+    Optional<User> user = userRepository.findOneByLogin("bob");
+    assertThat(user.isPresent()).isFalse();
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterNullPassword() throws Exception {
+    ManagedUserVM invalidUser = new ManagedUserVM();
+    invalidUser.setLogin("bob");
+    invalidUser.setPassword(null); // invalid null password
+    invalidUser.setFirstName("Bob");
+    invalidUser.setLastName("Green");
+    invalidUser.setEmail("bob@example.com");
+    invalidUser.setActivated(true);
+    invalidUser.setImageUrl("http://placehold.it/50x50");
+    invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser)))
+      .andExpect(status().isBadRequest());
+
+    Optional<User> user = userRepository.findOneByLogin("bob");
+    assertThat(user.isPresent()).isFalse();
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterDuplicateLogin() throws Exception {
+    // First registration
+    ManagedUserVM firstUser = new ManagedUserVM();
+    firstUser.setLogin("alice");
+    firstUser.setPassword("password");
+    firstUser.setFirstName("Alice");
+    firstUser.setLastName("Something");
+    firstUser.setEmail("alice@example.com");
+    firstUser.setImageUrl("http://placehold.it/50x50");
+    firstUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    // Duplicate login, different email
+    ManagedUserVM secondUser = new ManagedUserVM();
+    secondUser.setLogin(firstUser.getLogin());
+    secondUser.setPassword(firstUser.getPassword());
+    secondUser.setFirstName(firstUser.getFirstName());
+    secondUser.setLastName(firstUser.getLastName());
+    secondUser.setEmail("alice2@example.com");
+    secondUser.setImageUrl(firstUser.getImageUrl());
+    secondUser.setLangKey(firstUser.getLangKey());
+    secondUser.setCreatedBy(firstUser.getCreatedBy());
+    secondUser.setCreatedDate(firstUser.getCreatedDate());
+    secondUser.setLastModifiedBy(firstUser.getLastModifiedBy());
+    secondUser.setLastModifiedDate(firstUser.getLastModifiedDate());
+    secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities()));
+
+    // First user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser)))
+      .andExpect(status().isCreated());
+
+    // Second (non activated) user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser)))
+      .andExpect(status().isCreated());
+
+    Optional<User> testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com");
+    assertThat(testUser.isPresent()).isTrue();
+    testUser.get().setActivated(true);
+    userRepository.save(testUser.get());
+
+    // Second (already activated) user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser)))
+      .andExpect(status().is4xxClientError());
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterDuplicateEmail() throws Exception {
+    // First user
+    ManagedUserVM firstUser = new ManagedUserVM();
+    firstUser.setLogin("test-register-duplicate-email");
+    firstUser.setPassword("password");
+    firstUser.setFirstName("Alice");
+    firstUser.setLastName("Test");
+    firstUser.setEmail("test-register-duplicate-email@example.com");
+    firstUser.setImageUrl("http://placehold.it/50x50");
+    firstUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    // Register first user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser)))
+      .andExpect(status().isCreated());
+
+    Optional<User> testUser1 = userRepository.findOneByLogin("test-register-duplicate-email");
+    assertThat(testUser1.isPresent()).isTrue();
+
+    // Duplicate email, different login
+    ManagedUserVM secondUser = new ManagedUserVM();
+    secondUser.setLogin("test-register-duplicate-email-2");
+    secondUser.setPassword(firstUser.getPassword());
+    secondUser.setFirstName(firstUser.getFirstName());
+    secondUser.setLastName(firstUser.getLastName());
+    secondUser.setEmail(firstUser.getEmail());
+    secondUser.setImageUrl(firstUser.getImageUrl());
+    secondUser.setLangKey(firstUser.getLangKey());
+    secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities()));
+
+    // Register second (non activated) user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser)))
+      .andExpect(status().isCreated());
+
+    Optional<User> testUser2 = userRepository.findOneByLogin("test-register-duplicate-email");
+    assertThat(testUser2.isPresent()).isFalse();
+
+    Optional<User> testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2");
+    assertThat(testUser3.isPresent()).isTrue();
+
+    // Duplicate email - with uppercase email address
+    ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM();
+    userWithUpperCaseEmail.setId(firstUser.getId());
+    userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3");
+    userWithUpperCaseEmail.setPassword(firstUser.getPassword());
+    userWithUpperCaseEmail.setFirstName(firstUser.getFirstName());
+    userWithUpperCaseEmail.setLastName(firstUser.getLastName());
+    userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com");
+    userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl());
+    userWithUpperCaseEmail.setLangKey(firstUser.getLangKey());
+    userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities()));
+
+    // Register third (not activated) user
+    restAccountMockMvc
+      .perform(
+        post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail))
+      )
+      .andExpect(status().isCreated());
+
+    Optional<User> testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3");
+    assertThat(testUser4.isPresent()).isTrue();
+    assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com");
+
+    testUser4.get().setActivated(true);
+    userService.updateUser((new UserDTO(testUser4.get())));
+
+    // Register 4th (already activated) user
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser)))
+      .andExpect(status().is4xxClientError());
+  }
+
+  @Test
+  @Transactional
+  public void testRegisterAdminIsIgnored() throws Exception {
+    ManagedUserVM validUser = new ManagedUserVM();
+    validUser.setLogin("badguy");
+    validUser.setPassword("password");
+    validUser.setFirstName("Bad");
+    validUser.setLastName("Guy");
+    validUser.setEmail("badguy@example.com");
+    validUser.setActivated(true);
+    validUser.setImageUrl("http://placehold.it/50x50");
+    validUser.setLangKey(Constants.DEFAULT_LANGUAGE);
+    validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN));
+
+    restAccountMockMvc
+      .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser)))
+      .andExpect(status().isCreated());
+
+    Optional<User> userDup = userRepository.findOneWithAuthoritiesByLogin("badguy");
+    assertThat(userDup.isPresent()).isTrue();
+    assertThat(userDup.get().getAuthorities()).hasSize(1).containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get());
+  }
+
+  @Test
+  @Transactional
+  public void testActivateAccount() throws Exception {
+    final String activationKey = "some activation key";
+    User user = new User();
+    user.setLogin("activate-account");
+    user.setEmail("activate-account@example.com");
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(false);
+    user.setActivationKey(activationKey);
+
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc.perform(get("/api/activate?key={activationKey}", activationKey)).andExpect(status().isOk());
+
+    user = userRepository.findOneByLogin(user.getLogin()).orElse(null);
+    assertThat(user.getActivated()).isTrue();
+  }
+
+  @Test
+  @Transactional
+  public void testActivateAccountWithWrongKey() throws Exception {
+    restAccountMockMvc.perform(get("/api/activate?key=wrongActivationKey")).andExpect(status().isInternalServerError());
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("save-account")
+  public void testSaveAccount() throws Exception {
+    User user = new User();
+    user.setLogin("save-account");
+    user.setEmail("save-account@example.com");
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    userRepository.saveAndFlush(user);
+
+    UserDTO userDTO = new UserDTO();
+    userDTO.setLogin("not-used");
+    userDTO.setFirstName("firstname");
+    userDTO.setLastName("lastname");
+    userDTO.setEmail("save-account@example.com");
+    userDTO.setActivated(false);
+    userDTO.setImageUrl("http://placehold.it/50x50");
+    userDTO.setLangKey(Constants.DEFAULT_LANGUAGE);
+    userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN));
+
+    restAccountMockMvc
+      .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO)))
+      .andExpect(status().isOk());
+
+    User updatedUser = userRepository.findOneWithAuthoritiesByLogin(user.getLogin()).orElse(null);
+    assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName());
+    assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName());
+    assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail());
+    assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey());
+    assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword());
+    assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl());
+    assertThat(updatedUser.getActivated()).isEqualTo(true);
+    assertThat(updatedUser.getAuthorities()).isEmpty();
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("save-invalid-email")
+  public void testSaveInvalidEmail() throws Exception {
+    User user = new User();
+    user.setLogin("save-invalid-email");
+    user.setEmail("save-invalid-email@example.com");
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+
+    userRepository.saveAndFlush(user);
+
+    UserDTO userDTO = new UserDTO();
+    userDTO.setLogin("not-used");
+    userDTO.setFirstName("firstname");
+    userDTO.setLastName("lastname");
+    userDTO.setEmail("invalid email");
+    userDTO.setActivated(false);
+    userDTO.setImageUrl("http://placehold.it/50x50");
+    userDTO.setLangKey(Constants.DEFAULT_LANGUAGE);
+    userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN));
+
+    restAccountMockMvc
+      .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO)))
+      .andExpect(status().isBadRequest());
+
+    assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent();
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("save-existing-email")
+  public void testSaveExistingEmail() throws Exception {
+    User user = new User();
+    user.setLogin("save-existing-email");
+    user.setEmail("save-existing-email@example.com");
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    userRepository.saveAndFlush(user);
+
+    User anotherUser = new User();
+    anotherUser.setLogin("save-existing-email2");
+    anotherUser.setEmail("save-existing-email2@example.com");
+    anotherUser.setPassword(RandomStringUtils.random(60));
+    anotherUser.setActivated(true);
+
+    userRepository.saveAndFlush(anotherUser);
+
+    UserDTO userDTO = new UserDTO();
+    userDTO.setLogin("not-used");
+    userDTO.setFirstName("firstname");
+    userDTO.setLastName("lastname");
+    userDTO.setEmail("save-existing-email2@example.com");
+    userDTO.setActivated(false);
+    userDTO.setImageUrl("http://placehold.it/50x50");
+    userDTO.setLangKey(Constants.DEFAULT_LANGUAGE);
+    userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN));
+
+    restAccountMockMvc
+      .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO)))
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null);
+    assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com");
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("save-existing-email-and-login")
+  public void testSaveExistingEmailAndLogin() throws Exception {
+    User user = new User();
+    user.setLogin("save-existing-email-and-login");
+    user.setEmail("save-existing-email-and-login@example.com");
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    userRepository.saveAndFlush(user);
+
+    UserDTO userDTO = new UserDTO();
+    userDTO.setLogin("not-used");
+    userDTO.setFirstName("firstname");
+    userDTO.setLastName("lastname");
+    userDTO.setEmail("save-existing-email-and-login@example.com");
+    userDTO.setActivated(false);
+    userDTO.setImageUrl("http://placehold.it/50x50");
+    userDTO.setLangKey(Constants.DEFAULT_LANGUAGE);
+    userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN));
+
+    restAccountMockMvc
+      .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO)))
+      .andExpect(status().isOk());
+
+    User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null);
+    assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com");
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("change-password-wrong-existing-password")
+  public void testChangePasswordWrongExistingPassword() throws Exception {
+    User user = new User();
+    String currentPassword = RandomStringUtils.random(60);
+    user.setPassword(passwordEncoder.encode(currentPassword));
+    user.setLogin("change-password-wrong-existing-password");
+    user.setEmail("change-password-wrong-existing-password@example.com");
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/change-password")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1" + currentPassword, "new password")))
+      )
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null);
+    assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse();
+    assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue();
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("change-password")
+  public void testChangePassword() throws Exception {
+    User user = new User();
+    String currentPassword = RandomStringUtils.random(60);
+    user.setPassword(passwordEncoder.encode(currentPassword));
+    user.setLogin("change-password");
+    user.setEmail("change-password@example.com");
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/change-password")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password")))
+      )
+      .andExpect(status().isOk());
+
+    User updatedUser = userRepository.findOneByLogin("change-password").orElse(null);
+    assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue();
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("change-password-too-small")
+  public void testChangePasswordTooSmall() throws Exception {
+    User user = new User();
+    String currentPassword = RandomStringUtils.random(60);
+    user.setPassword(passwordEncoder.encode(currentPassword));
+    user.setLogin("change-password-too-small");
+    user.setEmail("change-password-too-small@example.com");
+    userRepository.saveAndFlush(user);
+
+    String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1);
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/change-password")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))
+      )
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null);
+    assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword());
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("change-password-too-long")
+  public void testChangePasswordTooLong() throws Exception {
+    User user = new User();
+    String currentPassword = RandomStringUtils.random(60);
+    user.setPassword(passwordEncoder.encode(currentPassword));
+    user.setLogin("change-password-too-long");
+    user.setEmail("change-password-too-long@example.com");
+    userRepository.saveAndFlush(user);
+
+    String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1);
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/change-password")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))
+      )
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null);
+    assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword());
+  }
+
+  @Test
+  @Transactional
+  @WithMockUser("change-password-empty")
+  public void testChangePasswordEmpty() throws Exception {
+    User user = new User();
+    String currentPassword = RandomStringUtils.random(60);
+    user.setPassword(passwordEncoder.encode(currentPassword));
+    user.setLogin("change-password-empty");
+    user.setEmail("change-password-empty@example.com");
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/change-password")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "")))
+      )
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null);
+    assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword());
+  }
+
+  @Test
+  @Transactional
+  public void testRequestPasswordReset() throws Exception {
+    User user = new User();
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    user.setLogin("password-reset");
+    user.setEmail("password-reset@example.com");
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc.perform(post("/api/account/reset-password/init").content("password-reset@example.com")).andExpect(status().isOk());
+  }
+
+  @Test
+  @Transactional
+  public void testRequestPasswordResetUpperCaseEmail() throws Exception {
+    User user = new User();
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    user.setLogin("password-reset-upper-case");
+    user.setEmail("password-reset-upper-case@example.com");
+    userRepository.saveAndFlush(user);
+
+    restAccountMockMvc
+      .perform(post("/api/account/reset-password/init").content("password-reset-upper-case@EXAMPLE.COM"))
+      .andExpect(status().isOk());
+  }
+
+  @Test
+  public void testRequestPasswordResetWrongEmail() throws Exception {
+    restAccountMockMvc
+      .perform(post("/api/account/reset-password/init").content("password-reset-wrong-email@example.com"))
+      .andExpect(status().isOk());
+  }
+
+  @Test
+  @Transactional
+  public void testFinishPasswordReset() throws Exception {
+    User user = new User();
+    user.setPassword(RandomStringUtils.random(60));
+    user.setLogin("finish-password-reset");
+    user.setEmail("finish-password-reset@example.com");
+    user.setResetDate(Instant.now().plusSeconds(60));
+    user.setResetKey("reset key");
+    userRepository.saveAndFlush(user);
+
+    KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM();
+    keyAndPassword.setKey(user.getResetKey());
+    keyAndPassword.setNewPassword("new password");
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/reset-password/finish")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))
+      )
+      .andExpect(status().isOk());
+
+    User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null);
+    assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue();
+  }
+
+  @Test
+  @Transactional
+  public void testFinishPasswordResetTooSmall() throws Exception {
+    User user = new User();
+    user.setPassword(RandomStringUtils.random(60));
+    user.setLogin("finish-password-reset-too-small");
+    user.setEmail("finish-password-reset-too-small@example.com");
+    user.setResetDate(Instant.now().plusSeconds(60));
+    user.setResetKey("reset key too small");
+    userRepository.saveAndFlush(user);
+
+    KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM();
+    keyAndPassword.setKey(user.getResetKey());
+    keyAndPassword.setNewPassword("foo");
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/reset-password/finish")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))
+      )
+      .andExpect(status().isBadRequest());
+
+    User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null);
+    assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse();
+  }
+
+  @Test
+  @Transactional
+  public void testFinishPasswordResetWrongKey() throws Exception {
+    KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM();
+    keyAndPassword.setKey("wrong reset key");
+    keyAndPassword.setNewPassword("new password");
+
+    restAccountMockMvc
+      .perform(
+        post("/api/account/reset-password/finish")
+          .contentType(MediaType.APPLICATION_JSON)
+          .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))
+      )
+      .andExpect(status().isInternalServerError());
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..ceccde2c73d1b0201478ae3488b9ce7ef2bbdcd7
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java
@@ -0,0 +1,135 @@
+package com.ippon.borestop.web.rest;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.domain.PersistentAuditEvent;
+import com.ippon.borestop.repository.PersistenceAuditEventRepository;
+import com.ippon.borestop.security.AuthoritiesConstants;
+import java.time.Instant;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for the {@link AuditResource} REST controller.
+ */
+@AutoConfigureMockMvc
+@WithMockUser(authorities = AuthoritiesConstants.ADMIN)
+@SpringBootTest(classes = BorestopApp.class)
+@Transactional
+public class AuditResourceIT {
+  private static final String SAMPLE_PRINCIPAL = "SAMPLE_PRINCIPAL";
+  private static final String SAMPLE_TYPE = "SAMPLE_TYPE";
+  private static final Instant SAMPLE_TIMESTAMP = Instant.parse("2015-08-04T10:11:30Z");
+  private static final long SECONDS_PER_DAY = 60 * 60 * 24;
+
+  @Autowired
+  private PersistenceAuditEventRepository auditEventRepository;
+
+  private PersistentAuditEvent auditEvent;
+
+  @Autowired
+  private MockMvc restAuditMockMvc;
+
+  @BeforeEach
+  public void initTest() {
+    auditEventRepository.deleteAll();
+    auditEvent = new PersistentAuditEvent();
+    auditEvent.setAuditEventType(SAMPLE_TYPE);
+    auditEvent.setPrincipal(SAMPLE_PRINCIPAL);
+    auditEvent.setAuditEventDate(SAMPLE_TIMESTAMP);
+  }
+
+  @Test
+  public void getAllAudits() throws Exception {
+    // Initialize the database
+    auditEventRepository.save(auditEvent);
+
+    // Get all the audits
+    restAuditMockMvc
+      .perform(get("/management/audits"))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL)));
+  }
+
+  @Test
+  public void getAudit() throws Exception {
+    // Initialize the database
+    auditEventRepository.save(auditEvent);
+
+    // Get the audit
+    restAuditMockMvc
+      .perform(get("/management/audits/{id}", auditEvent.getId()))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.principal").value(SAMPLE_PRINCIPAL));
+  }
+
+  @Test
+  public void getAuditsByDate() throws Exception {
+    // Initialize the database
+    auditEventRepository.save(auditEvent);
+
+    // Generate dates for selecting audits by date, making sure the period will contain the audit
+    String fromDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10);
+    String toDate = SAMPLE_TIMESTAMP.plusSeconds(SECONDS_PER_DAY).toString().substring(0, 10);
+
+    // Get the audit
+    restAuditMockMvc
+      .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL)));
+  }
+
+  @Test
+  public void getNonExistingAuditsByDate() throws Exception {
+    // Initialize the database
+    auditEventRepository.save(auditEvent);
+
+    // Generate dates for selecting audits by date, making sure the period will not contain the sample audit
+    String fromDate = SAMPLE_TIMESTAMP.minusSeconds(2 * SECONDS_PER_DAY).toString().substring(0, 10);
+    String toDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10);
+
+    // Query audits but expect no results
+    restAuditMockMvc
+      .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(header().string("X-Total-Count", "0"));
+  }
+
+  @Test
+  public void getNonExistingAudit() throws Exception {
+    // Get the audit
+    restAuditMockMvc.perform(get("/management/audits/{id}", Long.MAX_VALUE)).andExpect(status().isNotFound());
+  }
+
+  @Test
+  public void testPersistentAuditEventEquals() throws Exception {
+    TestUtil.equalsVerifier(PersistentAuditEvent.class);
+    PersistentAuditEvent auditEvent1 = new PersistentAuditEvent();
+    auditEvent1.setId(1L);
+    PersistentAuditEvent auditEvent2 = new PersistentAuditEvent();
+    auditEvent2.setId(auditEvent1.getId());
+    assertThat(auditEvent1).isEqualTo(auditEvent2);
+    auditEvent2.setId(2L);
+    assertThat(auditEvent1).isNotEqualTo(auditEvent2);
+    auditEvent1.setId(null);
+    assertThat(auditEvent1).isNotEqualTo(auditEvent2);
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d27571d218648139d71999752077adf0e857bf70
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java
@@ -0,0 +1,57 @@
+package com.ippon.borestop.web.rest;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Unit tests for the {@link ClientForwardController} REST controller.
+ */
+public class ClientForwardControllerTest {
+  private MockMvc restMockMvc;
+
+  @BeforeEach
+  public void setup() {
+    ClientForwardController clientForwardController = new ClientForwardController();
+    this.restMockMvc = MockMvcBuilders.standaloneSetup(clientForwardController, new TestController()).build();
+  }
+
+  @Test
+  public void getBackendEndpoint() throws Exception {
+    restMockMvc
+      .perform(get("/test"))
+      .andExpect(status().isOk())
+      .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_PLAIN_VALUE))
+      .andExpect(content().string("test"));
+  }
+
+  @Test
+  public void getClientEndpoint() throws Exception {
+    ResultActions perform = restMockMvc.perform(get("/non-existant-mapping"));
+    perform.andExpect(status().isOk()).andExpect(forwardedUrl("/"));
+  }
+
+  @Test
+  public void getNestedClientEndpoint() throws Exception {
+    restMockMvc.perform(get("/admin/user-management")).andExpect(status().isOk()).andExpect(forwardedUrl("/"));
+  }
+
+  @RestController
+  public static class TestController {
+
+    @RequestMapping(value = "/test")
+    public String test() {
+      return "test";
+    }
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..da4ba50532e620022223f92389c9df9ce8c09223
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java
@@ -0,0 +1,154 @@
+package com.ippon.borestop.web.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import java.io.IOException;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
+import org.springframework.format.support.DefaultFormattingConversionService;
+import org.springframework.format.support.FormattingConversionService;
+
+/**
+ * Utility class for testing REST controllers.
+ */
+public final class TestUtil {
+  private static final ObjectMapper mapper = createObjectMapper();
+
+  private static ObjectMapper createObjectMapper() {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
+    mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+    mapper.registerModule(new JavaTimeModule());
+    return mapper;
+  }
+
+  /**
+   * Convert an object to JSON byte array.
+   *
+   * @param object the object to convert.
+   * @return the JSON byte array.
+   * @throws IOException
+   */
+  public static byte[] convertObjectToJsonBytes(Object object) throws IOException {
+    return mapper.writeValueAsBytes(object);
+  }
+
+  /**
+   * Create a byte array with a specific size filled with specified data.
+   *
+   * @param size the size of the byte array.
+   * @param data the data to put in the byte array.
+   * @return the JSON byte array.
+   */
+  public static byte[] createByteArray(int size, String data) {
+    byte[] byteArray = new byte[size];
+    for (int i = 0; i < size; i++) {
+      byteArray[i] = Byte.parseByte(data, 2);
+    }
+    return byteArray;
+  }
+
+  /**
+   * A matcher that tests that the examined string represents the same instant as the reference datetime.
+   */
+  public static class ZonedDateTimeMatcher extends TypeSafeDiagnosingMatcher<String> {
+    private final ZonedDateTime date;
+
+    public ZonedDateTimeMatcher(ZonedDateTime date) {
+      this.date = date;
+    }
+
+    @Override
+    protected boolean matchesSafely(String item, Description mismatchDescription) {
+      try {
+        if (!date.isEqual(ZonedDateTime.parse(item))) {
+          mismatchDescription.appendText("was ").appendValue(item);
+          return false;
+        }
+        return true;
+      } catch (DateTimeParseException e) {
+        mismatchDescription.appendText("was ").appendValue(item).appendText(", which could not be parsed as a ZonedDateTime");
+        return false;
+      }
+    }
+
+    @Override
+    public void describeTo(Description description) {
+      description.appendText("a String representing the same Instant as ").appendValue(date);
+    }
+  }
+
+  /**
+   * Creates a matcher that matches when the examined string represents the same instant as the reference datetime.
+   *
+   * @param date the reference datetime against which the examined string is checked.
+   */
+  public static ZonedDateTimeMatcher sameInstant(ZonedDateTime date) {
+    return new ZonedDateTimeMatcher(date);
+  }
+
+  /**
+   * Verifies the equals/hashcode contract on the domain object.
+   */
+  public static <T> void equalsVerifier(Class<T> clazz) throws Exception {
+    T domainObject1 = clazz.getConstructor().newInstance();
+    assertThat(domainObject1.toString()).isNotNull();
+    assertThat(domainObject1).isEqualTo(domainObject1);
+    assertThat(domainObject1.hashCode()).isEqualTo(domainObject1.hashCode());
+
+    // Test with an instance of another class
+    Object testOtherObject = new Object();
+    assertThat(domainObject1).isNotEqualTo(testOtherObject);
+    assertThat(domainObject1).isNotEqualTo(null);
+
+    // Test with an instance of the same class
+    T domainObject2 = clazz.getConstructor().newInstance();
+    assertThat(domainObject1).isNotEqualTo(domainObject2);
+
+    // HashCodes are equals because the objects are not persisted yet
+    assertThat(domainObject1.hashCode()).isEqualTo(domainObject2.hashCode());
+  }
+
+  /**
+   * Create a {@link FormattingConversionService} which use ISO date format, instead of the localized one.
+   * @return the {@link FormattingConversionService}.
+   */
+  public static FormattingConversionService createFormattingConversionService() {
+    DefaultFormattingConversionService dfcs = new DefaultFormattingConversionService();
+    DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
+    registrar.setUseIsoFormat(true);
+    registrar.registerFormatters(dfcs);
+    return dfcs;
+  }
+
+  /**
+   * Makes a an executes a query to the EntityManager finding all stored objects.
+   * @param <T> The type of objects to be searched
+   * @param em The instance of the EntityManager
+   * @param clss The class type to be searched
+   * @return A list of all found objects
+   */
+  public static <T> List<T> findAll(EntityManager em, Class<T> clss) {
+    CriteriaBuilder cb = em.getCriteriaBuilder();
+    CriteriaQuery<T> cq = cb.createQuery(clss);
+    Root<T> rootEntry = cq.from(clss);
+    CriteriaQuery<T> all = cq.select(rootEntry);
+    TypedQuery<T> allQuery = em.createQuery(all);
+    return allQuery.getResultList();
+  }
+
+  private TestUtil() {}
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7f1d3ff68fc06d40b938f719b34d34bf2d026fe
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java
@@ -0,0 +1,99 @@
+package com.ippon.borestop.web.rest;
+
+import static org.hamcrest.Matchers.emptyString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.web.rest.vm.LoginVM;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for the {@link UserJWTController} REST controller.
+ */
+@AutoConfigureMockMvc
+@SpringBootTest(classes = BorestopApp.class)
+public class UserJWTControllerIT {
+  @Autowired
+  private UserRepository userRepository;
+
+  @Autowired
+  private PasswordEncoder passwordEncoder;
+
+  @Autowired
+  private MockMvc mockMvc;
+
+  @Test
+  @Transactional
+  public void testAuthorize() throws Exception {
+    User user = new User();
+    user.setLogin("user-jwt-controller");
+    user.setEmail("user-jwt-controller@example.com");
+    user.setActivated(true);
+    user.setPassword(passwordEncoder.encode("test"));
+
+    userRepository.saveAndFlush(user);
+
+    LoginVM login = new LoginVM();
+    login.setUsername("user-jwt-controller");
+    login.setPassword("test");
+    mockMvc
+      .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login)))
+      .andExpect(status().isOk())
+      .andExpect(jsonPath("$.id_token").isString())
+      .andExpect(jsonPath("$.id_token").isNotEmpty())
+      .andExpect(header().string("Authorization", not(nullValue())))
+      .andExpect(header().string("Authorization", not(is(emptyString()))));
+  }
+
+  @Test
+  @Transactional
+  public void testAuthorizeWithRememberMe() throws Exception {
+    User user = new User();
+    user.setLogin("user-jwt-controller-remember-me");
+    user.setEmail("user-jwt-controller-remember-me@example.com");
+    user.setActivated(true);
+    user.setPassword(passwordEncoder.encode("test"));
+
+    userRepository.saveAndFlush(user);
+
+    LoginVM login = new LoginVM();
+    login.setUsername("user-jwt-controller-remember-me");
+    login.setPassword("test");
+    login.setRememberMe(true);
+    mockMvc
+      .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login)))
+      .andExpect(status().isOk())
+      .andExpect(jsonPath("$.id_token").isString())
+      .andExpect(jsonPath("$.id_token").isNotEmpty())
+      .andExpect(header().string("Authorization", not(nullValue())))
+      .andExpect(header().string("Authorization", not(is(emptyString()))));
+  }
+
+  @Test
+  public void testAuthorizeFails() throws Exception {
+    LoginVM login = new LoginVM();
+    login.setUsername("wrong-user");
+    login.setPassword("wrong password");
+    mockMvc
+      .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login)))
+      .andExpect(status().isUnauthorized())
+      .andExpect(jsonPath("$.id_token").doesNotExist())
+      .andExpect(header().doesNotExist("Authorization"));
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..53f246aedc66a89f9102c39883c401f14660169e
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java
@@ -0,0 +1,562 @@
+package com.ippon.borestop.web.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasItems;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import com.ippon.borestop.BorestopApp;
+import com.ippon.borestop.domain.Authority;
+import com.ippon.borestop.domain.User;
+import com.ippon.borestop.repository.UserRepository;
+import com.ippon.borestop.security.AuthoritiesConstants;
+import com.ippon.borestop.service.dto.UserDTO;
+import com.ippon.borestop.service.mapper.UserMapper;
+import com.ippon.borestop.web.rest.vm.ManagedUserVM;
+import java.time.Instant;
+import java.util.*;
+import java.util.function.Consumer;
+import javax.persistence.EntityManager;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Integration tests for the {@link UserResource} REST controller.
+ */
+@AutoConfigureMockMvc
+@WithMockUser(authorities = AuthoritiesConstants.ADMIN)
+@SpringBootTest(classes = BorestopApp.class)
+public class UserResourceIT {
+  private static final String DEFAULT_LOGIN = "johndoe";
+  private static final String UPDATED_LOGIN = "jhipster";
+
+  private static final Long DEFAULT_ID = 1L;
+
+  private static final String DEFAULT_PASSWORD = "passjohndoe";
+  private static final String UPDATED_PASSWORD = "passjhipster";
+
+  private static final String DEFAULT_EMAIL = "johndoe@localhost";
+  private static final String UPDATED_EMAIL = "jhipster@localhost";
+
+  private static final String DEFAULT_FIRSTNAME = "john";
+  private static final String UPDATED_FIRSTNAME = "jhipsterFirstName";
+
+  private static final String DEFAULT_LASTNAME = "doe";
+  private static final String UPDATED_LASTNAME = "jhipsterLastName";
+
+  private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50";
+  private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40";
+
+  private static final String DEFAULT_LANGKEY = "en";
+  private static final String UPDATED_LANGKEY = "fr";
+
+  @Autowired
+  private UserRepository userRepository;
+
+  @Autowired
+  private UserMapper userMapper;
+
+  @Autowired
+  private EntityManager em;
+
+  @Autowired
+  private MockMvc restUserMockMvc;
+
+  private User user;
+
+  /**
+   * Create a User.
+   *
+   * This is a static method, as tests for other entities might also need it,
+   * if they test an entity which has a required relationship to the User entity.
+   */
+  public static User createEntity(EntityManager em) {
+    User user = new User();
+    user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5));
+    user.setPassword(RandomStringUtils.random(60));
+    user.setActivated(true);
+    user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL);
+    user.setFirstName(DEFAULT_FIRSTNAME);
+    user.setLastName(DEFAULT_LASTNAME);
+    user.setImageUrl(DEFAULT_IMAGEURL);
+    user.setLangKey(DEFAULT_LANGKEY);
+    return user;
+  }
+
+  @BeforeEach
+  public void initTest() {
+    user = createEntity(em);
+    user.setLogin(DEFAULT_LOGIN);
+    user.setEmail(DEFAULT_EMAIL);
+  }
+
+  @Test
+  @Transactional
+  public void createUser() throws Exception {
+    int databaseSizeBeforeCreate = userRepository.findAll().size();
+
+    // Create the User
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setLogin(DEFAULT_LOGIN);
+    managedUserVM.setPassword(DEFAULT_PASSWORD);
+    managedUserVM.setFirstName(DEFAULT_FIRSTNAME);
+    managedUserVM.setLastName(DEFAULT_LASTNAME);
+    managedUserVM.setEmail(DEFAULT_EMAIL);
+    managedUserVM.setActivated(true);
+    managedUserVM.setImageUrl(DEFAULT_IMAGEURL);
+    managedUserVM.setLangKey(DEFAULT_LANGKEY);
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restUserMockMvc
+      .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isCreated());
+
+    // Validate the User in the database
+    assertPersistedUsers(
+      users -> {
+        assertThat(users).hasSize(databaseSizeBeforeCreate + 1);
+        User testUser = users.get(users.size() - 1);
+        assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN);
+        assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME);
+        assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME);
+        assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL);
+        assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL);
+        assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY);
+      }
+    );
+  }
+
+  @Test
+  @Transactional
+  public void createUserWithExistingId() throws Exception {
+    int databaseSizeBeforeCreate = userRepository.findAll().size();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setId(1L);
+    managedUserVM.setLogin(DEFAULT_LOGIN);
+    managedUserVM.setPassword(DEFAULT_PASSWORD);
+    managedUserVM.setFirstName(DEFAULT_FIRSTNAME);
+    managedUserVM.setLastName(DEFAULT_LASTNAME);
+    managedUserVM.setEmail(DEFAULT_EMAIL);
+    managedUserVM.setActivated(true);
+    managedUserVM.setImageUrl(DEFAULT_IMAGEURL);
+    managedUserVM.setLangKey(DEFAULT_LANGKEY);
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    // An entity with an existing ID cannot be created, so this API call must fail
+    restUserMockMvc
+      .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isBadRequest());
+
+    // Validate the User in the database
+    assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate));
+  }
+
+  @Test
+  @Transactional
+  public void createUserWithExistingLogin() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+    int databaseSizeBeforeCreate = userRepository.findAll().size();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setLogin(DEFAULT_LOGIN); // this login should already be used
+    managedUserVM.setPassword(DEFAULT_PASSWORD);
+    managedUserVM.setFirstName(DEFAULT_FIRSTNAME);
+    managedUserVM.setLastName(DEFAULT_LASTNAME);
+    managedUserVM.setEmail("anothermail@localhost");
+    managedUserVM.setActivated(true);
+    managedUserVM.setImageUrl(DEFAULT_IMAGEURL);
+    managedUserVM.setLangKey(DEFAULT_LANGKEY);
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    // Create the User
+    restUserMockMvc
+      .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isBadRequest());
+
+    // Validate the User in the database
+    assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate));
+  }
+
+  @Test
+  @Transactional
+  public void createUserWithExistingEmail() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+    int databaseSizeBeforeCreate = userRepository.findAll().size();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setLogin("anotherlogin");
+    managedUserVM.setPassword(DEFAULT_PASSWORD);
+    managedUserVM.setFirstName(DEFAULT_FIRSTNAME);
+    managedUserVM.setLastName(DEFAULT_LASTNAME);
+    managedUserVM.setEmail(DEFAULT_EMAIL); // this email should already be used
+    managedUserVM.setActivated(true);
+    managedUserVM.setImageUrl(DEFAULT_IMAGEURL);
+    managedUserVM.setLangKey(DEFAULT_LANGKEY);
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    // Create the User
+    restUserMockMvc
+      .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isBadRequest());
+
+    // Validate the User in the database
+    assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate));
+  }
+
+  @Test
+  @Transactional
+  public void getAllUsers() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+
+    // Get all the users
+    restUserMockMvc
+      .perform(get("/api/users?sort=id,desc").accept(MediaType.APPLICATION_JSON))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN)))
+      .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME)))
+      .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME)))
+      .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL)))
+      .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL)))
+      .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY)));
+  }
+
+  @Test
+  @Transactional
+  public void getUser() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+
+    // Get the user
+    restUserMockMvc
+      .perform(get("/api/users/{login}", user.getLogin()))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$.login").value(user.getLogin()))
+      .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME))
+      .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME))
+      .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL))
+      .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL))
+      .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY));
+  }
+
+  @Test
+  @Transactional
+  public void getNonExistingUser() throws Exception {
+    restUserMockMvc.perform(get("/api/users/unknown")).andExpect(status().isNotFound());
+  }
+
+  @Test
+  @Transactional
+  public void updateUser() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+    int databaseSizeBeforeUpdate = userRepository.findAll().size();
+
+    // Update the user
+    User updatedUser = userRepository.findById(user.getId()).get();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setId(updatedUser.getId());
+    managedUserVM.setLogin(updatedUser.getLogin());
+    managedUserVM.setPassword(UPDATED_PASSWORD);
+    managedUserVM.setFirstName(UPDATED_FIRSTNAME);
+    managedUserVM.setLastName(UPDATED_LASTNAME);
+    managedUserVM.setEmail(UPDATED_EMAIL);
+    managedUserVM.setActivated(updatedUser.getActivated());
+    managedUserVM.setImageUrl(UPDATED_IMAGEURL);
+    managedUserVM.setLangKey(UPDATED_LANGKEY);
+    managedUserVM.setCreatedBy(updatedUser.getCreatedBy());
+    managedUserVM.setCreatedDate(updatedUser.getCreatedDate());
+    managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy());
+    managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate());
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restUserMockMvc
+      .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isOk());
+
+    // Validate the User in the database
+    assertPersistedUsers(
+      users -> {
+        assertThat(users).hasSize(databaseSizeBeforeUpdate);
+        User testUser = users.get(users.size() - 1);
+        assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME);
+        assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME);
+        assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL);
+        assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL);
+        assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY);
+      }
+    );
+  }
+
+  @Test
+  @Transactional
+  public void updateUserLogin() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+    int databaseSizeBeforeUpdate = userRepository.findAll().size();
+
+    // Update the user
+    User updatedUser = userRepository.findById(user.getId()).get();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setId(updatedUser.getId());
+    managedUserVM.setLogin(UPDATED_LOGIN);
+    managedUserVM.setPassword(UPDATED_PASSWORD);
+    managedUserVM.setFirstName(UPDATED_FIRSTNAME);
+    managedUserVM.setLastName(UPDATED_LASTNAME);
+    managedUserVM.setEmail(UPDATED_EMAIL);
+    managedUserVM.setActivated(updatedUser.getActivated());
+    managedUserVM.setImageUrl(UPDATED_IMAGEURL);
+    managedUserVM.setLangKey(UPDATED_LANGKEY);
+    managedUserVM.setCreatedBy(updatedUser.getCreatedBy());
+    managedUserVM.setCreatedDate(updatedUser.getCreatedDate());
+    managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy());
+    managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate());
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restUserMockMvc
+      .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isOk());
+
+    // Validate the User in the database
+    assertPersistedUsers(
+      users -> {
+        assertThat(users).hasSize(databaseSizeBeforeUpdate);
+        User testUser = users.get(users.size() - 1);
+        assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN);
+        assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME);
+        assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME);
+        assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL);
+        assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL);
+        assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY);
+      }
+    );
+  }
+
+  @Test
+  @Transactional
+  public void updateUserExistingEmail() throws Exception {
+    // Initialize the database with 2 users
+    userRepository.saveAndFlush(user);
+
+    User anotherUser = new User();
+    anotherUser.setLogin("jhipster");
+    anotherUser.setPassword(RandomStringUtils.random(60));
+    anotherUser.setActivated(true);
+    anotherUser.setEmail("jhipster@localhost");
+    anotherUser.setFirstName("java");
+    anotherUser.setLastName("hipster");
+    anotherUser.setImageUrl("");
+    anotherUser.setLangKey("en");
+    userRepository.saveAndFlush(anotherUser);
+
+    // Update the user
+    User updatedUser = userRepository.findById(user.getId()).get();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setId(updatedUser.getId());
+    managedUserVM.setLogin(updatedUser.getLogin());
+    managedUserVM.setPassword(updatedUser.getPassword());
+    managedUserVM.setFirstName(updatedUser.getFirstName());
+    managedUserVM.setLastName(updatedUser.getLastName());
+    managedUserVM.setEmail("jhipster@localhost"); // this email should already be used by anotherUser
+    managedUserVM.setActivated(updatedUser.getActivated());
+    managedUserVM.setImageUrl(updatedUser.getImageUrl());
+    managedUserVM.setLangKey(updatedUser.getLangKey());
+    managedUserVM.setCreatedBy(updatedUser.getCreatedBy());
+    managedUserVM.setCreatedDate(updatedUser.getCreatedDate());
+    managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy());
+    managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate());
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restUserMockMvc
+      .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isBadRequest());
+  }
+
+  @Test
+  @Transactional
+  public void updateUserExistingLogin() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+
+    User anotherUser = new User();
+    anotherUser.setLogin("jhipster");
+    anotherUser.setPassword(RandomStringUtils.random(60));
+    anotherUser.setActivated(true);
+    anotherUser.setEmail("jhipster@localhost");
+    anotherUser.setFirstName("java");
+    anotherUser.setLastName("hipster");
+    anotherUser.setImageUrl("");
+    anotherUser.setLangKey("en");
+    userRepository.saveAndFlush(anotherUser);
+
+    // Update the user
+    User updatedUser = userRepository.findById(user.getId()).get();
+
+    ManagedUserVM managedUserVM = new ManagedUserVM();
+    managedUserVM.setId(updatedUser.getId());
+    managedUserVM.setLogin("jhipster"); // this login should already be used by anotherUser
+    managedUserVM.setPassword(updatedUser.getPassword());
+    managedUserVM.setFirstName(updatedUser.getFirstName());
+    managedUserVM.setLastName(updatedUser.getLastName());
+    managedUserVM.setEmail(updatedUser.getEmail());
+    managedUserVM.setActivated(updatedUser.getActivated());
+    managedUserVM.setImageUrl(updatedUser.getImageUrl());
+    managedUserVM.setLangKey(updatedUser.getLangKey());
+    managedUserVM.setCreatedBy(updatedUser.getCreatedBy());
+    managedUserVM.setCreatedDate(updatedUser.getCreatedDate());
+    managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy());
+    managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate());
+    managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    restUserMockMvc
+      .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)))
+      .andExpect(status().isBadRequest());
+  }
+
+  @Test
+  @Transactional
+  public void deleteUser() throws Exception {
+    // Initialize the database
+    userRepository.saveAndFlush(user);
+    int databaseSizeBeforeDelete = userRepository.findAll().size();
+
+    // Delete the user
+    restUserMockMvc
+      .perform(delete("/api/users/{login}", user.getLogin()).accept(MediaType.APPLICATION_JSON))
+      .andExpect(status().isNoContent());
+
+    // Validate the database is empty
+    assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeDelete - 1));
+  }
+
+  @Test
+  @Transactional
+  public void getAllAuthorities() throws Exception {
+    restUserMockMvc
+      .perform(get("/api/users/authorities").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON))
+      .andExpect(status().isOk())
+      .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+      .andExpect(jsonPath("$").isArray())
+      .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN)));
+  }
+
+  @Test
+  public void testUserEquals() throws Exception {
+    TestUtil.equalsVerifier(User.class);
+    User user1 = new User();
+    user1.setId(1L);
+    User user2 = new User();
+    user2.setId(user1.getId());
+    assertThat(user1).isEqualTo(user2);
+    user2.setId(2L);
+    assertThat(user1).isNotEqualTo(user2);
+    user1.setId(null);
+    assertThat(user1).isNotEqualTo(user2);
+  }
+
+  @Test
+  public void testUserDTOtoUser() {
+    UserDTO userDTO = new UserDTO();
+    userDTO.setId(DEFAULT_ID);
+    userDTO.setLogin(DEFAULT_LOGIN);
+    userDTO.setFirstName(DEFAULT_FIRSTNAME);
+    userDTO.setLastName(DEFAULT_LASTNAME);
+    userDTO.setEmail(DEFAULT_EMAIL);
+    userDTO.setActivated(true);
+    userDTO.setImageUrl(DEFAULT_IMAGEURL);
+    userDTO.setLangKey(DEFAULT_LANGKEY);
+    userDTO.setCreatedBy(DEFAULT_LOGIN);
+    userDTO.setLastModifiedBy(DEFAULT_LOGIN);
+    userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER));
+
+    User user = userMapper.userDTOToUser(userDTO);
+    assertThat(user.getId()).isEqualTo(DEFAULT_ID);
+    assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN);
+    assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME);
+    assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME);
+    assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL);
+    assertThat(user.getActivated()).isEqualTo(true);
+    assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL);
+    assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY);
+    assertThat(user.getCreatedBy()).isNull();
+    assertThat(user.getCreatedDate()).isNotNull();
+    assertThat(user.getLastModifiedBy()).isNull();
+    assertThat(user.getLastModifiedDate()).isNotNull();
+    assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER);
+  }
+
+  @Test
+  public void testUserToUserDTO() {
+    user.setId(DEFAULT_ID);
+    user.setCreatedBy(DEFAULT_LOGIN);
+    user.setCreatedDate(Instant.now());
+    user.setLastModifiedBy(DEFAULT_LOGIN);
+    user.setLastModifiedDate(Instant.now());
+    Set<Authority> authorities = new HashSet<>();
+    Authority authority = new Authority();
+    authority.setName(AuthoritiesConstants.USER);
+    authorities.add(authority);
+    user.setAuthorities(authorities);
+
+    UserDTO userDTO = userMapper.userToUserDTO(user);
+
+    assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID);
+    assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN);
+    assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME);
+    assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME);
+    assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL);
+    assertThat(userDTO.isActivated()).isEqualTo(true);
+    assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL);
+    assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY);
+    assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN);
+    assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate());
+    assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN);
+    assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate());
+    assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER);
+    assertThat(userDTO.toString()).isNotNull();
+  }
+
+  @Test
+  public void testAuthorityEquals() {
+    Authority authorityA = new Authority();
+    assertThat(authorityA).isEqualTo(authorityA);
+    assertThat(authorityA).isNotEqualTo(null);
+    assertThat(authorityA).isNotEqualTo(new Object());
+    assertThat(authorityA.hashCode()).isEqualTo(0);
+    assertThat(authorityA.toString()).isNotNull();
+
+    Authority authorityB = new Authority();
+    assertThat(authorityA).isEqualTo(authorityB);
+
+    authorityB.setName(AuthoritiesConstants.ADMIN);
+    assertThat(authorityA).isNotEqualTo(authorityB);
+
+    authorityA.setName(AuthoritiesConstants.USER);
+    assertThat(authorityA).isNotEqualTo(authorityB);
+
+    authorityB.setName(AuthoritiesConstants.USER);
+    assertThat(authorityA).isEqualTo(authorityB);
+    assertThat(authorityA.hashCode()).isEqualTo(authorityB.hashCode());
+  }
+
+  private void assertPersistedUsers(Consumer<List<User>> userAssertion) {
+    userAssertion.accept(userRepository.findAll());
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java
new file mode 100644
index 0000000000000000000000000000000000000000..35024207a98f7c36e001bbb9a6a5a49e1e6bf6ab
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java
@@ -0,0 +1,23 @@
+package com.ippon.borestop.web.rest;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.test.context.support.WithSecurityContext;
+import org.springframework.security.test.context.support.WithSecurityContextFactory;
+
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@WithSecurityContext(factory = WithUnauthenticatedMockUser.Factory.class)
+public @interface WithUnauthenticatedMockUser {
+  class Factory implements WithSecurityContextFactory<WithUnauthenticatedMockUser> {
+
+    @Override
+    public SecurityContext createSecurityContext(WithUnauthenticatedMockUser annotation) {
+      return SecurityContextHolder.createEmptyContext();
+    }
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..853322e552dcbe143868997903b20f7df54ca2cc
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java
@@ -0,0 +1,117 @@
+package com.ippon.borestop.web.rest.errors;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.ippon.borestop.BorestopApp;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+
+/**
+ * Integration tests {@link ExceptionTranslator} controller advice.
+ */
+@WithMockUser
+@AutoConfigureMockMvc
+@SpringBootTest(classes = BorestopApp.class)
+public class ExceptionTranslatorIT {
+  @Autowired
+  private MockMvc mockMvc;
+
+  @Test
+  public void testConcurrencyFailure() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/concurrency-failure"))
+      .andExpect(status().isConflict())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE));
+  }
+
+  @Test
+  public void testMethodArgumentNotValid() throws Exception {
+    mockMvc
+      .perform(post("/api/exception-translator-test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON))
+      .andExpect(status().isBadRequest())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION))
+      .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("test"))
+      .andExpect(jsonPath("$.fieldErrors.[0].field").value("test"))
+      .andExpect(jsonPath("$.fieldErrors.[0].message").value("NotNull"));
+  }
+
+  @Test
+  public void testMissingServletRequestPartException() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/missing-servlet-request-part"))
+      .andExpect(status().isBadRequest())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.400"));
+  }
+
+  @Test
+  public void testMissingServletRequestParameterException() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/missing-servlet-request-parameter"))
+      .andExpect(status().isBadRequest())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.400"));
+  }
+
+  @Test
+  public void testAccessDenied() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/access-denied"))
+      .andExpect(status().isForbidden())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.403"))
+      .andExpect(jsonPath("$.detail").value("test access denied!"));
+  }
+
+  @Test
+  public void testUnauthorized() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/unauthorized"))
+      .andExpect(status().isUnauthorized())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.401"))
+      .andExpect(jsonPath("$.path").value("/api/exception-translator-test/unauthorized"))
+      .andExpect(jsonPath("$.detail").value("test authentication failed!"));
+  }
+
+  @Test
+  public void testMethodNotSupported() throws Exception {
+    mockMvc
+      .perform(post("/api/exception-translator-test/access-denied"))
+      .andExpect(status().isMethodNotAllowed())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.405"))
+      .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported"));
+  }
+
+  @Test
+  public void testExceptionWithResponseStatus() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/response-status"))
+      .andExpect(status().isBadRequest())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.400"))
+      .andExpect(jsonPath("$.title").value("test response status"));
+  }
+
+  @Test
+  public void testInternalServerError() throws Exception {
+    mockMvc
+      .perform(get("/api/exception-translator-test/internal-server-error"))
+      .andExpect(status().isInternalServerError())
+      .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
+      .andExpect(jsonPath("$.message").value("error.http.500"))
+      .andExpect(jsonPath("$.title").value("Internal Server Error"));
+  }
+}
diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3effbbedc6d8f84a1a2802656123dd03a1971c4
--- /dev/null
+++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java
@@ -0,0 +1,65 @@
+package com.ippon.borestop.web.rest.errors;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import org.springframework.dao.ConcurrencyFailureException;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/exception-translator-test")
+public class ExceptionTranslatorTestController {
+
+  @GetMapping("/concurrency-failure")
+  public void concurrencyFailure() {
+    throw new ConcurrencyFailureException("test concurrency failure");
+  }
+
+  @PostMapping("/method-argument")
+  public void methodArgument(@Valid @RequestBody TestDTO testDTO) {}
+
+  @GetMapping("/missing-servlet-request-part")
+  public void missingServletRequestPartException(@RequestPart String part) {}
+
+  @GetMapping("/missing-servlet-request-parameter")
+  public void missingServletRequestParameterException(@RequestParam String param) {}
+
+  @GetMapping("/access-denied")
+  public void accessdenied() {
+    throw new AccessDeniedException("test access denied!");
+  }
+
+  @GetMapping("/unauthorized")
+  public void unauthorized() {
+    throw new BadCredentialsException("test authentication failed!");
+  }
+
+  @GetMapping("/response-status")
+  public void exceptionWithResponseStatus() {
+    throw new TestResponseStatusException();
+  }
+
+  @GetMapping("/internal-server-error")
+  public void internalServerError() {
+    throw new RuntimeException();
+  }
+
+  public static class TestDTO {
+    @NotNull
+    private String test;
+
+    public String getTest() {
+      return test;
+    }
+
+    public void setTest(String test) {
+      this.test = test;
+    }
+  }
+
+  @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status")
+  @SuppressWarnings("serial")
+  public static class TestResponseStatusException extends RuntimeException {}
+}
diff --git a/borestop/src/test/javascript/jest-global-mocks.ts b/borestop/src/test/javascript/jest-global-mocks.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a802d1b3774cc9b6d7f3b2d6b92a53486e34c38d
--- /dev/null
+++ b/borestop/src/test/javascript/jest-global-mocks.ts
@@ -0,0 +1,3 @@
+Object.defineProperty(window, 'getComputedStyle', {
+  value: () => ['-webkit-appearance']
+});
diff --git a/borestop/src/test/javascript/jest.conf.js b/borestop/src/test/javascript/jest.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..17293489ba23bc1c822e864484063711a9995ea9
--- /dev/null
+++ b/borestop/src/test/javascript/jest.conf.js
@@ -0,0 +1,53 @@
+const tsconfig = require('../../../tsconfig.base.json');
+
+module.exports = {
+  preset: 'jest-preset-angular',
+  setupFiles: ['jest-date-mock'],
+  setupFilesAfterEnv: ['<rootDir>/src/test/javascript/jest.ts'],
+  cacheDirectory: '<rootDir>/target/jest-cache',
+  coverageDirectory: '<rootDir>/target/test-results/',
+  globals: {
+    'ts-jest': {
+      stringifyContentPathRegex: '\\.html$',
+      tsConfig: '<rootDir>/tsconfig.base.json',
+      astTransformers: ['jest-preset-angular/build/InlineFilesTransformer', 'jest-preset-angular/build/StripStylesTransformer']
+    }
+  },
+  coveragePathIgnorePatterns: ['<rootDir>/src/test/javascript'],
+  moduleNameMapper: mapTypescriptAliasToJestAlias(),
+  reporters: ['default', ['jest-junit', { outputDirectory: './target/test-results/', outputName: 'TESTS-results-jest.xml' }]],
+  testResultsProcessor: 'jest-sonar-reporter',
+  transformIgnorePatterns: ['node_modules/'],
+  testMatch: ['<rootDir>/src/test/javascript/spec/**/@(*.)@(spec.ts)'],
+  rootDir: '../../../',
+  testURL: 'http://localhost/'
+};
+
+function mapTypescriptAliasToJestAlias(alias = {}) {
+  const jestAliases = { ...alias };
+  if (!tsconfig.compilerOptions.paths) {
+    return jestAliases;
+  }
+  Object.entries(tsconfig.compilerOptions.paths)
+    .filter(([key, value]) => {
+      // use Typescript alias in Jest only if this has value
+      if (value.length) {
+        return true;
+      }
+      return false;
+    })
+    .map(([key, value]) => {
+      // if Typescript alias ends with /* then in Jest:
+      // - alias key must end with /(.*)
+      // - alias value must end with /$1
+      const regexToReplace = /(.*)\/\*$/;
+      const aliasKey = key.replace(regexToReplace, '$1/(.*)');
+      const aliasValue = value[0].replace(regexToReplace, '$1/$$1');
+      return [aliasKey, `<rootDir>/${aliasValue}`];
+    })
+    .reduce((aliases, [key, value]) => {
+      aliases[key] = value;
+      return aliases;
+    }, jestAliases);
+  return jestAliases;
+}
diff --git a/borestop/src/test/javascript/jest.ts b/borestop/src/test/javascript/jest.ts
new file mode 100644
index 0000000000000000000000000000000000000000..904329f538cb2dcbe482f21f47c834e35d4ef957
--- /dev/null
+++ b/borestop/src/test/javascript/jest.ts
@@ -0,0 +1,2 @@
+import 'jest-preset-angular';
+import './jest-global-mocks';
diff --git a/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..89ef80ecbfa3c5ca33fb59b8758d4a12826cc8bd
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts
@@ -0,0 +1,72 @@
+import { TestBed, async, tick, fakeAsync, inject } from '@angular/core/testing';
+import { ActivatedRoute } from '@angular/router';
+import { of, throwError } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { MockActivatedRoute } from '../../../helpers/mock-route.service';
+import { ActivateService } from 'app/account/activate/activate.service';
+import { ActivateComponent } from 'app/account/activate/activate.component';
+
+describe('Component Tests', () => {
+  describe('ActivateComponent', () => {
+    let comp: ActivateComponent;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [ActivateComponent],
+        providers: [
+          {
+            provide: ActivatedRoute,
+            useValue: new MockActivatedRoute({ key: 'ABC123' })
+          }
+        ]
+      })
+        .overrideTemplate(ActivateComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      const fixture = TestBed.createComponent(ActivateComponent);
+      comp = fixture.componentInstance;
+    });
+
+    it('calls activate.get with the key from params', inject(
+      [ActivateService],
+      fakeAsync((service: ActivateService) => {
+        spyOn(service, 'get').and.returnValue(of());
+
+        comp.ngOnInit();
+        tick();
+
+        expect(service.get).toHaveBeenCalledWith('ABC123');
+      })
+    ));
+
+    it('should set set success to true upon successful activation', inject(
+      [ActivateService],
+      fakeAsync((service: ActivateService) => {
+        spyOn(service, 'get').and.returnValue(of({}));
+
+        comp.ngOnInit();
+        tick();
+
+        expect(comp.error).toBe(false);
+        expect(comp.success).toBe(true);
+      })
+    ));
+
+    it('should set set error to true upon activation failure', inject(
+      [ActivateService],
+      fakeAsync((service: ActivateService) => {
+        spyOn(service, 'get').and.returnValue(throwError('ERROR'));
+
+        comp.ngOnInit();
+        tick();
+
+        expect(comp.error).toBe(true);
+        expect(comp.success).toBe(false);
+      })
+    ));
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..005fe2db21c443aa298aed10bdc688ac5ade1e90
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts
@@ -0,0 +1,102 @@
+import { ElementRef } from '@angular/core';
+import { ComponentFixture, TestBed, inject, tick, fakeAsync } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { of, throwError } from 'rxjs';
+
+import { BorestopTestModule } from '../../../../test.module';
+import { PasswordResetFinishComponent } from 'app/account/password-reset/finish/password-reset-finish.component';
+import { PasswordResetFinishService } from 'app/account/password-reset/finish/password-reset-finish.service';
+import { MockActivatedRoute } from '../../../../helpers/mock-route.service';
+
+describe('Component Tests', () => {
+  describe('PasswordResetFinishComponent', () => {
+    let fixture: ComponentFixture<PasswordResetFinishComponent>;
+    let comp: PasswordResetFinishComponent;
+
+    beforeEach(() => {
+      fixture = TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [PasswordResetFinishComponent],
+        providers: [
+          FormBuilder,
+          {
+            provide: ActivatedRoute,
+            useValue: new MockActivatedRoute({ key: 'XYZPDQ' })
+          }
+        ]
+      })
+        .overrideTemplate(PasswordResetFinishComponent, '')
+        .createComponent(PasswordResetFinishComponent);
+    });
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(PasswordResetFinishComponent);
+      comp = fixture.componentInstance;
+      comp.ngOnInit();
+    });
+
+    it('should define its initial state', () => {
+      expect(comp.initialized).toBe(true);
+      expect(comp.key).toEqual('XYZPDQ');
+    });
+
+    it('sets focus after the view has been initialized', () => {
+      const node = {
+        focus(): void {}
+      };
+      comp.newPassword = new ElementRef(node);
+      spyOn(node, 'focus');
+
+      comp.ngAfterViewInit();
+
+      expect(node.focus).toHaveBeenCalled();
+    });
+
+    it('should ensure the two passwords entered match', () => {
+      comp.passwordForm.patchValue({
+        newPassword: 'password',
+        confirmPassword: 'non-matching'
+      });
+
+      comp.finishReset();
+
+      expect(comp.doNotMatch).toBe(true);
+    });
+
+    it('should update success to true after resetting password', inject(
+      [PasswordResetFinishService],
+      fakeAsync((service: PasswordResetFinishService) => {
+        spyOn(service, 'save').and.returnValue(of({}));
+        comp.passwordForm.patchValue({
+          newPassword: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.finishReset();
+        tick();
+
+        expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password');
+        expect(comp.success).toBe(true);
+      })
+    ));
+
+    it('should notify of generic error', inject(
+      [PasswordResetFinishService],
+      fakeAsync((service: PasswordResetFinishService) => {
+        spyOn(service, 'save').and.returnValue(throwError('ERROR'));
+        comp.passwordForm.patchValue({
+          newPassword: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.finishReset();
+        tick();
+
+        expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password');
+        expect(comp.success).toBe(false);
+        expect(comp.error).toBe(true);
+      })
+    ));
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..abbe693c1fd0eebc978ab9de29347e4d0ad1d0ad
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts
@@ -0,0 +1,66 @@
+import { ElementRef } from '@angular/core';
+import { ComponentFixture, TestBed, inject } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { of, throwError } from 'rxjs';
+
+import { BorestopTestModule } from '../../../../test.module';
+import { PasswordResetInitComponent } from 'app/account/password-reset/init/password-reset-init.component';
+import { PasswordResetInitService } from 'app/account/password-reset/init/password-reset-init.service';
+
+describe('Component Tests', () => {
+  describe('PasswordResetInitComponent', () => {
+    let fixture: ComponentFixture<PasswordResetInitComponent>;
+    let comp: PasswordResetInitComponent;
+
+    beforeEach(() => {
+      fixture = TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [PasswordResetInitComponent],
+        providers: [FormBuilder]
+      })
+        .overrideTemplate(PasswordResetInitComponent, '')
+        .createComponent(PasswordResetInitComponent);
+      comp = fixture.componentInstance;
+    });
+
+    it('sets focus after the view has been initialized', () => {
+      const node = {
+        focus(): void {}
+      };
+      comp.email = new ElementRef(node);
+      spyOn(node, 'focus');
+
+      comp.ngAfterViewInit();
+
+      expect(node.focus).toHaveBeenCalled();
+    });
+
+    it('notifies of success upon successful requestReset', inject([PasswordResetInitService], (service: PasswordResetInitService) => {
+      spyOn(service, 'save').and.returnValue(of({}));
+      comp.resetRequestForm.patchValue({
+        email: 'user@domain.com'
+      });
+
+      comp.requestReset();
+
+      expect(service.save).toHaveBeenCalledWith('user@domain.com');
+      expect(comp.success).toBe(true);
+    }));
+
+    it('no notification of success upon error response', inject([PasswordResetInitService], (service: PasswordResetInitService) => {
+      spyOn(service, 'save').and.returnValue(
+        throwError({
+          status: 503,
+          data: 'something else'
+        })
+      );
+      comp.resetRequestForm.patchValue({
+        email: 'user@domain.com'
+      });
+      comp.requestReset();
+
+      expect(service.save).toHaveBeenCalledWith('user@domain.com');
+      expect(comp.success).toBe(false);
+    }));
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ff1297e12b4cbc3ff65f457e99562abf23d42ca7
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts
@@ -0,0 +1,48 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+
+import { PasswordStrengthBarComponent } from 'app/account/password/password-strength-bar.component';
+
+describe('Component Tests', () => {
+  describe('PasswordStrengthBarComponent', () => {
+    let comp: PasswordStrengthBarComponent;
+    let fixture: ComponentFixture<PasswordStrengthBarComponent>;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        declarations: [PasswordStrengthBarComponent]
+      })
+        .overrideTemplate(PasswordStrengthBarComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(PasswordStrengthBarComponent);
+      comp = fixture.componentInstance;
+    });
+
+    describe('PasswordStrengthBarComponents', () => {
+      it('should initialize with default values', () => {
+        expect(comp.measureStrength('')).toBe(0);
+        expect(comp.colors).toEqual(['#F00', '#F90', '#FF0', '#9F0', '#0F0']);
+        expect(comp.getColor(0).idx).toBe(1);
+        expect(comp.getColor(0).color).toBe(comp.colors[0]);
+      });
+
+      it('should increase strength upon password value change', () => {
+        expect(comp.measureStrength('')).toBe(0);
+        expect(comp.measureStrength('aa')).toBeGreaterThanOrEqual(comp.measureStrength(''));
+        expect(comp.measureStrength('aa^6')).toBeGreaterThanOrEqual(comp.measureStrength('aa'));
+        expect(comp.measureStrength('Aa090(**)')).toBeGreaterThanOrEqual(comp.measureStrength('aa^6'));
+        expect(comp.measureStrength('Aa090(**)+-07365')).toBeGreaterThanOrEqual(comp.measureStrength('Aa090(**)'));
+      });
+
+      it('should change the color based on strength', () => {
+        expect(comp.getColor(0).color).toBe(comp.colors[0]);
+        expect(comp.getColor(11).color).toBe(comp.colors[1]);
+        expect(comp.getColor(22).color).toBe(comp.colors[2]);
+        expect(comp.getColor(33).color).toBe(comp.colors[3]);
+        expect(comp.getColor(44).color).toBe(comp.colors[4]);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f367d7883a368bcdb3d05926ad0e3df74a8540f3
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts
@@ -0,0 +1,102 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { FormBuilder } from '@angular/forms';
+import { of, throwError } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { PasswordComponent } from 'app/account/password/password.component';
+import { PasswordService } from 'app/account/password/password.service';
+
+describe('Component Tests', () => {
+  describe('PasswordComponent', () => {
+    let comp: PasswordComponent;
+    let fixture: ComponentFixture<PasswordComponent>;
+    let service: PasswordService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [PasswordComponent],
+        providers: [FormBuilder]
+      })
+        .overrideTemplate(PasswordComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(PasswordComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(PasswordService);
+    });
+
+    it('should show error if passwords do not match', () => {
+      // GIVEN
+      comp.passwordForm.patchValue({
+        newPassword: 'password1',
+        confirmPassword: 'password2'
+      });
+      // WHEN
+      comp.changePassword();
+      // THEN
+      expect(comp.doNotMatch).toBe(true);
+      expect(comp.error).toBe(false);
+      expect(comp.success).toBe(false);
+    });
+
+    it('should call Auth.changePassword when passwords match', () => {
+      // GIVEN
+      const passwordValues = {
+        currentPassword: 'oldPassword',
+        newPassword: 'myPassword'
+      };
+
+      spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true })));
+
+      comp.passwordForm.patchValue({
+        currentPassword: passwordValues.currentPassword,
+        newPassword: passwordValues.newPassword,
+        confirmPassword: passwordValues.newPassword
+      });
+
+      // WHEN
+      comp.changePassword();
+
+      // THEN
+      expect(service.save).toHaveBeenCalledWith(passwordValues.newPassword, passwordValues.currentPassword);
+    });
+
+    it('should set success to true upon success', () => {
+      // GIVEN
+      spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true })));
+      comp.passwordForm.patchValue({
+        newPassword: 'myPassword',
+        confirmPassword: 'myPassword'
+      });
+
+      // WHEN
+      comp.changePassword();
+
+      // THEN
+      expect(comp.doNotMatch).toBe(false);
+      expect(comp.error).toBe(false);
+      expect(comp.success).toBe(true);
+    });
+
+    it('should notify of error if change password fails', () => {
+      // GIVEN
+      spyOn(service, 'save').and.returnValue(throwError('ERROR'));
+      comp.passwordForm.patchValue({
+        newPassword: 'myPassword',
+        confirmPassword: 'myPassword'
+      });
+
+      // WHEN
+      comp.changePassword();
+
+      // THEN
+      expect(comp.doNotMatch).toBe(false);
+      expect(comp.success).toBe(false);
+      expect(comp.error).toBe(true);
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..da8c51fc2e9dd8f882c11b8e080555e7b24d068b
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts
@@ -0,0 +1,137 @@
+import { ComponentFixture, TestBed, async, inject, tick, fakeAsync } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { of, throwError } from 'rxjs';
+import { JhiLanguageService } from 'ng-jhipster';
+
+import { MockLanguageService } from '../../../helpers/mock-language.service';
+import { BorestopTestModule } from '../../../test.module';
+import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants';
+import { RegisterService } from 'app/account/register/register.service';
+import { RegisterComponent } from 'app/account/register/register.component';
+
+describe('Component Tests', () => {
+  describe('RegisterComponent', () => {
+    let fixture: ComponentFixture<RegisterComponent>;
+    let comp: RegisterComponent;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [RegisterComponent],
+        providers: [FormBuilder]
+      })
+        .overrideTemplate(RegisterComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(RegisterComponent);
+      comp = fixture.componentInstance;
+    });
+
+    it('should ensure the two passwords entered match', () => {
+      comp.registerForm.patchValue({
+        password: 'password',
+        confirmPassword: 'non-matching'
+      });
+
+      comp.register();
+
+      expect(comp.doNotMatch).toBe(true);
+    });
+
+    it('should update success to true after creating an account', inject(
+      [RegisterService, JhiLanguageService],
+      fakeAsync((service: RegisterService, mockTranslate: MockLanguageService) => {
+        spyOn(service, 'save').and.returnValue(of({}));
+        comp.registerForm.patchValue({
+          password: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.register();
+        tick();
+
+        expect(service.save).toHaveBeenCalledWith({
+          email: '',
+          password: 'password',
+          login: '',
+          langKey: 'en'
+        });
+        expect(comp.success).toBe(true);
+        expect(mockTranslate.getCurrentLanguageSpy).toHaveBeenCalled();
+        expect(comp.errorUserExists).toBe(false);
+        expect(comp.errorEmailExists).toBe(false);
+        expect(comp.error).toBe(false);
+      })
+    ));
+
+    it('should notify of user existence upon 400/login already in use', inject(
+      [RegisterService],
+      fakeAsync((service: RegisterService) => {
+        spyOn(service, 'save').and.returnValue(
+          throwError({
+            status: 400,
+            error: { type: LOGIN_ALREADY_USED_TYPE }
+          })
+        );
+        comp.registerForm.patchValue({
+          password: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.register();
+        tick();
+
+        expect(comp.errorUserExists).toBe(true);
+        expect(comp.errorEmailExists).toBe(false);
+        expect(comp.error).toBe(false);
+      })
+    ));
+
+    it('should notify of email existence upon 400/email address already in use', inject(
+      [RegisterService],
+      fakeAsync((service: RegisterService) => {
+        spyOn(service, 'save').and.returnValue(
+          throwError({
+            status: 400,
+            error: { type: EMAIL_ALREADY_USED_TYPE }
+          })
+        );
+        comp.registerForm.patchValue({
+          password: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.register();
+        tick();
+
+        expect(comp.errorEmailExists).toBe(true);
+        expect(comp.errorUserExists).toBe(false);
+        expect(comp.error).toBe(false);
+      })
+    ));
+
+    it('should notify of generic error', inject(
+      [RegisterService],
+      fakeAsync((service: RegisterService) => {
+        spyOn(service, 'save').and.returnValue(
+          throwError({
+            status: 503
+          })
+        );
+        comp.registerForm.patchValue({
+          password: 'password',
+          confirmPassword: 'password'
+        });
+
+        comp.register();
+        tick();
+
+        expect(comp.errorUserExists).toBe(false);
+        expect(comp.errorEmailExists).toBe(false);
+        expect(comp.error).toBe(true);
+      })
+    ));
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a6dd52ac92a4a2f5d68121471ad44c838204cee0
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts
@@ -0,0 +1,89 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { throwError, of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+import { SettingsComponent } from 'app/account/settings/settings.component';
+import { MockAccountService } from '../../../helpers/mock-account.service';
+
+describe('Component Tests', () => {
+  describe('SettingsComponent', () => {
+    let comp: SettingsComponent;
+    let fixture: ComponentFixture<SettingsComponent>;
+    let mockAuth: MockAccountService;
+    const accountValues: Account = {
+      firstName: 'John',
+      lastName: 'Doe',
+      activated: true,
+      email: 'john.doe@mail.com',
+      langKey: 'en',
+      login: 'john',
+      authorities: [],
+      imageUrl: ''
+    };
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [SettingsComponent],
+        providers: [FormBuilder]
+      })
+        .overrideTemplate(SettingsComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(SettingsComponent);
+      comp = fixture.componentInstance;
+      mockAuth = TestBed.get(AccountService);
+      mockAuth.setIdentityResponse(accountValues);
+    });
+
+    it('should send the current identity upon save', () => {
+      // GIVEN
+      mockAuth.saveSpy.and.returnValue(of({}));
+      const settingsFormValues = {
+        firstName: 'John',
+        lastName: 'Doe',
+        email: 'john.doe@mail.com',
+        langKey: 'en'
+      };
+
+      // WHEN
+      comp.ngOnInit();
+      comp.save();
+
+      // THEN
+      expect(mockAuth.identitySpy).toHaveBeenCalled();
+      expect(mockAuth.saveSpy).toHaveBeenCalledWith(accountValues);
+      expect(mockAuth.authenticateSpy).toHaveBeenCalledWith(accountValues);
+      expect(comp.settingsForm.value).toEqual(settingsFormValues);
+    });
+
+    it('should notify of success upon successful save', () => {
+      // GIVEN
+      mockAuth.saveSpy.and.returnValue(of({}));
+
+      // WHEN
+      comp.ngOnInit();
+      comp.save();
+
+      // THEN
+      expect(comp.success).toBe(true);
+    });
+
+    it('should notify of error upon failed save', () => {
+      // GIVEN
+      mockAuth.saveSpy.and.returnValue(throwError('ERROR'));
+
+      // WHEN
+      comp.ngOnInit();
+      comp.save();
+
+      // THEN
+      expect(comp.success).toBe(false);
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..56197a0a60d17534016a79a49dbae7e26914abff
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts
@@ -0,0 +1,204 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { Router, ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+import { advanceTo } from 'jest-date-mock';
+
+import { BorestopTestModule } from '../../../test.module';
+import { AuditsComponent } from 'app/admin/audits/audits.component';
+import { AuditsService } from 'app/admin/audits/audits.service';
+import { Audit } from 'app/admin/audits/audit.model';
+import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants';
+import { MockRouter, MockActivatedRoute } from '../../../helpers/mock-route.service';
+
+function build2DigitsDatePart(datePart: number): string {
+  return `0${datePart}`.slice(-2);
+}
+
+function getDate(isToday = true): string {
+  let date: Date = new Date();
+  if (isToday) {
+    // Today + 1 day - needed if the current day must be included
+    date.setDate(date.getDate() + 1);
+  } else {
+    // get last month
+    if (date.getMonth() === 0) {
+      date = new Date(date.getFullYear() - 1, 11, date.getDate());
+    } else {
+      date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
+    }
+  }
+  const monthString = build2DigitsDatePart(date.getMonth() + 1);
+  const dateString = build2DigitsDatePart(date.getDate());
+  return `${date.getFullYear()}-${monthString}-${dateString}`;
+}
+
+describe('Component Tests', () => {
+  describe('AuditsComponent', () => {
+    let comp: AuditsComponent;
+    let fixture: ComponentFixture<AuditsComponent>;
+    let service: AuditsService;
+    let mockRouter: MockRouter;
+    let mockActivatedRoute: MockActivatedRoute;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [AuditsComponent],
+        providers: [AuditsService]
+      })
+        .overrideTemplate(AuditsComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(AuditsComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(AuditsService);
+      mockRouter = TestBed.get(Router);
+      mockActivatedRoute = TestBed.get(ActivatedRoute);
+    });
+
+    describe('today function', () => {
+      it('should set toDate to current date', () => {
+        comp.ngOnInit();
+        expect(comp.toDate).toBe(getDate());
+      });
+
+      it('if current day is last day of month then should set toDate to first day of next month', () => {
+        advanceTo(new Date(2019, 0, 31, 0, 0, 0));
+        comp.ngOnInit();
+        expect(comp.toDate).toBe('2019-02-01');
+      });
+
+      it('if current day is not last day of month then should set toDate to next day of current month', () => {
+        advanceTo(new Date(2019, 0, 27, 0, 0, 0));
+        comp.ngOnInit();
+        expect(comp.toDate).toBe('2019-01-28');
+      });
+    });
+
+    describe('previousMonth function', () => {
+      it('should set fromDate to previous month', () => {
+        comp.ngOnInit();
+        expect(comp.fromDate).toBe(getDate(false));
+      });
+
+      it('if current month is January then should set fromDate to previous year last month', () => {
+        advanceTo(new Date(2019, 0, 20, 0, 0, 0));
+        comp.ngOnInit();
+        expect(comp.fromDate).toBe('2018-12-20');
+      });
+
+      it('if current month is not January then should set fromDate to current year previous month', () => {
+        advanceTo(new Date(2019, 1, 20, 0, 0, 0));
+        comp.ngOnInit();
+        expect(comp.fromDate).toBe('2019-01-20');
+      });
+    });
+
+    describe('By default, on init', () => {
+      it('should set all default values correctly', () => {
+        fixture.detectChanges();
+        expect(comp.toDate).toBe(getDate());
+        expect(comp.fromDate).toBe(getDate(false));
+        expect(comp.itemsPerPage).toBe(ITEMS_PER_PAGE);
+        expect(comp.page).toBe(1);
+        expect(comp.ascending).toBe(false);
+        expect(comp.predicate).toBe('id');
+      });
+    });
+
+    describe('OnInit', () => {
+      it('Should call load all on init', () => {
+        // GIVEN
+        const headers = new HttpHeaders().append('X-Total-Count', '1');
+        const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS');
+        spyOn(service, 'query').and.returnValue(
+          of(
+            new HttpResponse({
+              body: [audit],
+              headers
+            })
+          )
+        );
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.query).toHaveBeenCalledTimes(1);
+        expect(comp.audits && comp.audits[0]).toEqual(jasmine.objectContaining(audit));
+        expect(comp.totalItems).toBe(1);
+      });
+    });
+
+    describe('Create sort object', () => {
+      beforeEach(() => {
+        spyOn(service, 'query').and.returnValue(of(new HttpResponse({ body: null })));
+      });
+
+      it('Should sort only by id asc', () => {
+        // GIVEN
+        mockActivatedRoute.setParameters({
+          sort: 'id,desc'
+        });
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.query).toBeCalledWith(
+          expect.objectContaining({
+            sort: ['id,desc']
+          })
+        );
+      });
+
+      it('Should sort by timestamp asc then by id', () => {
+        // GIVEN
+        mockActivatedRoute.setParameters({
+          sort: 'timestamp,asc'
+        });
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.query).toBeCalledWith(
+          expect.objectContaining({
+            sort: ['timestamp,asc', 'id']
+          })
+        );
+      });
+    });
+
+    describe('transition', () => {
+      it('Should not query data if fromDate and toDate are empty', () => {
+        // GIVEN
+        comp.toDate = '';
+        comp.fromDate = '';
+
+        // WHEN
+        comp.transition();
+
+        // THEN
+        expect(comp.canLoad()).toBe(false);
+        expect(mockRouter.navigateSpy).not.toBeCalled();
+      });
+
+      it('Should query data if fromDate and toDate are not empty', () => {
+        // GIVEN
+        comp.toDate = getDate();
+        comp.fromDate = getDate(false);
+
+        // WHEN
+        comp.transition();
+
+        // THEN
+        expect(comp.canLoad()).toBe(true);
+        expect(mockRouter.navigateSpy).toBeCalled();
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d5073e2c24f1c1507d3e8b689b5c99a347de3ccc
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts
@@ -0,0 +1,70 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { HttpResponse, HttpErrorResponse } from '@angular/common/http';
+
+import { AuditsService, AuditsQuery } from 'app/admin/audits/audits.service';
+import { Audit } from 'app/admin/audits/audit.model';
+import { SERVER_API_URL } from 'app/app.constants';
+
+describe('Service Tests', () => {
+  describe('Audits Service', () => {
+    let service: AuditsService;
+    let httpMock: HttpTestingController;
+    const fakeRequest: AuditsQuery = { page: 0, size: 0, sort: [], fromDate: '', toDate: '' };
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule]
+      });
+
+      service = TestBed.get(AuditsService);
+      httpMock = TestBed.get(HttpTestingController);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('Service methods', () => {
+      it('should call correct URL', () => {
+        service.query(fakeRequest).subscribe();
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'management/audits';
+        expect(req.request.url).toEqual(resourceUrl);
+      });
+
+      it('should return Audits', () => {
+        let expectedResult: HttpResponse<Audit[]> = new HttpResponse({ body: [] });
+        const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS');
+
+        service.query(fakeRequest).subscribe(received => {
+          expectedResult = received;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush([audit]);
+        let audits: Audit[] = [];
+        if (expectedResult.body !== null) {
+          audits = expectedResult.body;
+        }
+        expect(audits.length).toBe(1);
+        expect(audits[0]).toEqual(audit);
+      });
+
+      it('should propagate not found response', () => {
+        let expectedResult = 0;
+        service.query(fakeRequest).subscribe(null, (error: HttpErrorResponse) => {
+          expectedResult = error.status;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush('Invalid request parameters', {
+          status: 404,
+          statusText: 'Bad Request'
+        });
+        expect(expectedResult).toEqual(404);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f26dc2bb369898aad1e7b32e577e35108df48438
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts
@@ -0,0 +1,68 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { ConfigurationComponent } from 'app/admin/configuration/configuration.component';
+import { ConfigurationService, Bean, PropertySource } from 'app/admin/configuration/configuration.service';
+
+describe('Component Tests', () => {
+  describe('ConfigurationComponent', () => {
+    let comp: ConfigurationComponent;
+    let fixture: ComponentFixture<ConfigurationComponent>;
+    let service: ConfigurationService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [ConfigurationComponent],
+        providers: [ConfigurationService]
+      })
+        .overrideTemplate(ConfigurationComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(ConfigurationComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(ConfigurationService);
+    });
+
+    describe('OnInit', () => {
+      it('Should call load all on init', () => {
+        // GIVEN
+        const beans: Bean[] = [
+          {
+            prefix: 'jhipster',
+            properties: {
+              clientApp: {
+                name: 'jhipsterApp'
+              }
+            }
+          }
+        ];
+        const propertySources: PropertySource[] = [
+          {
+            name: 'server.ports',
+            properties: {
+              'local.server.port': {
+                value: '8080'
+              }
+            }
+          }
+        ];
+        spyOn(service, 'getBeans').and.returnValue(of(beans));
+        spyOn(service, 'getPropertySources').and.returnValue(of(propertySources));
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.getBeans).toHaveBeenCalled();
+        expect(service.getPropertySources).toHaveBeenCalled();
+        expect(comp.allBeans).toEqual(beans);
+        expect(comp.beans).toEqual(beans);
+        expect(comp.propertySources).toEqual(propertySources);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2715a8fa3e6fe32971891f5742ceb56b5e14918d
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts
@@ -0,0 +1,81 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+
+import { ConfigurationService, ConfigProps, Env, Bean, PropertySource } from 'app/admin/configuration/configuration.service';
+import { SERVER_API_URL } from 'app/app.constants';
+
+describe('Service Tests', () => {
+  describe('Logs Service', () => {
+    let service: ConfigurationService;
+    let httpMock: HttpTestingController;
+    let expectedResult: Bean[] | PropertySource[] | null;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule]
+      });
+
+      expectedResult = null;
+      service = TestBed.get(ConfigurationService);
+      httpMock = TestBed.get(HttpTestingController);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('Service methods', () => {
+      it('should call correct URL', () => {
+        service.getBeans().subscribe();
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'management/configprops';
+        expect(req.request.url).toEqual(resourceUrl);
+      });
+
+      it('should get the config', () => {
+        const bean: Bean = {
+          prefix: 'jhipster',
+          properties: {
+            clientApp: {
+              name: 'jhipsterApp'
+            }
+          }
+        };
+        const configProps: ConfigProps = {
+          contexts: {
+            jhipster: {
+              beans: {
+                'io.github.jhipster.config.JHipsterProperties': bean
+              }
+            }
+          }
+        };
+        service.getBeans().subscribe(received => (expectedResult = received));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(configProps);
+        expect(expectedResult).toEqual([bean]);
+      });
+
+      it('should get the env', () => {
+        const propertySources: PropertySource[] = [
+          {
+            name: 'server.ports',
+            properties: {
+              'local.server.port': {
+                value: '8080'
+              }
+            }
+          }
+        ];
+        const env: Env = { propertySources };
+        service.getPropertySources().subscribe(received => (expectedResult = received));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(env);
+        expect(expectedResult).toEqual(propertySources);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d926e008ac467b02b5eeb9a639efb631ca68289
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts
@@ -0,0 +1,67 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { HttpErrorResponse } from '@angular/common/http';
+import { of, throwError } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { HealthComponent } from 'app/admin/health/health.component';
+import { HealthService, Health } from 'app/admin/health/health.service';
+
+describe('Component Tests', () => {
+  describe('HealthComponent', () => {
+    let comp: HealthComponent;
+    let fixture: ComponentFixture<HealthComponent>;
+    let service: HealthService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [HealthComponent]
+      })
+        .overrideTemplate(HealthComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(HealthComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(HealthService);
+    });
+
+    describe('getBadgeClass', () => {
+      it('should get badge class', () => {
+        const upBadgeClass = comp.getBadgeClass('UP');
+        const downBadgeClass = comp.getBadgeClass('DOWN');
+        expect(upBadgeClass).toEqual('badge-success');
+        expect(downBadgeClass).toEqual('badge-danger');
+      });
+    });
+
+    describe('refresh', () => {
+      it('should call refresh on init', () => {
+        // GIVEN
+        const health: Health = { status: 'UP', components: { mail: { status: 'UP', details: 'mailDetails' } } };
+        spyOn(service, 'checkHealth').and.returnValue(of(health));
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.checkHealth).toHaveBeenCalled();
+        expect(comp.health).toEqual(health);
+      });
+
+      it('should handle a 503 on refreshing health data', () => {
+        // GIVEN
+        const health: Health = { status: 'DOWN', components: { mail: { status: 'DOWN', details: 'mailDetails' } } };
+        spyOn(service, 'checkHealth').and.returnValue(throwError(new HttpErrorResponse({ status: 503, error: health })));
+
+        // WHEN
+        comp.refresh();
+
+        // THEN
+        expect(service.checkHealth).toHaveBeenCalled();
+        expect(comp.health).toEqual(health);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b5acfc16ae509851ecb541d9dcc783023fecc85c
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts
@@ -0,0 +1,85 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { LogsComponent } from 'app/admin/logs/logs.component';
+import { LogsService } from 'app/admin/logs/logs.service';
+import { Log } from 'app/admin/logs/log.model';
+
+describe('Component Tests', () => {
+  describe('LogsComponent', () => {
+    let comp: LogsComponent;
+    let fixture: ComponentFixture<LogsComponent>;
+    let service: LogsService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [LogsComponent],
+        providers: [LogsService]
+      })
+        .overrideTemplate(LogsComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(LogsComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(LogsService);
+    });
+
+    describe('OnInit', () => {
+      it('should set all default values correctly', () => {
+        expect(comp.filter).toBe('');
+        expect(comp.orderProp).toBe('name');
+        expect(comp.reverse).toBe(false);
+      });
+
+      it('Should call load all on init', () => {
+        // GIVEN
+        const log = new Log('main', 'WARN');
+        spyOn(service, 'findAll').and.returnValue(
+          of({
+            loggers: {
+              main: {
+                effectiveLevel: 'WARN'
+              }
+            }
+          })
+        );
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.findAll).toHaveBeenCalled();
+        expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log));
+      });
+    });
+
+    describe('change log level', () => {
+      it('should change log level correctly', () => {
+        // GIVEN
+        const log = new Log('main', 'ERROR');
+        spyOn(service, 'changeLevel').and.returnValue(of({}));
+        spyOn(service, 'findAll').and.returnValue(
+          of({
+            loggers: {
+              main: {
+                effectiveLevel: 'ERROR'
+              }
+            }
+          })
+        );
+
+        // WHEN
+        comp.changeLevel('main', 'ERROR');
+
+        // THEN
+        expect(service.changeLevel).toHaveBeenCalled();
+        expect(service.findAll).toHaveBeenCalled();
+        expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log));
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bccec0dbf465529d24e92f893681539bbf1d34c3
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts
@@ -0,0 +1,44 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+
+import { LogsService } from 'app/admin/logs/logs.service';
+import { SERVER_API_URL } from 'app/app.constants';
+
+describe('Service Tests', () => {
+  describe('Logs Service', () => {
+    let service: LogsService;
+    let httpMock: HttpTestingController;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule]
+      });
+
+      service = TestBed.get(LogsService);
+      httpMock = TestBed.get(HttpTestingController);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('Service methods', () => {
+      it('should call correct URL', () => {
+        service.findAll().subscribe();
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'management/loggers';
+        expect(req.request.url).toEqual(resourceUrl);
+      });
+
+      it('should change log level', () => {
+        service.changeLevel('main', 'ERROR').subscribe();
+
+        const req = httpMock.expectOne({ method: 'POST' });
+        const resourceUrl = SERVER_API_URL + 'management/loggers/main';
+        expect(req.request.url).toEqual(resourceUrl);
+        expect(req.request.body).toEqual({ configuredLevel: 'ERROR' });
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..98adcf5960feb3f01d6f216ffc7bd0f74064ae8f
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts
@@ -0,0 +1,54 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { MetricsComponent } from 'app/admin/metrics/metrics.component';
+import { MetricsService } from 'app/admin/metrics/metrics.service';
+
+describe('Component Tests', () => {
+  describe('MetricsComponent', () => {
+    let comp: MetricsComponent;
+    let fixture: ComponentFixture<MetricsComponent>;
+    let service: MetricsService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [MetricsComponent]
+      })
+        .overrideTemplate(MetricsComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(MetricsComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(MetricsService);
+    });
+
+    describe('refresh', () => {
+      it('should call refresh on init', () => {
+        // GIVEN
+        const response = {
+          timers: {
+            service: 'test',
+            unrelatedKey: 'test'
+          },
+          gauges: {
+            'jcache.statistics': {
+              value: 2
+            },
+            unrelatedKey: 'test'
+          }
+        };
+        spyOn(service, 'getMetrics').and.returnValue(of(response));
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(service.getMetrics).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c86b4af44add8b9e8f703f131243a1b2b25dc6dd
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts
@@ -0,0 +1,68 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+
+import { MetricsService, Metrics, ThreadDump } from 'app/admin/metrics/metrics.service';
+import { SERVER_API_URL } from 'app/app.constants';
+
+describe('Service Tests', () => {
+  describe('Logs Service', () => {
+    let service: MetricsService;
+    let httpMock: HttpTestingController;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule]
+      });
+      service = TestBed.get(MetricsService);
+      httpMock = TestBed.get(HttpTestingController);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('Service methods', () => {
+      it('should call correct URL', () => {
+        service.getMetrics().subscribe();
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'management/jhimetrics';
+        expect(req.request.url).toEqual(resourceUrl);
+      });
+
+      it('should return Metrics', () => {
+        let expectedResult: Metrics | null = null;
+        const metrics: Metrics = {
+          jvm: {},
+          'http.server.requests': {},
+          cache: {},
+          services: {},
+          databases: {},
+          garbageCollector: {},
+          processMetrics: {}
+        };
+
+        service.getMetrics().subscribe(received => {
+          expectedResult = received;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(metrics);
+        expect(expectedResult).toEqual(metrics);
+      });
+
+      it('should return Thread Dump', () => {
+        let expectedResult: ThreadDump | null = null;
+        const dump: ThreadDump = { threads: [{ name: 'test1', threadState: 'RUNNABLE' }] };
+
+        service.threadDump().subscribe(received => {
+          expectedResult = received;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(dump);
+        expect(expectedResult).toEqual(dump);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bf01424c06375300f0070e0e2d6d4081723241d5
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts
@@ -0,0 +1,56 @@
+import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { of } from 'rxjs';
+import { JhiEventManager } from 'ng-jhipster';
+
+import { BorestopTestModule } from '../../../test.module';
+import { MockEventManager } from '../../../helpers/mock-event-manager.service';
+import { MockActiveModal } from '../../../helpers/mock-active-modal.service';
+import { UserManagementDeleteDialogComponent } from 'app/admin/user-management/user-management-delete-dialog.component';
+import { UserService } from 'app/core/user/user.service';
+
+describe('Component Tests', () => {
+  describe('User Management Delete Component', () => {
+    let comp: UserManagementDeleteDialogComponent;
+    let fixture: ComponentFixture<UserManagementDeleteDialogComponent>;
+    let service: UserService;
+    let mockEventManager: MockEventManager;
+    let mockActiveModal: MockActiveModal;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [UserManagementDeleteDialogComponent]
+      })
+        .overrideTemplate(UserManagementDeleteDialogComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(UserManagementDeleteDialogComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(UserService);
+      mockEventManager = TestBed.get(JhiEventManager);
+      mockActiveModal = TestBed.get(NgbActiveModal);
+    });
+
+    describe('confirmDelete', () => {
+      it('Should call delete service on confirmDelete', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          spyOn(service, 'delete').and.returnValue(of({}));
+
+          // WHEN
+          comp.confirmDelete('user');
+          tick();
+
+          // THEN
+          expect(service.delete).toHaveBeenCalledWith('user');
+          expect(mockActiveModal.closeSpy).toHaveBeenCalled();
+          expect(mockEventManager.broadcastSpy).toHaveBeenCalled();
+        })
+      ));
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d2ab2b9a09978b3bf0ab379cc4dbf6fbe726090e
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts
@@ -0,0 +1,62 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+
+import { Authority } from 'app/shared/constants/authority.constants';
+import { BorestopTestModule } from '../../../test.module';
+import { UserManagementDetailComponent } from 'app/admin/user-management/user-management-detail.component';
+import { User } from 'app/core/user/user.model';
+
+describe('Component Tests', () => {
+  describe('User Management Detail Component', () => {
+    let comp: UserManagementDetailComponent;
+    let fixture: ComponentFixture<UserManagementDetailComponent>;
+    const route: ActivatedRoute = ({
+      data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') })
+    } as any) as ActivatedRoute;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [UserManagementDetailComponent],
+        providers: [
+          {
+            provide: ActivatedRoute,
+            useValue: route
+          }
+        ]
+      })
+        .overrideTemplate(UserManagementDetailComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(UserManagementDetailComponent);
+      comp = fixture.componentInstance;
+    });
+
+    describe('OnInit', () => {
+      it('Should call load all on init', () => {
+        // GIVEN
+
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(comp.user).toEqual(
+          jasmine.objectContaining({
+            id: 1,
+            login: 'user',
+            firstName: 'first',
+            lastName: 'last',
+            email: 'first@last.com',
+            activated: true,
+            langKey: 'en',
+            authorities: [Authority.USER],
+            createdBy: 'admin'
+          })
+        );
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..66910b8b96efdbb7767560742ecdfb61a7aa69a8
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts
@@ -0,0 +1,104 @@
+import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { FormBuilder } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+
+import { Authority } from 'app/shared/constants/authority.constants';
+import { BorestopTestModule } from '../../../test.module';
+import { UserManagementUpdateComponent } from 'app/admin/user-management/user-management-update.component';
+import { UserService } from 'app/core/user/user.service';
+import { User } from 'app/core/user/user.model';
+
+describe('Component Tests', () => {
+  describe('User Management Update Component', () => {
+    let comp: UserManagementUpdateComponent;
+    let fixture: ComponentFixture<UserManagementUpdateComponent>;
+    let service: UserService;
+    const route: ActivatedRoute = ({
+      data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') })
+    } as any) as ActivatedRoute;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [UserManagementUpdateComponent],
+        providers: [
+          FormBuilder,
+          {
+            provide: ActivatedRoute,
+            useValue: route
+          }
+        ]
+      })
+        .overrideTemplate(UserManagementUpdateComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(UserManagementUpdateComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(UserService);
+    });
+
+    describe('OnInit', () => {
+      it('Should load authorities and language on init', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          spyOn(service, 'authorities').and.returnValue(of(['USER']));
+
+          // WHEN
+          comp.ngOnInit();
+
+          // THEN
+          expect(service.authorities).toHaveBeenCalled();
+          expect(comp.authorities).toEqual(['USER']);
+        })
+      ));
+    });
+
+    describe('save', () => {
+      it('Should call update service on save for existing user', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          const entity = new User(123);
+          spyOn(service, 'update').and.returnValue(
+            of(
+              new HttpResponse({
+                body: entity
+              })
+            )
+          );
+          comp.user = entity;
+          comp.editForm.patchValue({ id: entity.id });
+          // WHEN
+          comp.save();
+          tick(); // simulate async
+
+          // THEN
+          expect(service.update).toHaveBeenCalledWith(entity);
+          expect(comp.isSaving).toEqual(false);
+        })
+      ));
+
+      it('Should call create service on save for new user', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          const entity = new User();
+          spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity })));
+          comp.user = entity;
+          // WHEN
+          comp.save();
+          tick(); // simulate async
+
+          // THEN
+          expect(service.create).toHaveBeenCalledWith(entity);
+          expect(comp.isSaving).toEqual(false);
+        })
+      ));
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..97d0c1081dbd328fab9a7a8fad80af711cf116ab
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts
@@ -0,0 +1,86 @@
+import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { UserManagementComponent } from 'app/admin/user-management/user-management.component';
+import { UserService } from 'app/core/user/user.service';
+import { User } from 'app/core/user/user.model';
+
+describe('Component Tests', () => {
+  describe('User Management Component', () => {
+    let comp: UserManagementComponent;
+    let fixture: ComponentFixture<UserManagementComponent>;
+    let service: UserService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [UserManagementComponent]
+      })
+        .overrideTemplate(UserManagementComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(UserManagementComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(UserService);
+    });
+
+    describe('OnInit', () => {
+      it('Should call load all on init', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          const headers = new HttpHeaders().append('link', 'link;link');
+          spyOn(service, 'query').and.returnValue(
+            of(
+              new HttpResponse({
+                body: [new User(123)],
+                headers
+              })
+            )
+          );
+
+          // WHEN
+          comp.ngOnInit();
+          tick(); // simulate async
+
+          // THEN
+          expect(service.query).toHaveBeenCalled();
+          expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+        })
+      ));
+    });
+
+    describe('setActive', () => {
+      it('Should update user and call load all', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          const headers = new HttpHeaders().append('link', 'link;link');
+          const user = new User(123);
+          spyOn(service, 'query').and.returnValue(
+            of(
+              new HttpResponse({
+                body: [user],
+                headers
+              })
+            )
+          );
+          spyOn(service, 'update').and.returnValue(of(new HttpResponse({ status: 200 })));
+
+          // WHEN
+          comp.setActive(user, true);
+          tick(); // simulate async
+
+          // THEN
+          expect(service.update).toHaveBeenCalledWith({ ...user, activated: true });
+          expect(service.query).toHaveBeenCalled();
+          expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+        })
+      ));
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d0d386ad37f7258bae5d79158c01252b947d78b9
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts
@@ -0,0 +1,48 @@
+import { TestBed } from '@angular/core/testing';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { LoginModalService } from 'app/core/login/login-modal.service';
+
+// Mock class for NgbModalRef
+export class MockNgbModalRef {
+  result: Promise<any> = new Promise(resolve => resolve('x'));
+}
+
+describe('Service Tests', () => {
+  describe('Login Modal Service', () => {
+    let service: LoginModalService;
+    let modalService: NgbModal;
+
+    beforeEach(() => {
+      service = TestBed.get(LoginModalService);
+      modalService = TestBed.get(NgbModal);
+    });
+
+    describe('Service methods', () => {
+      it('Should call open method for NgbModal when open method is called', () => {
+        // GIVEN
+        const mockModalRef: MockNgbModalRef = new MockNgbModalRef();
+        spyOn(modalService, 'open').and.returnValue(mockModalRef);
+
+        // WHEN
+        service.open();
+
+        // THEN
+        expect(modalService.open).toHaveBeenCalled();
+      });
+
+      it('Should call open method for NgbModal one time when open method is called twice', () => {
+        // GIVEN
+        const mockModalRef: MockNgbModalRef = new MockNgbModalRef();
+        spyOn(modalService, 'open').and.returnValue(mockModalRef);
+
+        // WHEN
+        service.open();
+        service.open();
+
+        // THEN
+        expect(modalService.open).toHaveBeenCalledTimes(1);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f5e11671a21430df1af2900f1f6fc0c2fabff728
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts
@@ -0,0 +1,214 @@
+import { Router } from '@angular/router';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { TestBed } from '@angular/core/testing';
+import { JhiDateUtils, JhiLanguageService } from 'ng-jhipster';
+import { NgxWebstorageModule } from 'ngx-webstorage';
+
+import { SERVER_API_URL } from 'app/app.constants';
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+import { Authority } from 'app/shared/constants/authority.constants';
+import { StateStorageService } from 'app/core/auth/state-storage.service';
+import { MockLanguageService } from '../../../helpers/mock-language.service';
+import { MockRouter } from '../../../helpers/mock-route.service';
+import { MockStateStorageService } from '../../../helpers/mock-state-storage.service';
+
+function accountWithAuthorities(authorities: string[]): Account {
+  return {
+    activated: true,
+    authorities,
+    email: '',
+    firstName: '',
+    langKey: '',
+    lastName: '',
+    login: '',
+    imageUrl: ''
+  };
+}
+
+describe('Service Tests', () => {
+  describe('Account Service', () => {
+    let service: AccountService;
+    let httpMock: HttpTestingController;
+    let storageService: MockStateStorageService;
+    let router: MockRouter;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()],
+        providers: [
+          JhiDateUtils,
+          {
+            provide: JhiLanguageService,
+            useClass: MockLanguageService
+          },
+          {
+            provide: StateStorageService,
+            useClass: MockStateStorageService
+          },
+          {
+            provide: Router,
+            useClass: MockRouter
+          }
+        ]
+      });
+
+      service = TestBed.get(AccountService);
+      httpMock = TestBed.get(HttpTestingController);
+      storageService = TestBed.get(StateStorageService);
+      router = TestBed.get(Router);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('authenticate', () => {
+      it('authenticationState should emit null if input is null', () => {
+        // GIVEN
+        let userIdentity: Account | null = accountWithAuthorities([]);
+        service.getAuthenticationState().subscribe(account => (userIdentity = account));
+
+        // WHEN
+        service.authenticate(null);
+
+        // THEN
+        expect(userIdentity).toBeNull();
+        expect(service.isAuthenticated()).toBe(false);
+      });
+
+      it('authenticationState should emit the same account as was in input parameter', () => {
+        // GIVEN
+        const expectedResult = accountWithAuthorities([]);
+        let userIdentity: Account | null = null;
+        service.getAuthenticationState().subscribe(account => (userIdentity = account));
+
+        // WHEN
+        service.authenticate(expectedResult);
+
+        // THEN
+        expect(userIdentity).toEqual(expectedResult);
+        expect(service.isAuthenticated()).toBe(true);
+      });
+    });
+
+    describe('identity', () => {
+      it('should call /account if user is undefined', () => {
+        service.identity().subscribe();
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'api/account';
+
+        expect(req.request.url).toEqual(`${resourceUrl}`);
+      });
+
+      it('should call /account only once if not logged out after first authentication and should call /account again if user has logged out', () => {
+        // Given the user is authenticated
+        service.identity().subscribe();
+        httpMock.expectOne({ method: 'GET' }).flush({});
+
+        // When I call
+        service.identity().subscribe();
+
+        // Then there is no second request
+        httpMock.expectNone({ method: 'GET' });
+
+        // When I log out
+        service.authenticate(null);
+        // and then call
+        service.identity().subscribe();
+
+        // Then there is a new request
+        httpMock.expectOne({ method: 'GET' });
+      });
+
+      describe('navigateToStoredUrl', () => {
+        it('should navigate to the previous stored url post successful authentication', () => {
+          // GIVEN
+          storageService.setResponse('admin/users?page=0');
+
+          // WHEN
+          service.identity().subscribe();
+          httpMock.expectOne({ method: 'GET' }).flush({});
+
+          // THEN
+          expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1);
+          expect(storageService.clearUrlSpy).toHaveBeenCalledTimes(1);
+          expect(router.navigateByUrlSpy).toHaveBeenCalledWith('admin/users?page=0');
+        });
+
+        it('should not navigate to the previous stored url when authentication fails', () => {
+          // WHEN
+          service.identity().subscribe();
+          httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent(''));
+
+          // THEN
+          expect(storageService.getUrlSpy).not.toHaveBeenCalled();
+          expect(storageService.clearUrlSpy).not.toHaveBeenCalled();
+          expect(router.navigateByUrlSpy).not.toHaveBeenCalled();
+        });
+
+        it('should not navigate to the previous stored url when no such url exists post successful authentication', () => {
+          // GIVEN
+          storageService.setResponse(null);
+
+          // WHEN
+          service.identity().subscribe();
+          httpMock.expectOne({ method: 'GET' }).flush({});
+
+          // THEN
+          expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1);
+          expect(storageService.clearUrlSpy).not.toHaveBeenCalled();
+          expect(router.navigateByUrlSpy).not.toHaveBeenCalled();
+        });
+      });
+    });
+
+    describe('hasAnyAuthority', () => {
+      describe('hasAnyAuthority string parameter', () => {
+        it('should return false if user is not logged', () => {
+          const hasAuthority = service.hasAnyAuthority(Authority.USER);
+          expect(hasAuthority).toBe(false);
+        });
+
+        it('should return false if user is logged and has not authority', () => {
+          service.authenticate(accountWithAuthorities([Authority.USER]));
+
+          const hasAuthority = service.hasAnyAuthority(Authority.ADMIN);
+
+          expect(hasAuthority).toBe(false);
+        });
+
+        it('should return true if user is logged and has authority', () => {
+          service.authenticate(accountWithAuthorities([Authority.USER]));
+
+          const hasAuthority = service.hasAnyAuthority(Authority.USER);
+
+          expect(hasAuthority).toBe(true);
+        });
+      });
+
+      describe('hasAnyAuthority array parameter', () => {
+        it('should return false if user is not logged', () => {
+          const hasAuthority = service.hasAnyAuthority([Authority.USER]);
+          expect(hasAuthority).toBeFalsy();
+        });
+
+        it('should return false if user is logged and has not authority', () => {
+          service.authenticate(accountWithAuthorities([Authority.USER]));
+
+          const hasAuthority = service.hasAnyAuthority([Authority.ADMIN]);
+
+          expect(hasAuthority).toBe(false);
+        });
+
+        it('should return true if user is logged and has authority', () => {
+          service.authenticate(accountWithAuthorities([Authority.USER]));
+
+          const hasAuthority = service.hasAnyAuthority([Authority.USER, Authority.ADMIN]);
+
+          expect(hasAuthority).toBe(true);
+        });
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2811acbf1196e94fae15edce338c4169930e1302
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts
@@ -0,0 +1,79 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpErrorResponse } from '@angular/common/http';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { JhiDateUtils } from 'ng-jhipster';
+
+import { Authority } from 'app/shared/constants/authority.constants';
+import { UserService } from 'app/core/user/user.service';
+import { User } from 'app/core/user/user.model';
+import { SERVER_API_URL } from 'app/app.constants';
+
+describe('Service Tests', () => {
+  describe('User Service', () => {
+    let service: UserService;
+    let httpMock: HttpTestingController;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        providers: [JhiDateUtils]
+      });
+
+      service = TestBed.get(UserService);
+      httpMock = TestBed.get(HttpTestingController);
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+
+    describe('Service methods', () => {
+      it('should call correct URL', () => {
+        service.find('user').subscribe();
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        const resourceUrl = SERVER_API_URL + 'api/users';
+        expect(req.request.url).toEqual(`${resourceUrl}/user`);
+      });
+
+      it('should return User', () => {
+        let expectedResult: string | undefined;
+
+        service.find('user').subscribe(received => {
+          expectedResult = received.login;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(new User(1, 'user'));
+        expect(expectedResult).toEqual('user');
+      });
+
+      it('should return Authorities', () => {
+        let expectedResult: string[] = [];
+
+        service.authorities().subscribe(authorities => {
+          expectedResult = authorities;
+        });
+        const req = httpMock.expectOne({ method: 'GET' });
+
+        req.flush([Authority.USER, Authority.ADMIN]);
+        expect(expectedResult).toEqual([Authority.USER, Authority.ADMIN]);
+      });
+
+      it('should propagate not found response', () => {
+        let expectedResult = 0;
+
+        service.find('user').subscribe(null, (error: HttpErrorResponse) => {
+          expectedResult = error.status;
+        });
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush('Invalid request parameters', {
+          status: 404,
+          statusText: 'Bad Request'
+        });
+        expect(expectedResult).toEqual(404);
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/home/home.component.spec.ts b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e1a99ac85d9e43b91dec580895382002d2e0e1e5
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts
@@ -0,0 +1,55 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+
+import { BorestopTestModule } from '../../test.module';
+import { HomeComponent } from 'app/home/home.component';
+import { AccountService } from 'app/core/auth/account.service';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+
+describe('Component Tests', () => {
+  describe('Home Component', () => {
+    let comp: HomeComponent;
+    let fixture: ComponentFixture<HomeComponent>;
+    let accountService: AccountService;
+    let loginModalService: LoginModalService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [HomeComponent]
+      })
+        .overrideTemplate(HomeComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(HomeComponent);
+      comp = fixture.componentInstance;
+      accountService = TestBed.get(AccountService);
+      loginModalService = TestBed.get(LoginModalService);
+    });
+
+    it('Should call accountService.getAuthenticationState on init', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(accountService.getAuthenticationState).toHaveBeenCalled();
+    });
+
+    it('Should call accountService.isAuthenticated when it checks authentication', () => {
+      // WHEN
+      comp.isAuthenticated();
+
+      // THEN
+      expect(accountService.isAuthenticated).toHaveBeenCalled();
+    });
+
+    it('Should call loginModalService.open on login', () => {
+      // WHEN
+      comp.login();
+
+      // THEN
+      expect(loginModalService.open).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0d68e74b4c2e72bd2cb9144151460c6827665c81
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts
@@ -0,0 +1,183 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { Router, RouterEvent, NavigationEnd } from '@angular/router';
+import { Title } from '@angular/platform-browser';
+import { Subject, of } from 'rxjs';
+import { TranslateModule, TranslateService, LangChangeEvent } from '@ngx-translate/core';
+
+import { MainComponent } from 'app/layouts/main/main.component';
+import { BorestopTestModule } from '../../../test.module';
+import { MockRouter } from '../../../helpers/mock-route.service';
+
+describe('Component Tests', () => {
+  describe('MainComponent', () => {
+    let comp: MainComponent;
+    let fixture: ComponentFixture<MainComponent>;
+    let router: MockRouter;
+    const routerEventsSubject = new Subject<RouterEvent>();
+    let titleService: Title;
+    let translateService: TranslateService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule, TranslateModule.forRoot()],
+        declarations: [MainComponent],
+        providers: [Title]
+      })
+        .overrideTemplate(MainComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(MainComponent);
+      comp = fixture.componentInstance;
+      router = TestBed.get(Router);
+      router.setEvents(routerEventsSubject.asObservable());
+      titleService = TestBed.get(Title);
+      translateService = TestBed.get(TranslateService);
+    });
+
+    describe('page title', () => {
+      let routerState: any;
+      const defaultPageTitle = 'global.title';
+      const parentRoutePageTitle = 'parentTitle';
+      const childRoutePageTitle = 'childTitle';
+      const navigationEnd = new NavigationEnd(1, '', '');
+      const langChangeEvent: LangChangeEvent = { lang: 'en', translations: null };
+
+      beforeEach(() => {
+        routerState = { snapshot: { root: {} } };
+        router.setRouterState(routerState);
+        spyOn(translateService, 'get').and.callFake((key: string) => {
+          return of(key + ' translated');
+        });
+        translateService.currentLang = 'en';
+        spyOn(titleService, 'setTitle');
+        comp.ngOnInit();
+      });
+
+      describe('navigation end', () => {
+        it('should set page title to default title if pageTitle is missing on routes', () => {
+          // WHEN
+          routerEventsSubject.next(navigationEnd);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated');
+        });
+
+        it('should set page title to root route pageTitle if there is no child routes', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+
+          // WHEN
+          routerEventsSubject.next(navigationEnd);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } };
+
+          // WHEN
+          routerEventsSubject.next(navigationEnd);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = { data: {} };
+
+          // WHEN
+          routerEventsSubject.next(navigationEnd);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = {};
+
+          // WHEN
+          routerEventsSubject.next(navigationEnd);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+      });
+
+      describe('language change', () => {
+        it('should set page title to default title if pageTitle is missing on routes', () => {
+          // WHEN
+          translateService.onLangChange.emit(langChangeEvent);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated');
+        });
+
+        it('should set page title to root route pageTitle if there is no child routes', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+
+          // WHEN
+          translateService.onLangChange.emit(langChangeEvent);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } };
+
+          // WHEN
+          translateService.onLangChange.emit(langChangeEvent);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = { data: {} };
+
+          // WHEN
+          translateService.onLangChange.emit(langChangeEvent);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+
+        it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => {
+          // GIVEN
+          routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle };
+          routerState.snapshot.root.firstChild = {};
+
+          // WHEN
+          translateService.onLangChange.emit(langChangeEvent);
+
+          // THEN
+          expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle);
+          expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated');
+        });
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab8fc448078a91616cad02f94bce67ae50e14284
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts
@@ -0,0 +1,52 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { of } from 'rxjs';
+
+import { BorestopTestModule } from '../../../test.module';
+import { ProfileInfo } from 'app/layouts/profiles/profile-info.model';
+import { NavbarComponent } from 'app/layouts/navbar/navbar.component';
+import { AccountService } from 'app/core/auth/account.service';
+import { ProfileService } from 'app/layouts/profiles/profile.service';
+
+describe('Component Tests', () => {
+  describe('Navbar Component', () => {
+    let comp: NavbarComponent;
+    let fixture: ComponentFixture<NavbarComponent>;
+    let accountService: AccountService;
+    let profileService: ProfileService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [NavbarComponent]
+      })
+        .overrideTemplate(NavbarComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(NavbarComponent);
+      comp = fixture.componentInstance;
+      accountService = TestBed.get(AccountService);
+      profileService = TestBed.get(ProfileService);
+    });
+
+    it('Should call profileService.getProfileInfo on init', () => {
+      // GIVEN
+      spyOn(profileService, 'getProfileInfo').and.returnValue(of(new ProfileInfo()));
+
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(profileService.getProfileInfo).toHaveBeenCalled();
+    });
+
+    it('Should call accountService.isAuthenticated on authentication', () => {
+      // WHEN
+      comp.isAuthenticated();
+
+      // THEN
+      expect(accountService.isAuthenticated).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..73e58918eb5833930c616fad758f38f1d9283afd
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts
@@ -0,0 +1,141 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
+import { JhiAlertService, JhiEventManager } from 'ng-jhipster';
+import { TranslateModule } from '@ngx-translate/core';
+
+import { BorestopTestModule } from '../../../test.module';
+import { AlertErrorComponent } from 'app/shared/alert/alert-error.component';
+import { MockAlertService } from '../../../helpers/mock-alert.service';
+
+describe('Component Tests', () => {
+  describe('Alert Error Component', () => {
+    let comp: AlertErrorComponent;
+    let fixture: ComponentFixture<AlertErrorComponent>;
+    let eventManager: JhiEventManager;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule, TranslateModule.forRoot()],
+        declarations: [AlertErrorComponent],
+        providers: [
+          JhiEventManager,
+          {
+            provide: JhiAlertService,
+            useClass: MockAlertService
+          }
+        ]
+      })
+        .overrideTemplate(AlertErrorComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(AlertErrorComponent);
+      comp = fixture.componentInstance;
+      eventManager = fixture.debugElement.injector.get(JhiEventManager);
+    });
+
+    describe('Error Handling', () => {
+      it('Should display an alert on status 0', () => {
+        // GIVEN
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 0 } });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('error.server.not.reachable');
+      });
+
+      it('Should display an alert on status 404', () => {
+        // GIVEN
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 404 } });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('error.url.not.found');
+      });
+
+      it('Should display an alert on generic error', () => {
+        // GIVEN
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: { message: 'Error Message' } } });
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: 'Second Error Message' } });
+        // THEN
+        expect(comp.alerts.length).toBe(2);
+        expect(comp.alerts[0].msg).toBe('Error Message');
+        expect(comp.alerts[1].msg).toBe('Second Error Message');
+      });
+
+      it('Should display an alert on status 400 for generic error', () => {
+        // GIVEN
+        const response = new HttpErrorResponse({
+          url: 'http://localhost:8080/api/foos',
+          headers: new HttpHeaders(),
+          status: 400,
+          statusText: 'Bad Request',
+          error: {
+            type: 'https://www.jhipster.tech/problem/constraint-violation',
+            title: 'Bad Request',
+            status: 400,
+            path: '/api/foos',
+            message: 'error.validation'
+          }
+        });
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: response });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('error.validation');
+      });
+
+      it('Should display an alert on status 400 for generic error without message', () => {
+        // GIVEN
+        const response = new HttpErrorResponse({
+          url: 'http://localhost:8080/api/foos',
+          headers: new HttpHeaders(),
+          status: 400,
+          error: 'Bad Request'
+        });
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: response });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('Bad Request');
+      });
+
+      it('Should display an alert on status 400 for invalid parameters', () => {
+        // GIVEN
+        const response = new HttpErrorResponse({
+          url: 'http://localhost:8080/api/foos',
+          headers: new HttpHeaders(),
+          status: 400,
+          statusText: 'Bad Request',
+          error: {
+            type: 'https://www.jhipster.tech/problem/constraint-violation',
+            title: 'Method argument not valid',
+            status: 400,
+            path: '/api/foos',
+            message: 'error.validation',
+            fieldErrors: [{ objectName: 'foo', field: 'minField', message: 'Min' }]
+          }
+        });
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: response });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('error.Size');
+      });
+
+      it('Should display an alert on status 400 for error headers', () => {
+        // GIVEN
+        const response = new HttpErrorResponse({
+          url: 'http://localhost:8080/api/foos',
+          headers: new HttpHeaders().append('app-error', 'Error Message').append('app-params', 'foo'),
+          status: 400,
+          statusText: 'Bad Request',
+          error: {
+            status: 400,
+            message: 'error.validation'
+          }
+        });
+        eventManager.broadcast({ name: 'borestopApp.httpError', content: response });
+        // THEN
+        expect(comp.alerts.length).toBe(1);
+        expect(comp.alerts[0].msg).toBe('Error Message');
+      });
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..36cdb5f21865d606c178d0c895b8d51c48fb9235
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts
@@ -0,0 +1,44 @@
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { JhiAlertService } from 'ng-jhipster';
+
+import { BorestopTestModule } from '../../../test.module';
+import { AlertComponent } from 'app/shared/alert/alert.component';
+
+describe('Component Tests', () => {
+  describe('Alert Component', () => {
+    let comp: AlertComponent;
+    let fixture: ComponentFixture<AlertComponent>;
+    let alertService: JhiAlertService;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [AlertComponent]
+      })
+        .overrideTemplate(AlertComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(AlertComponent);
+      comp = fixture.componentInstance;
+      alertService = TestBed.get(JhiAlertService);
+    });
+
+    it('Should call alertService.get on init', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(alertService.get).toHaveBeenCalled();
+    });
+
+    it('Should call alertService.clear on destroy', () => {
+      // WHEN
+      comp.ngOnDestroy();
+
+      // THEN
+      expect(alertService.clear).toHaveBeenCalled();
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..96fd89e1f2a57d4cd20c8b907c7cc0898f94aad9
--- /dev/null
+++ b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts
@@ -0,0 +1,116 @@
+import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing';
+import { FormBuilder } from '@angular/forms';
+import { Router } from '@angular/router';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { LoginService } from 'app/core/login/login.service';
+import { LoginModalComponent } from 'app/shared/login/login.component';
+import { BorestopTestModule } from '../../../test.module';
+import { MockLoginService } from '../../../helpers/mock-login.service';
+import { MockRouter } from '../../../helpers/mock-route.service';
+import { MockActiveModal } from '../../../helpers/mock-active-modal.service';
+
+describe('Component Tests', () => {
+  describe('LoginComponent', () => {
+    let comp: LoginModalComponent;
+    let fixture: ComponentFixture<LoginModalComponent>;
+    let mockLoginService: MockLoginService;
+    let mockRouter: MockRouter;
+    let mockActiveModal: MockActiveModal;
+
+    beforeEach(async(() => {
+      TestBed.configureTestingModule({
+        imports: [BorestopTestModule],
+        declarations: [LoginModalComponent],
+        providers: [
+          FormBuilder,
+          {
+            provide: LoginService,
+            useClass: MockLoginService
+          }
+        ]
+      })
+        .overrideTemplate(LoginModalComponent, '')
+        .compileComponents();
+    }));
+
+    beforeEach(() => {
+      fixture = TestBed.createComponent(LoginModalComponent);
+      comp = fixture.componentInstance;
+      mockLoginService = TestBed.get(LoginService);
+      mockRouter = TestBed.get(Router);
+      mockActiveModal = TestBed.get(NgbActiveModal);
+    });
+
+    it('should authenticate the user', inject(
+      [],
+      fakeAsync(() => {
+        // GIVEN
+        const credentials = {
+          username: 'admin',
+          password: 'admin',
+          rememberMe: true
+        };
+
+        comp.loginForm.patchValue({
+          username: 'admin',
+          password: 'admin',
+          rememberMe: true
+        });
+        mockLoginService.setResponse({});
+        mockRouter.url = '/admin/metrics';
+
+        // WHEN/
+        comp.login();
+        tick(); // simulate async
+
+        // THEN
+        expect(comp.authenticationError).toEqual(false);
+        expect(mockActiveModal.closeSpy).toHaveBeenCalled();
+        expect(mockLoginService.loginSpy).toHaveBeenCalledWith(credentials);
+      })
+    ));
+
+    it('should empty the credentials upon cancel', () => {
+      // GIVEN
+      comp.loginForm.patchValue({
+        username: 'admin',
+        password: 'admin'
+      });
+
+      const expected = {
+        username: '',
+        password: '',
+        rememberMe: false
+      };
+
+      // WHEN
+      comp.cancel();
+
+      // THEN
+      expect(comp.authenticationError).toEqual(false);
+      expect(comp.loginForm.get('username')!.value).toEqual(expected.username);
+      expect(comp.loginForm.get('password')!.value).toEqual(expected.password);
+      expect(comp.loginForm.get('rememberMe')!.value).toEqual(expected.rememberMe);
+      expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('cancel');
+    });
+
+    it('should redirect user when register', () => {
+      // WHEN
+      comp.register();
+
+      // THEN
+      expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state register');
+      expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/register']);
+    });
+
+    it('should redirect user when request password', () => {
+      // WHEN
+      comp.requestResetPassword();
+
+      // THEN
+      expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state requestReset');
+      expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/reset', 'request']);
+    });
+  });
+});
diff --git a/borestop/src/test/javascript/spec/helpers/mock-account.service.ts b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b75655c50f6ba5f2baa1b11c196cbfe9cce979b6
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts
@@ -0,0 +1,31 @@
+import Spy = jasmine.Spy;
+import { of } from 'rxjs';
+
+import { SpyObject } from './spyobject';
+import { AccountService } from 'app/core/auth/account.service';
+import { Account } from 'app/core/user/account.model';
+
+export class MockAccountService extends SpyObject {
+  getSpy: Spy;
+  saveSpy: Spy;
+  authenticateSpy: Spy;
+  identitySpy: Spy;
+  getAuthenticationStateSpy: Spy;
+  isAuthenticated: Spy;
+
+  constructor() {
+    super(AccountService);
+
+    this.getSpy = this.spy('get').andReturn(this);
+    this.saveSpy = this.spy('save').andReturn(this);
+    this.authenticateSpy = this.spy('authenticate').andReturn(this);
+    this.identitySpy = this.spy('identity').andReturn(of(null));
+    this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(null));
+    this.isAuthenticated = this.spy('isAuthenticated').andReturn(true);
+  }
+
+  setIdentityResponse(account: Account | null): void {
+    this.identitySpy = this.spy('identity').andReturn(of(account));
+    this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(account));
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bd32d740b7c6738335c81622396a8d591ae61f92
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts
@@ -0,0 +1,15 @@
+import Spy = jasmine.Spy;
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { SpyObject } from './spyobject';
+
+export class MockActiveModal extends SpyObject {
+  dismissSpy: Spy;
+  closeSpy: Spy;
+
+  constructor() {
+    super(NgbActiveModal);
+    this.dismissSpy = this.spy('dismiss').andReturn(this);
+    this.closeSpy = this.spy('close').andReturn(this);
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2bf772462621b7b3d793f09b3dc536fa2034946a
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts
@@ -0,0 +1,13 @@
+import { JhiAlertService, JhiAlert } from 'ng-jhipster';
+
+import { SpyObject } from './spyobject';
+
+export class MockAlertService extends SpyObject {
+  constructor() {
+    super(JhiAlertService);
+  }
+
+  addAlert(alertOptions: JhiAlert): JhiAlert {
+    return alertOptions;
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a8f56aeae8691b09dcf6a96ffe60e6e446f189d
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts
@@ -0,0 +1,13 @@
+import Spy = jasmine.Spy;
+import { JhiEventManager } from 'ng-jhipster';
+
+import { SpyObject } from './spyobject';
+
+export class MockEventManager extends SpyObject {
+  broadcastSpy: Spy;
+
+  constructor() {
+    super(JhiEventManager);
+    this.broadcastSpy = this.spy('broadcast').andReturn(this);
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-language.service.ts b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2438a44fa23e8f49360cd860e06ae7d78297c3b6
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts
@@ -0,0 +1,14 @@
+import Spy = jasmine.Spy;
+import { JhiLanguageService } from 'ng-jhipster';
+
+import { SpyObject } from './spyobject';
+
+export class MockLanguageService extends SpyObject {
+  getCurrentLanguageSpy: Spy;
+
+  constructor() {
+    super(JhiLanguageService);
+
+    this.getCurrentLanguageSpy = this.spy('getCurrentLanguage').andReturn('en');
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1c0f7c35af618af4f5a89b3a0a687065960998a4
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts
@@ -0,0 +1,14 @@
+import Spy = jasmine.Spy;
+
+import { SpyObject } from './spyobject';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+
+export class MockLoginModalService extends SpyObject {
+  open: Spy;
+
+  constructor() {
+    super(LoginModalService);
+
+    this.open = this.spy('open');
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-login.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a75a8004565ea9d7a5de7a6d8500318b416c8110
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts
@@ -0,0 +1,27 @@
+import Spy = jasmine.Spy;
+import { of } from 'rxjs';
+
+import { SpyObject } from './spyobject';
+import { LoginService } from 'app/core/login/login.service';
+
+export class MockLoginService extends SpyObject {
+  loginSpy: Spy;
+  logoutSpy: Spy;
+  registerSpy: Spy;
+  requestResetPasswordSpy: Spy;
+  cancelSpy: Spy;
+
+  constructor() {
+    super(LoginService);
+
+    this.loginSpy = this.spy('login').andReturn(of({}));
+    this.logoutSpy = this.spy('logout').andReturn(this);
+    this.registerSpy = this.spy('register').andReturn(this);
+    this.requestResetPasswordSpy = this.spy('requestResetPassword').andReturn(this);
+    this.cancelSpy = this.spy('cancel').andReturn(this);
+  }
+
+  setResponse(json: any): void {
+    this.loginSpy = this.spy('login').andReturn(of(json));
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-route.service.ts b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e0458630eb45812f7490fe51ff47a2c33a1f3910
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts
@@ -0,0 +1,50 @@
+import Spy = jasmine.Spy;
+import { ActivatedRoute, Router, RouterEvent, Data, Params } from '@angular/router';
+import { Observable, ReplaySubject } from 'rxjs';
+
+import { SpyObject } from './spyobject';
+
+export class MockActivatedRoute extends ActivatedRoute {
+  private queryParamsSubject = new ReplaySubject<Params>();
+  private paramSubject = new ReplaySubject<Params>();
+  private dataSubject = new ReplaySubject<Data>();
+
+  constructor(parameters: Params) {
+    super();
+    this.queryParams = this.queryParamsSubject.asObservable();
+    this.params = this.paramSubject.asObservable();
+    this.data = this.dataSubject.asObservable();
+    this.setParameters(parameters);
+  }
+
+  setParameters(parameters: Params): void {
+    this.queryParamsSubject.next(parameters);
+    this.paramSubject.next(parameters);
+    this.dataSubject.next({
+      ...parameters,
+      defaultSort: 'id,desc'
+    });
+  }
+}
+
+export class MockRouter extends SpyObject {
+  navigateSpy: Spy;
+  navigateByUrlSpy: Spy;
+  events: Observable<RouterEvent> | null = null;
+  routerState: any;
+  url = '';
+
+  constructor() {
+    super(Router);
+    this.navigateSpy = this.spy('navigate');
+    this.navigateByUrlSpy = this.spy('navigateByUrl');
+  }
+
+  setEvents(events: Observable<RouterEvent>): void {
+    this.events = events;
+  }
+
+  setRouterState(routerState: any): void {
+    this.routerState = routerState;
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1a23343dcbea235665691e7c47c69153c9345594
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts
@@ -0,0 +1,21 @@
+import Spy = jasmine.Spy;
+
+import { SpyObject } from './spyobject';
+import { StateStorageService } from 'app/core/auth/state-storage.service';
+
+export class MockStateStorageService extends SpyObject {
+  getUrlSpy: Spy;
+  storeUrlSpy: Spy;
+  clearUrlSpy: Spy;
+
+  constructor() {
+    super(StateStorageService);
+    this.getUrlSpy = this.spy('getUrl').andReturn(null);
+    this.storeUrlSpy = this.spy('storeUrl').andReturn(this);
+    this.clearUrlSpy = this.spy('clearUrl').andReturn(this);
+  }
+
+  setResponse(previousUrl: string | null): void {
+    this.getUrlSpy = this.spy('getUrl').andReturn(previousUrl);
+  }
+}
diff --git a/borestop/src/test/javascript/spec/helpers/spyobject.ts b/borestop/src/test/javascript/spec/helpers/spyobject.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eeb221a9a45b563ea995ab74e60bfb2c309ab514
--- /dev/null
+++ b/borestop/src/test/javascript/spec/helpers/spyobject.ts
@@ -0,0 +1,48 @@
+export interface GuinessCompatibleSpy extends jasmine.Spy {
+  /** By chaining the spy with and.returnValue, all calls to the function will return a specific
+   * value. */
+  andReturn(val: any): GuinessCompatibleSpy;
+  /** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied
+   * function. */
+  andCallFake(fn: Function): GuinessCompatibleSpy;
+  /** removes all recorded calls */
+  reset(): void;
+}
+
+export class SpyObject {
+  constructor(type?: any) {
+    if (type) {
+      Object.keys(type.prototype).forEach(prop => {
+        let m = null;
+        try {
+          m = type.prototype[prop];
+        } catch (e) {
+          // As we are creating spys for abstract classes,
+          // these classes might have getters that throw when they are accessed.
+          // As we are only auto creating spys for methods, this
+          // should not matter.
+        }
+        if (typeof m === 'function') {
+          this.spy(prop);
+        }
+      });
+    }
+  }
+
+  spy(name: string): GuinessCompatibleSpy {
+    if (!this[name]) {
+      this[name] = this.createGuinnessCompatibleSpy(name);
+    }
+    return this[name];
+  }
+
+  private createGuinnessCompatibleSpy(name: string): GuinessCompatibleSpy {
+    const newSpy: GuinessCompatibleSpy = jasmine.createSpy(name) as any;
+    newSpy.andCallFake = newSpy.and.callFake as any;
+    newSpy.andReturn = newSpy.and.returnValue as any;
+    newSpy.reset = newSpy.calls.reset as any;
+    // revisit return null here (previously needed for rtts_assert).
+    newSpy.and.returnValue(null);
+    return newSpy;
+  }
+}
diff --git a/borestop/src/test/javascript/spec/test.module.ts b/borestop/src/test/javascript/spec/test.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0e044235852c120060c711c41e966991e21b2ada
--- /dev/null
+++ b/borestop/src/test/javascript/spec/test.module.ts
@@ -0,0 +1,72 @@
+import { DatePipe } from '@angular/common';
+import { ActivatedRoute, Router } from '@angular/router';
+import { NgModule } from '@angular/core';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { SessionStorageService, LocalStorageService } from 'ngx-webstorage';
+import { JhiLanguageService, JhiDataUtils, JhiDateUtils, JhiEventManager, JhiAlertService, JhiParseLinks } from 'ng-jhipster';
+
+import { MockLanguageService } from './helpers/mock-language.service';
+import { AccountService } from 'app/core/auth/account.service';
+import { LoginModalService } from 'app/core/login/login-modal.service';
+import { MockLoginModalService } from './helpers/mock-login-modal.service';
+import { MockAccountService } from './helpers/mock-account.service';
+import { MockActivatedRoute, MockRouter } from './helpers/mock-route.service';
+import { MockActiveModal } from './helpers/mock-active-modal.service';
+import { MockAlertService } from './helpers/mock-alert.service';
+import { MockEventManager } from './helpers/mock-event-manager.service';
+
+@NgModule({
+  providers: [
+    DatePipe,
+    JhiDataUtils,
+    JhiDateUtils,
+    JhiParseLinks,
+    {
+      provide: JhiLanguageService,
+      useClass: MockLanguageService
+    },
+    {
+      provide: JhiEventManager,
+      useClass: MockEventManager
+    },
+    {
+      provide: NgbActiveModal,
+      useClass: MockActiveModal
+    },
+    {
+      provide: ActivatedRoute,
+      useValue: new MockActivatedRoute({ id: 123 })
+    },
+    {
+      provide: Router,
+      useClass: MockRouter
+    },
+    {
+      provide: AccountService,
+      useClass: MockAccountService
+    },
+    {
+      provide: LoginModalService,
+      useClass: MockLoginModalService
+    },
+    {
+      provide: JhiAlertService,
+      useClass: MockAlertService
+    },
+    {
+      provide: NgbModal,
+      useValue: null
+    },
+    {
+      provide: SessionStorageService,
+      useValue: null
+    },
+    {
+      provide: LocalStorageService,
+      useValue: null
+    }
+  ],
+  imports: [HttpClientTestingModule]
+})
+export class BorestopTestModule {}
diff --git a/borestop/src/test/resources/config/application-testcontainers.yml b/borestop/src/test/resources/config/application-testcontainers.yml
new file mode 100644
index 0000000000000000000000000000000000000000..81aafc15a776169a486dff81f460beefb4e6aab5
--- /dev/null
+++ b/borestop/src/test/resources/config/application-testcontainers.yml
@@ -0,0 +1,22 @@
+# ===================================================================
+# Spring Boot configuration.
+#
+# This configuration is used for unit/integration tests with testcontainers database containers.
+#
+# To activate this configuration launch integration tests with the 'testcontainers' profile
+#
+# More information on database containers: https://www.testcontainers.org/modules/databases/
+# ===================================================================
+
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
+    url: jdbc:tc:postgresql:latest:///borestop?TC_TMPFS=/testtmpfs:rw
+    username: borestop
+    password:
+    hikari:
+      poolName: Hikari
+      auto-commit: false
+  jpa:
+    database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect
diff --git a/borestop/src/test/resources/config/application.yml b/borestop/src/test/resources/config/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5eb3945b2edf299e0e70cef33f924d4b2ce18a06
--- /dev/null
+++ b/borestop/src/test/resources/config/application.yml
@@ -0,0 +1,117 @@
+# ===================================================================
+# Spring Boot configuration.
+#
+# This configuration is used for unit/integration tests.
+#
+# More information on profiles: https://www.jhipster.tech/profiles/
+# More information on configuration properties: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# ===================================================================
+# Standard Spring Boot properties.
+# Full reference is available at:
+# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
+# ===================================================================
+
+spring:
+  profiles:
+  # Uncomment the following line to enable tests against production database type rather than H2, using Testcontainers
+  #active: testcontainers
+  application:
+    name: borestop
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    url: jdbc:h2:mem:borestop;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+    name:
+    username:
+    password:
+    hikari:
+      auto-commit: false
+  jackson:
+    serialization:
+      write-durations-as-timestamps: false
+  jpa:
+    database-platform: io.github.jhipster.domain.util.FixedH2Dialect
+    open-in-view: false
+    show-sql: false
+    hibernate:
+      ddl-auto: none
+      naming:
+        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
+        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
+    properties:
+      hibernate.id.new_generator_mappings: true
+      hibernate.connection.provider_disables_autocommit: true
+      hibernate.cache.use_second_level_cache: false
+      hibernate.cache.use_query_cache: false
+      hibernate.generate_statistics: false
+      hibernate.hbm2ddl.auto: validate
+      hibernate.jdbc.time_zone: UTC
+  liquibase:
+    contexts: test
+  mail:
+    host: localhost
+  main:
+    allow-bean-definition-overriding: true
+  messages:
+    basename: i18n/messages
+  task:
+    execution:
+      thread-name-prefix: borestop-task-
+      pool:
+        core-size: 1
+        max-size: 50
+        queue-capacity: 10000
+    scheduling:
+      thread-name-prefix: borestop-scheduling-
+      pool:
+        size: 1
+  thymeleaf:
+    mode: HTML
+
+server:
+  port: 10344
+  address: localhost
+
+# ===================================================================
+# JHipster specific properties
+#
+# Full reference is available at: https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+jhipster:
+  clientApp:
+    name: 'borestopApp'
+  logging:
+    # To test json console appender
+    use-json-format: false
+    logstash:
+      enabled: false
+      host: localhost
+      port: 5000
+      queue-size: 512
+  mail:
+    from: test@localhost
+    base-url: http://127.0.0.1:8080
+  security:
+    authentication:
+      jwt:
+        # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line)
+        base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=
+        # Token is valid 24 hours
+        token-validity-in-seconds: 86400
+  metrics:
+    logs: # Reports metrics in the logs
+      enabled: true
+      report-frequency: 60 # in seconds
+
+# ===================================================================
+# Application specific properties
+# Add your own application properties here, see the ApplicationProperties class
+# to have type-safe configuration, like in the JHipsterProperties above
+#
+# More documentation is available at:
+# https://www.jhipster.tech/common-application-properties/
+# ===================================================================
+
+# application:
diff --git a/borestop/src/test/resources/i18n/messages_en.properties b/borestop/src/test/resources/i18n/messages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7b3fbb99db4c5c8d0c4311ade40ba303b2f4908f
--- /dev/null
+++ b/borestop/src/test/resources/i18n/messages_en.properties
@@ -0,0 +1,4 @@
+email.test.title=test title
+# Value used for English locale unit test in MailServiceIT
+# as this file is loaded instead of real file
+email.activation.title=borestop account activation
diff --git a/borestop/src/test/resources/logback.xml b/borestop/src/test/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8d334f268c75b77f08d31489620a5b5e71686b5f
--- /dev/null
+++ b/borestop/src/test/resources/logback.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration>
+
+<configuration scan="true">
+    <include resource="org/springframework/boot/logging/logback/base.xml"/>
+
+    <logger name="com.ippon.borestop" level="INFO"/>
+
+    <logger name="io.github.jhipster" level="WARN"/>
+
+    <logger name="javax.activation" level="WARN"/>
+    <logger name="javax.mail" level="WARN"/>
+    <logger name="javax.xml.bind" level="WARN"/>
+    <logger name="ch.qos.logback" level="WARN"/>
+    <logger name="com.ryantenney" level="WARN"/>
+    <logger name="com.sun" level="WARN"/>
+    <logger name="com.zaxxer" level="WARN"/>
+    <logger name="com.github.dockerjava" level="WARN"/>
+    <logger name="org.testcontainers" level="WARN"/>
+    <logger name="io.undertow" level="WARN"/>
+    <logger name="io.undertow.websockets.jsr" level="ERROR"/>
+    <logger name="org.apache" level="WARN"/>
+    <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
+    <logger name="org.bson" level="WARN"/>
+    <logger name="org.hibernate.validator" level="WARN"/>
+    <logger name="org.hibernate" level="WARN"/>
+    <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
+    <logger name="org.postgresql.jdbc" level="WARN"/>
+    <logger name="org.springframework" level="WARN"/>
+    <logger name="org.springframework.web" level="WARN"/>
+    <logger name="org.springframework.security" level="WARN"/>
+    <logger name="org.springframework.cache" level="WARN"/>
+    <logger name="org.thymeleaf" level="WARN"/>
+    <logger name="org.xnio" level="WARN"/>
+    <logger name="springfox" level="WARN"/>
+    <logger name="sun.rmi" level="WARN"/>
+    <logger name="liquibase" level="WARN"/>
+    <logger name="LiquibaseSchemaResolver" level="INFO"/>
+    <logger name="sun.rmi.transport" level="WARN"/>
+    <logger name="com.tngtech.archunit.core.importer" level="ERROR"/>
+
+    <root>
+        <level>WARN</level>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+
+</configuration>
diff --git a/borestop/src/test/resources/templates/mail/testEmail.html b/borestop/src/test/resources/templates/mail/testEmail.html
new file mode 100644
index 0000000000000000000000000000000000000000..a4ca16a79f05dcd22c3d3adad996611b5e7a8afa
--- /dev/null
+++ b/borestop/src/test/resources/templates/mail/testEmail.html
@@ -0,0 +1 @@
+<html xmlns:th="http://www.thymeleaf.org" th:text="|#{email.test.title}, ${baseUrl}, ${user.login}|"></html>
diff --git a/borestop/tsconfig.app.json b/borestop/tsconfig.app.json
new file mode 100644
index 0000000000000000000000000000000000000000..5c33c96b75525374417aa29df73902546aeb2487
--- /dev/null
+++ b/borestop/tsconfig.app.json
@@ -0,0 +1,4 @@
+{
+  "extends": "./tsconfig.base.json",
+  "files": ["src/main/webapp/app/app.main.ts"]
+}
diff --git a/borestop/tsconfig.base.json b/borestop/tsconfig.base.json
new file mode 100644
index 0000000000000000000000000000000000000000..afc0bb2aab14ada3ef4de5c4eeea0fe3dba89ccf
--- /dev/null
+++ b/borestop/tsconfig.base.json
@@ -0,0 +1,31 @@
+{
+  "compilerOptions": {
+    "target": "es6",
+    "module": "esnext",
+    "moduleResolution": "node",
+    "sourceMap": true,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "strict": true,
+    "noImplicitReturns": true,
+    "noFallthroughCasesInSwitch": true,
+    "suppressImplicitAnyIndexErrors": true,
+    "skipLibCheck": true,
+    "outDir": "target/classes/static/app",
+    "lib": ["es7", "dom"],
+    "baseUrl": "./",
+    "paths": {
+      "app/*": ["src/main/webapp/app/*"]
+    },
+    "importHelpers": true,
+    "downlevelIteration": true,
+    "declaration": false,
+    "forceConsistentCasingInFileNames": true
+  },
+  "angularCompilerOptions": {
+    "strictInjectionParameters": true,
+    "fullTemplateTypeCheck": true,
+    "strictTemplates": true,
+    "preserveWhitespaces": true
+  }
+}
diff --git a/borestop/tsconfig.json b/borestop/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..dda314604505c32a7e724bee4f0d68f18b699b0b
--- /dev/null
+++ b/borestop/tsconfig.json
@@ -0,0 +1,11 @@
+{
+  "files": [],
+  "references": [
+    {
+      "path": "./tsconfig.app.json"
+    },
+    {
+      "path": "./tsconfig.e2e.json"
+    }
+  ]
+}
diff --git a/borestop/tslint.json b/borestop/tslint.json
new file mode 100644
index 0000000000000000000000000000000000000000..52fb92500384158e56e3286ff140f5c1412302a9
--- /dev/null
+++ b/borestop/tslint.json
@@ -0,0 +1,17 @@
+{
+  "rulesDirectory": ["node_modules/codelyzer"],
+  "rules": {
+    "directive-selector": [true, "attribute", "jhi", "camelCase"],
+    "component-selector": [true, "element", "jhi", "kebab-case"],
+    "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": false,
+    "component-class-suffix": true,
+    "directive-class-suffix": true,
+    "typedef": [true, "call-signature"]
+  }
+}
diff --git a/borestop/webpack/logo-jhipster.png b/borestop/webpack/logo-jhipster.png
new file mode 100755
index 0000000000000000000000000000000000000000..e301aa90f75e3ef8b5c5bf053186f3a02e7605d2
Binary files /dev/null and b/borestop/webpack/logo-jhipster.png differ
diff --git a/borestop/webpack/utils.js b/borestop/webpack/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..25620b4743a85b684178752df1469a6b8b7c1ca9
--- /dev/null
+++ b/borestop/webpack/utils.js
@@ -0,0 +1,39 @@
+const path = require('path');
+
+const tsconfig = require('../tsconfig.base.json');
+
+module.exports = {
+  root,
+  mapTypescriptAliasToWebpackAlias
+};
+
+const _root = path.resolve(__dirname, '..');
+
+function root(args) {
+  args = Array.prototype.slice.call(arguments, 0);
+  return path.join.apply(path, [_root].concat(args));
+}
+
+function mapTypescriptAliasToWebpackAlias(alias = {}) {
+  const webpackAliases = { ...alias };
+  if (!tsconfig.compilerOptions.paths) {
+    return webpackAliases;
+  }
+  Object.entries(tsconfig.compilerOptions.paths)
+    .filter(([key, value]) => {
+      // use Typescript alias in Webpack only if this has value
+      return Boolean(value.length);
+    })
+    .map(([key, value]) => {
+      // if Typescript alias ends with /* then remove this for Webpack
+      const regexToReplace = /\/\*$/;
+      const aliasKey = key.replace(regexToReplace, '');
+      const aliasValue = value[0].replace(regexToReplace, '');
+      return [aliasKey, root(aliasValue)];
+    })
+    .reduce((aliases, [key, value]) => {
+      aliases[key] = value;
+      return aliases;
+    }, webpackAliases);
+  return webpackAliases;
+}
diff --git a/borestop/webpack/webpack.common.js b/borestop/webpack/webpack.common.js
new file mode 100644
index 0000000000000000000000000000000000000000..5853fa10b5a3097e59810555b46a18a8c152c520
--- /dev/null
+++ b/borestop/webpack/webpack.common.js
@@ -0,0 +1,114 @@
+const webpack = require('webpack');
+const CopyWebpackPlugin = require('copy-webpack-plugin');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin;
+const MergeJsonWebpackPlugin = require('merge-jsons-webpack-plugin');
+
+const utils = require('./utils.js');
+
+module.exports = options => ({
+  resolve: {
+    extensions: ['.ts', '.js'],
+    modules: ['node_modules'],
+    mainFields: ['es2015', 'browser', 'module', 'main'],
+    alias: utils.mapTypescriptAliasToWebpackAlias()
+  },
+  stats: {
+    children: false
+  },
+  module: {
+    rules: [
+      {
+        test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/,
+        loader: '@ngtools/webpack'
+      },
+      {
+        test: /\.html$/,
+        loader: 'html-loader',
+        options: {
+          minimize: {
+            caseSensitive: true,
+            removeAttributeQuotes: false,
+            minifyJS: false,
+            minifyCSS: false
+          }
+        },
+        exclude: utils.root('src/main/webapp/index.html')
+      },
+      {
+        test: /\.(jpe?g|png|gif|svg|woff2?|ttf|eot)$/i,
+        loader: 'file-loader',
+        options: {
+          digest: 'hex',
+          hash: 'sha512',
+          // For fixing src attr of image
+          // See https://github.com/jhipster/generator-jhipster/issues/11209
+          name: 'content/[hash].[ext]',
+          esModule: false
+        }
+      },
+      {
+        test: /manifest.webapp$/,
+        loader: 'file-loader',
+        options: {
+          name: 'manifest.webapp'
+        }
+      },
+      // Ignore warnings about System.import in Angular
+      { test: /[\/\\]@angular[\/\\].+\.js$/, parser: { system: true } }
+    ]
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': {
+        NODE_ENV: `'${options.env}'`,
+        BUILD_TIMESTAMP: `'${new Date().getTime()}'`,
+        // APP_VERSION is passed as an environment variable from the Gradle / Maven build tasks.
+        VERSION: `'${process.env.hasOwnProperty('APP_VERSION') ? process.env.APP_VERSION : 'DEV'}'`,
+        DEBUG_INFO_ENABLED: options.env === 'development',
+        // The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`.
+        // If this URL is left empty (""), then it will be relative to the current context.
+        // If you use an API server, in `prod` mode, you will need to enable CORS
+        // (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations)
+        SERVER_API_URL: `''`
+      }
+    }),
+    new CopyWebpackPlugin({
+      patterns: [
+        {
+          from: './node_modules/swagger-ui-dist/*.{js,css,html,png}',
+          to: 'swagger-ui',
+          flatten: true,
+          globOptions: { ignore: ['**/index.html'] }
+        },
+        { from: './node_modules/axios/dist/axios.min.js', to: 'swagger-ui' },
+        { from: './src/main/webapp/swagger-ui/', to: 'swagger-ui' },
+        { from: './src/main/webapp/content/', to: 'content' },
+        { from: './src/main/webapp/favicon.ico', to: 'favicon.ico' },
+        { from: './src/main/webapp/manifest.webapp', to: 'manifest.webapp' },
+        // jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array
+        { from: './src/main/webapp/robots.txt', to: 'robots.txt' }
+      ]
+    }),
+    new MergeJsonWebpackPlugin({
+      output: {
+        groupBy: [
+          { pattern: './src/main/webapp/i18n/en/*.json', fileName: './i18n/en.json' }
+          // jhipster-needle-i18n-language-webpack - JHipster will add/remove languages in this array
+        ]
+      }
+    }),
+    new HtmlWebpackPlugin({
+      template: './src/main/webapp/index.html',
+      chunks: ['polyfills', 'main', 'global'],
+      chunksSortMode: 'manual',
+      inject: 'body',
+      base: '/'
+    }),
+    new AngularCompilerPlugin({
+      mainPath: utils.root('src/main/webapp/app/app.main.ts'),
+      tsConfigPath: utils.root('tsconfig.app.json'),
+      sourceMap: true
+    })
+  ]
+});
diff --git a/borestop/webpack/webpack.dev.js b/borestop/webpack/webpack.dev.js
new file mode 100644
index 0000000000000000000000000000000000000000..2875825b7f115b21b3d6d56500b1a4b4bc65fc45
--- /dev/null
+++ b/borestop/webpack/webpack.dev.js
@@ -0,0 +1,125 @@
+const webpack = require('webpack');
+const writeFilePlugin = require('write-file-webpack-plugin');
+const webpackMerge = require('webpack-merge');
+const BrowserSyncPlugin = require('browser-sync-webpack-plugin');
+const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
+const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin');
+const WebpackNotifierPlugin = require('webpack-notifier');
+const path = require('path');
+const sass = require('sass');
+
+const utils = require('./utils.js');
+const commonConfig = require('./webpack.common.js');
+
+const ENV = 'development';
+
+module.exports = options =>
+  webpackMerge(commonConfig({ env: ENV }), {
+    devtool: 'eval-source-map',
+    devServer: {
+      contentBase: './target/classes/static/',
+      proxy: [
+        {
+          context: ['/api', '/services', '/management', '/swagger-resources', '/v2/api-docs', '/h2-console', '/auth'],
+          target: `http${options.tls ? 's' : ''}://localhost:8080`,
+          secure: false,
+          changeOrigin: options.tls
+        }
+      ],
+      stats: options.stats,
+      watchOptions: {
+        ignored: /node_modules/
+      },
+      https: options.tls,
+      historyApiFallback: true
+    },
+    entry: {
+      global: './src/main/webapp/content/scss/global.scss',
+      main: './src/main/webapp/app/app.main'
+    },
+    output: {
+      path: utils.root('target/classes/static/'),
+      filename: 'app/[name].bundle.js',
+      chunkFilename: 'app/[id].chunk.js'
+    },
+    module: {
+      rules: [
+        {
+          test: /\.(j|t)s$/,
+          enforce: 'pre',
+          loader: 'eslint-loader',
+          exclude: /node_modules/
+        },
+        {
+          test: /\.scss$/,
+          use: [
+            'to-string-loader',
+            'css-loader',
+            'postcss-loader',
+            {
+              loader: 'sass-loader',
+              options: { implementation: sass }
+            }
+          ],
+          exclude: /(vendor\.scss|global\.scss)/
+        },
+        {
+          test: /(vendor\.scss|global\.scss)/,
+          use: [
+            'style-loader',
+            'css-loader',
+            'postcss-loader',
+            {
+              loader: 'sass-loader',
+              options: { implementation: sass }
+            }
+          ]
+        }
+      ]
+    },
+    stats: process.env.JHI_DISABLE_WEBPACK_LOGS ? 'none' : options.stats,
+    plugins: [
+      process.env.JHI_DISABLE_WEBPACK_LOGS
+        ? null
+        : new SimpleProgressWebpackPlugin({
+            format: options.stats === 'minimal' ? 'compact' : 'expanded'
+          }),
+      new FriendlyErrorsWebpackPlugin(),
+      new BrowserSyncPlugin(
+        {
+          https: options.tls,
+          host: 'localhost',
+          port: 9000,
+          proxy: {
+            target: `http${options.tls ? 's' : ''}://localhost:9060`,
+            proxyOptions: {
+              changeOrigin: false //pass the Host header to the backend unchanged  https://github.com/Browsersync/browser-sync/issues/430
+            }
+          },
+          socket: {
+            clients: {
+              heartbeatTimeout: 60000
+            }
+          }
+          /*
+            ,ghostMode: { // uncomment this part to disable BrowserSync ghostMode; https://github.com/jhipster/generator-jhipster/issues/11116
+                clicks: false,
+                location: false,
+                forms: false,
+                scroll: false
+            } */
+        },
+        {
+          reload: false
+        }
+      ),
+      new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)/, path.resolve(__dirname, './src/main/webapp/')),
+      new writeFilePlugin(),
+      new webpack.WatchIgnorePlugin([utils.root('src/test')]),
+      new WebpackNotifierPlugin({
+        title: 'JHipster',
+        contentImage: path.join(__dirname, 'logo-jhipster.png')
+      })
+    ].filter(Boolean),
+    mode: 'development'
+  });
diff --git a/borestop/webpack/webpack.prod.js b/borestop/webpack/webpack.prod.js
new file mode 100644
index 0000000000000000000000000000000000000000..219e081f8209474bd48444a3a2aba66d3e7fa55a
--- /dev/null
+++ b/borestop/webpack/webpack.prod.js
@@ -0,0 +1,154 @@
+const webpack = require('webpack');
+const webpackMerge = require('webpack-merge');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
+const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
+const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
+const TerserPlugin = require('terser-webpack-plugin');
+const WorkboxPlugin = require('workbox-webpack-plugin');
+
+const utils = require('./utils.js');
+const commonConfig = require('./webpack.common.js');
+
+const ENV = 'production';
+const sass = require('sass');
+
+module.exports = webpackMerge(commonConfig({ env: ENV }), {
+  // Enable source maps. Please note that this will slow down the build.
+  // You have to enable it in Terser config below and in tsconfig.json as well
+  // devtool: 'source-map',
+  entry: {
+    global: './src/main/webapp/content/scss/global.scss',
+    main: './src/main/webapp/app/app.main'
+  },
+  output: {
+    path: utils.root('target/classes/static/'),
+    filename: 'app/[name].[hash].bundle.js',
+    chunkFilename: 'app/[id].[hash].chunk.js'
+  },
+  module: {
+    rules: [
+      {
+        test: /\.scss$/,
+        use: [
+          'to-string-loader',
+          'css-loader',
+          'postcss-loader',
+          {
+            loader: 'sass-loader',
+            options: { implementation: sass }
+          }
+        ],
+        exclude: /(vendor\.scss|global\.scss)/
+      },
+      {
+        test: /(vendor\.scss|global\.scss)/,
+        use: [
+          {
+            loader: MiniCssExtractPlugin.loader,
+            options: {
+              publicPath: '../'
+            }
+          },
+          'css-loader',
+          'postcss-loader',
+          {
+            loader: 'sass-loader',
+            options: { implementation: sass }
+          }
+        ]
+      },
+      {
+        test: /\.css$/,
+        use: ['to-string-loader', 'css-loader'],
+        exclude: /(vendor\.css|global\.css)/
+      },
+      {
+        test: /(vendor\.css|global\.css)/,
+        use: [
+          {
+            loader: MiniCssExtractPlugin.loader,
+            options: {
+              publicPath: '../'
+            }
+          },
+          'css-loader',
+          'postcss-loader'
+        ]
+      }
+    ]
+  },
+  optimization: {
+    runtimeChunk: false,
+    minimizer: [
+      new TerserPlugin({
+        parallel: true,
+        cache: true,
+        // sourceMap: true, // Enable source maps. Please note that this will slow down the build
+        terserOptions: {
+          ecma: 6,
+          ie8: false,
+          toplevel: true,
+          module: true,
+          compress: {
+            dead_code: true,
+            warnings: false,
+            properties: true,
+            drop_debugger: true,
+            conditionals: true,
+            booleans: true,
+            loops: true,
+            unused: true,
+            toplevel: true,
+            if_return: true,
+            inline: true,
+            join_vars: true,
+            ecma: 6,
+            module: true
+          },
+          output: {
+            comments: false,
+            beautify: false,
+            indent_level: 2,
+            ecma: 6
+          },
+          mangle: {
+            module: true,
+            toplevel: true
+          }
+        }
+      }),
+      new OptimizeCSSAssetsPlugin({})
+    ]
+  },
+  plugins: [
+    new MiniCssExtractPlugin({
+      // Options similar to the same options in webpackOptions.output
+      // both options are optional
+      filename: 'content/[name].[contenthash].css',
+      chunkFilename: 'content/[id].css'
+    }),
+    new MomentLocalesPlugin({
+      localesToKeep: [
+        'en'
+        // jhipster-needle-i18n-language-moment-webpack - JHipster will add/remove languages in this array
+      ]
+    }),
+    new BundleAnalyzerPlugin({
+      analyzerMode: 'static',
+      openAnalyzer: false,
+      // Webpack statistics in target folder
+      reportFilename: '../stats.html'
+    }),
+    new webpack.LoaderOptionsPlugin({
+      minimize: true,
+      debug: false
+    }),
+    new WorkboxPlugin.GenerateSW({
+      clientsClaim: true,
+      skipWaiting: true,
+      exclude: [/swagger-ui/]
+    })
+  ],
+  mode: 'production'
+});