gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (13bccc7b -> fb2e2f89)


From: gnunet
Subject: [taler-wallet-core] branch master updated (13bccc7b -> fb2e2f89)
Date: Tue, 07 Apr 2020 10:12:19 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch master
in repository wallet-core.

    from 13bccc7b integration tests (based on Christian's auditor tests)
     new 07f25566 start spring cleaning, use rollup instead of both webpack and 
rollup
     new f36bb7a0 linter
     new 47787c0b make linter less grumpy
     new 1471aae8 linter / simpler webextension pack
     new fb2e2f89 more lint fixes

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .eslintrc.js                                       |   34 +
 .vscode/settings.json                              |    1 -
 Makefile                                           |   48 +-
 gulpfile.js                                        |  352 --
 package.json                                       |   61 +-
 rollup.config.js                                   |  186 +-
 src/android/index.ts                               |   13 +-
 src/crypto/primitives/kdf.ts                       |    6 +-
 src/crypto/primitives/nacl-fast.ts                 | 1490 +----
 src/crypto/primitives/sha256.ts                    |   20 +-
 src/crypto/talerCrypto-test.ts                     |    4 +-
 src/crypto/talerCrypto.ts                          |    8 +-
 src/crypto/workers/cryptoApi.ts                    |   60 +-
 src/crypto/workers/cryptoImplementation.ts         |   37 +-
 src/crypto/workers/nodeThreadWorker.ts             |   22 +-
 src/crypto/workers/synchronousWorker.ts            |   14 +-
 src/db.ts                                          |    4 +-
 src/headless/bank.ts                               |    2 +-
 src/headless/clk.ts                                |   38 +-
 src/headless/helpers.ts                            |   12 +-
 src/headless/integrationtest.ts                    |   10 +-
 src/headless/merchant.ts                           |    2 +-
 src/headless/taler-wallet-cli.ts                   |   27 +-
 src/i18n/strings-prelude                           |    2 +-
 src/i18n/strings.ts                                |    2 +-
 src/operations/balance.ts                          |    4 +-
 src/operations/exchanges.ts                        |   22 +-
 src/operations/history.ts                          |   10 +-
 src/operations/pay.ts                              |   20 +-
 src/operations/pending.ts                          |   42 +-
 src/operations/recoup.ts                           |   10 +-
 src/operations/refresh.ts                          |   17 +-
 src/operations/refund.ts                           |   24 +-
 src/operations/reserves.ts                         |   46 +-
 src/operations/state.ts                            |    6 +-
 src/operations/tip.ts                              |   11 +-
 src/operations/withdraw.ts                         |   24 +-
 src/types/ReserveStatus.ts                         |   16 +-
 src/types/ReserveTransaction.ts                    |  145 +-
 src/types/dbTypes.ts                               |    4 +-
 src/types/history.ts                               |    1 -
 src/types/notifications.ts                         |    9 +-
 src/types/pending.ts                               |    1 -
 src/types/talerTypes.ts                            |  438 +-
 src/types/walletTypes.ts                           |   32 +-
 src/util/RequestThrottler.ts                       |    7 +-
 src/util/amounts.ts                                |   22 +-
 src/util/asyncMemo.ts                              |    8 +-
 src/util/codec.ts                                  |    4 -
 src/util/helpers.ts                                |   12 +-
 src/util/http.ts                                   |   20 +-
 src/util/logging.ts                                |   10 +-
 src/util/query.ts                                  |   24 +-
 src/util/talerconfig.ts                            |    2 -
 src/util/taleruri-test.ts                          |    2 +-
 src/util/taleruri.ts                               |    2 +-
 src/util/time.ts                                   |    8 +-
 src/util/timer.ts                                  |   17 +-
 src/wallet-test.ts                                 |    3 -
 src/wallet.ts                                      |   28 +-
 src/webex/chromeBadge.ts                           |   30 +-
 src/webex/compat.ts                                |    2 +-
 src/webex/i18n.tsx                                 |   14 +-
 src/webex/messages.ts                              |   20 -
 src/webex/notify.ts                                |   22 +-
 src/webex/pageEntryPoint.ts                        |   64 +
 src/webex/pages/add-auditor.tsx                    |   17 +-
 src/webex/pages/auditors.tsx                       |   25 +-
 src/webex/pages/benchmark.tsx                      |   16 +-
 src/webex/pages/pay.tsx                            |   14 +-
 src/webex/pages/payback.tsx                        |    7 +-
 src/webex/pages/popup.html                         |   16 -
 src/webex/pages/popup.tsx                          |  104 +-
 src/webex/pages/redirect.html                      |   12 -
 src/webex/pages/redirect.js                        |   16 -
 src/webex/pages/refund.tsx                         |   24 +-
 src/webex/pages/reset-required.tsx                 |   13 +-
 src/webex/pages/return-coins.html                  |   19 -
 src/webex/pages/return-coins.tsx                   |   26 +-
 src/webex/pages/show-db.html                       |   18 -
 src/webex/pages/show-db.ts                         |  103 -
 src/webex/pages/tip.tsx                            |   52 +-
 src/webex/pages/welcome.tsx                        |   14 +-
 src/webex/pages/withdraw.html                      |   21 -
 src/webex/pages/withdraw.tsx                       |   43 +-
 src/webex/renderHtml.tsx                           |  122 +-
 src/webex/wxApi.ts                                 |   11 +-
 src/webex/wxBackend.ts                             |  103 +-
 tsconfig.json                                      |  107 +-
 tslint.json                                        |   63 -
 manifest.json => webextension/manifest.json        |   10 +-
 webextension/pack.sh                               |   20 +
 .../pages => webextension/static}/add-auditor.html |    5 +-
 .../pages => webextension/static}/auditors.html    |    5 +-
 {src/webex => webextension/static}/background.html |    2 +-
 .../pages => webextension/static}/benchmark.html   |    5 +-
 {img => webextension/static/img}/icon.png          |  Bin
 .../static/img}/logo-2015-medium.png               |  Bin
 {img => webextension/static/img}/logo.png          |    0
 {img => webextension/static/img}/spinner-bars.svg  |    0
 {src/webex/pages => webextension/static}/pay.html  |    9 +-
 .../pages => webextension/static}/payback.html     |    8 +-
 webextension/static/popup.html                     |   15 +
 .../pages => webextension/static}/refund.html      |    8 +-
 .../static}/reset-required.html                    |    8 +-
 webextension/static/return-coins.html              |   16 +
 .../pages => webextension/static/style}/popup.css  |    0
 {src/webex => webextension/static}/style/pure.css  |    0
 .../webex => webextension/static}/style/wallet.css |    0
 {src/webex/pages => webextension/static}/tip.html  |    8 +-
 .../pages => webextension/static}/welcome.html     |    8 +-
 webextension/static/withdraw.html                  |   18 +
 webpack.config.js                                  |  111 -
 yarn.lock                                          | 5914 +++++---------------
 114 files changed, 2903 insertions(+), 7891 deletions(-)
 create mode 100644 .eslintrc.js
 delete mode 100644 gulpfile.js
 create mode 100644 src/webex/pageEntryPoint.ts
 delete mode 100644 src/webex/pages/popup.html
 delete mode 100644 src/webex/pages/redirect.html
 delete mode 100644 src/webex/pages/redirect.js
 delete mode 100644 src/webex/pages/return-coins.html
 delete mode 100644 src/webex/pages/show-db.html
 delete mode 100644 src/webex/pages/show-db.ts
 delete mode 100644 src/webex/pages/withdraw.html
 delete mode 100644 tslint.json
 rename manifest.json => webextension/manifest.json (81%)
 create mode 100755 webextension/pack.sh
 rename {src/webex/pages => webextension/static}/add-auditor.html (73%)
 rename {src/webex/pages => webextension/static}/auditors.html (75%)
 rename {src/webex => webextension/static}/background.html (76%)
 rename {src/webex/pages => webextension/static}/benchmark.html (60%)
 rename {img => webextension/static/img}/icon.png (100%)
 rename {img => webextension/static/img}/logo-2015-medium.png (100%)
 rename {img => webextension/static/img}/logo.png (100%)
 rename {img => webextension/static/img}/spinner-bars.svg (100%)
 rename {src/webex/pages => webextension/static}/pay.html (85%)
 rename {src/webex/pages => webextension/static}/payback.html (74%)
 create mode 100644 webextension/static/popup.html
 rename {src/webex/pages => webextension/static}/refund.html (62%)
 rename {src/webex/pages => webextension/static}/reset-required.html (59%)
 create mode 100644 webextension/static/return-coins.html
 rename {src/webex/pages => webextension/static/style}/popup.css (100%)
 rename {src/webex => webextension/static}/style/pure.css (100%)
 rename {src/webex => webextension/static}/style/wallet.css (100%)
 rename {src/webex/pages => webextension/static}/tip.html (55%)
 rename {src/webex/pages => webextension/static}/welcome.html (56%)
 create mode 100644 webextension/static/withdraw.html
 delete mode 100644 webpack.config.js

diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..0d84f0f5
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,34 @@
+module.exports = {
+  root: true,
+  parser: "@typescript-eslint/parser",
+  plugins: ["@typescript-eslint"],
+  extends: [
+    "eslint:recommended",
+    "plugin:@typescript-eslint/eslint-recommended",
+    "plugin:@typescript-eslint/recommended",
+    "plugin:react/recommended",
+    "plugin:react-hooks/recommended",
+  ],
+  settings: {
+    "react": {
+      "version": "16.9.6",
+    },
+
+  },
+  rules: {
+    "no-constant-condition": ["error", { "checkLoops": false }],
+    "prefer-const": ["warn", { destructuring: "all" }],
+    "@typescript-eslint/camelcase": "off",
+    "@typescript-eslint/ban-ts-ignore": "off",
+    "@typescript-eslint/no-explicit-any": "off",
+    "@typescript-eslint/no-unused-vars": ["warn", { args: "none" }],
+    "@typescript-eslint/explicit-function-return-type": [
+      "warn",
+      { allowExpressions: true },
+    ],
+    "@typescript-eslint/no-use-before-define": [
+      "error",
+      { functions: false, classes: false },
+    ],
+  },
+};
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 6482c5da..7f8edcba 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -34,7 +34,6 @@
         },
         "**/*.js.map": true
     },
-    "tslint.enable": true,
     "editor.wrappingIndent": "same",
     "editor.tabSize": 2
 }
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 4190b14d..6d0bacbb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,39 +1,26 @@
 src = src
 poname = taler-wallet-webex
 
-gulp = node_modules/gulp/bin/gulp.js
 tsc = node_modules/typescript/bin/tsc
 pogen = node_modules/pogen/bin/pogen.js
 typedoc = node_modules/typedoc/bin/typedoc
-ava = node_modules/ava/cli.js
+ava = node_modules/.bin/ava
 nyc = node_modules/nyc/bin/nyc.js
-tslint = node_modules/tslint/bin/tslint
 
 include config.mk
 
 .PHONY: tsc
-tsc: tsconfig.json yarn-install
+tsc: yarn-install
        $(tsc)
 
-.PHONY: webex-stable
-webex-stable: i18n
-       $(gulp) stable
-
-.PHONY: webex-unstable
-webex-unstable: i18n
-       $(gulp) unstable
-
-tsconfig.json: gulpfile.js yarn-install
-       $(gulp) tsconfig
-
 .PHONY: dist
 dist:
-       $(gulp) srcdist
+       git archive --format=tar.gz HEAD -o taler-wallet.tar.gz
 
 # make documentation from docstrings
 .PHONY: typedoc
 typedoc:
-       $(typedoc) --out build/typedoc --readme README
+       $(typedoc) --out dist/typedoc --readme README
 
 .PHONY: clean
 clean:
@@ -45,20 +32,19 @@ submodules-update:
 
 .PHONY: check
 check: tsc yarn-install
-       find dist/node -name '*-test.js' | xargs $(ava)
+       $(ava)
 
 .PHONY: coverage
 coverage: tsc yarn-install
        $(nyc) --all $(ava) 'build/**/*-test.js'
 
-.PHONY: lint
-lint: tsc yarn-install
-       $(tslint) -e src/i18n/strings.ts --project tsconfig.json -t verbose 
'src/**/*.ts' 'src/**/*.tsx'
-
 .PHONY: yarn-install
 yarn-install:
        $(yarn) install
 
+.PHONY: webextensions
+webextensions: rollup
+       ./webextension/pack.sh
 
 .PHONY: i18n
 i18n: yarn-install
@@ -74,7 +60,7 @@ i18n: yarn-install
          msgmerge -o $$pofile $$pofile src/i18n/$(poname).pot; \
        done;
        # generate .ts file containing all translations
-       $(gulp) po2js
+       ./contrib/po2ts
 
 # Some commands are only available when ./configure has been run
 
@@ -90,20 +76,10 @@ install: tsc
        $(yarn) global add file://$(CURDIR) --prefix $(prefix)
 endif
 
-.PHONY: watch
-watch: tsconfig.json
-       ./node_modules/.bin/webpack --watch
-
 .PHONY: rollup
 rollup: tsc
        ./node_modules/.bin/rollup -c
 
-# Create the node_modules directory for the android wallet
-package-android:
-       rm -rf dist/android
-       mkdir -p dist/android
-       yarn pack --filename dist/android/taler-wallet.tar.gz
-       cp contrib/package-android.json dist/android/package.json
-       cd dist/android && yarn install
-       #cd dist/android && npm install --global --prefix 
$(CURDIR)/dist/android $(CURDIR)
-
+.PHONY: lint
+lint:
+       ./node_modules/.bin/eslint --ext '.js,.ts,.tsx' 'src'
diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index 15f6ff10..00000000
--- a/gulpfile.js
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- This file is part of TALER
- (C) 2015-2016 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-"use strict";
-
-/**
- * Run with
- * $ gulp <taskname>
- *
- * The important tasks are:
- * - tsconfig: generate tsconfig.json file for
- *   development
- * - package: create Chrome extension zip file in
- *   dist/.
- *
- * @author Florian Dold
- */
-
-const gulp = require("gulp");
-const map = require("map-stream");
-const zip = require("gulp-zip");
-const gzip = require("gulp-gzip");
-const rename = require("gulp-rename");
-const tar = require("gulp-tar");
-const glob = require("glob");
-const jsonTransform = require("gulp-json-transform");
-const fs = require("fs");
-const through = require("through2");
-const File = require("vinyl");
-const Stream = require("stream").Stream;
-const vfs = require("vinyl-fs");
-const webpack = require("webpack");
-const po2json = require("po2json");
-const path = require("path");
-
-const paths = {
-  ts: {
-    src: [
-      "src/**/*.{ts,tsx,js}",
-      "!src/**/*-test*.ts",
-    ],
-    test: [
-        "src/**/*-test*.ts",
-    ],
-  },
-  // distributed in the chrome extension
-  dist: [
-    "dist/*-bundle.js",
-    "dist/*-bundle.js.map",
-    "img/icon.png",
-    "img/logo.png",
-    "src/webex/**/*.{js,css,html}",
-  ],
-  // for the source distribution
-  extra: [
-      "AUTHORS",
-      "COPYING",
-      "Makefile",
-      "README",
-      "configure",
-      "gulpfile.js",
-      "manifest.json",
-      "package.json",
-      "src/i18n/*.po",
-      "src/i18n/*.pot",
-      "src/i18n/poheader",
-      "src/i18n/strings-prelude",
-      "tooling/**",
-      "tsconfig.json",
-      "webpack.config.js",
-  ],
-};
-
-
-const tsBaseArgs = {
-  target: "es6",
-  jsx: "react",
-  reactNamespace: "React",
-  experimentalDecorators: true,
-  module: "commonjs",
-  sourceMap: true,
-  lib: ["es6", "dom"],
-  noImplicitReturns: true,
-  noFallthroughCasesInSwitch: true,
-  strict: true,
-  strictPropertyInitialization: false,
-  outDir: "dist/node",
-  noImplicitAny: true,
-  noImplicitThis: true,
-  allowJs: true,
-  checkJs: true,
-  incremental: true,
-  esModuleInterop: true,
-};
-
-
-const manifest = JSON.parse(fs.readFileSync("manifest.json", "utf8"));
-
-
-// Concatenate node streams,
-// taken from dominictarr's event-stream module
-function concatStreams (...streams) {
-  var stream = new Stream();
-  stream.setMaxListeners(0); // allow adding more than 11 streams
-  var endCount = 0;
-  stream.writable = stream.readable = true;
-
-  streams.forEach(function (e) {
-    e.pipe(stream, {end: false});
-    var ended = false;
-    e.on('end', function () {
-      if (ended) return;
-      ended = true;
-      endCount++;
-      if (endCount == streams.length)
-        stream.emit('end');
-    })
-  });
-  stream.write = function (data) {
-    this.emit('data', data);
-  };
-  stream.destroy = function () {
-    streams.forEach(function (e) {
-      if (e.destroy) e.destroy();
-    })
-  };
-  return stream;
-}
-
-
-
-function dist_prod() {
-  return vfs.src(paths.dist, {base: ".", stripBOM: false})
-            .pipe(gulp.dest("dist/ext/"));
-}
-
-function compile_prod(callback) {
-  let config = require("./webpack.config.js")({ mode: "production" });
-  webpack(config, function(err, stats) {
-    if (err) {
-      throw new gutil.PluginError("webpack", err);
-    }
-    if (stats.hasErrors() || stats.hasWarnins) {
-      console.log("[webpack]", stats.toString({
-        colors: true,
-      }));
-    }
-    if (stats.hasErrors()) {
-      callback(Error("webpack completed with errors"))
-    } else {
-      callback();
-    }
-  });
-}
-
-
-function manifest_stable() {
-  return gulp.src("manifest.json")
-             .pipe(jsonTransform((data) => {
-               data.name = "GNU Taler Wallet";
-               return data;
-             }, 2))
-             .pipe(gulp.dest("dist/ext/"));
-}
-
-
-function manifest_unstable() {
-  return gulp.src("manifest.json")
-             .pipe(jsonTransform((data) => {
-               data.name = "GNU Taler Wallet (unstable)";
-               return data;
-             }, 2))
-             .pipe(gulp.dest("dist/ext/"));
-}
-
-
-function package_stable () {
-  let basename = String.prototype.concat("taler-wallet-stable-", 
manifest.version_name, "-", manifest.version);
-  let zipname = basename + ".zip";
-  let xpiname = basename + ".xpi";
-  return gulp.src("dist/ext/**", {buffer: false, stripBOM: false})
-             .pipe(zip(zipname))
-             .pipe(gulp.dest("dist/"));
-}
-
-function package_unstable () {
-  let basename = String.prototype.concat("taler-wallet-unstable-", 
manifest.version_name, "-",  manifest.version);
-  let zipname = basename + ".zip";
-  let xpiname = basename + ".xpi";
-  return gulp.src("dist/ext/**", {buffer: false, stripBOM: false})
-             .pipe(zip(zipname))
-             .pipe(gulp.dest("dist/"));
-}
-
-
-/**
- * Create source distribution.
- */
-function srcdist() {
-  const name = String.prototype.concat("taler-wallet-webex-", 
manifest.version_name);
-  const opts = {buffer: false, stripBOM: false, base: "."};
-  // We can't just concat patterns due to exclude patterns
-  const files = concatStreams(
-      gulp.src(paths.ts.src, opts),
-      gulp.src(paths.ts.test, opts),
-      gulp.src(paths.dist, opts),
-      gulp.src(paths.extra, opts));
-
-  return files
-      .pipe(rename(function (p) { p.dirname = name + "/" + p.dirname; }))
-      .pipe(tar(name + "-src.tar"))
-      .pipe(gzip())
-      .pipe(gulp.dest("."));
-}
-
-
-/**
- * Extract .po files from source code
- */
-gulp.task("pogen", function (cb) {
-  throw Error("not yet implemented");
-});
-
-
-/**
- * Generate a tsconfig.json with the
- * given compiler options that compiles
- * all files piped into it.
- */
-function genTSConfig(confBase) {
-  let conf = {
-    compileOnSave: true,
-    compilerOptions: {},
-    files: []
-  };
-  Object.assign(conf.compilerOptions, confBase);
-  return through.obj(function (file, enc, cb) {
-    conf.files.push(file.relative);
-    cb();
-  }, function (cb) {
-    conf.files.sort();
-    let x = JSON.stringify(conf, null, 2);
-    let f = new File({
-      path: "tsconfig.json",
-      contents: Buffer.from(x),
-    });
-    this.push(f);
-    cb();
-  });
-}
-
-
-/**
- * Get the content of a Vinyl file object as a buffer.
- */
-function readContentsBuffer(file, cb) {
-  if (file.isBuffer()) {
-    cb(file.contents);
-    return;
-  }
-  if (!file.isStream()) {
-    throw Error("file must be stream or buffer");
-  }
-  const chunks = [];
-  file.contents.on("data", function (chunk) {
-    if (!Buffer.isBuffer(chunk)) {
-      throw Error("stream data must be a buffer");
-    }
-    chunks.push(chunk);
-  });
-  file.contents.on("end", function (chunk) {
-    cb(Buffer.concat(chunks));
-  });
-  file.contents.on("error", function (err) {
-    cb(undefined, err);
-  });
-}
-
-
-/**
- * Combine multiple translations (*.po files) into
- * one JavaScript file.
- */
-function pofilesToJs(targetPath) {
-  const outStream = through();
-  const f = new File({
-    path: targetPath,
-    contents: outStream,
-  });
-  const prelude = fs.readFileSync("./src/i18n/strings-prelude");
-  outStream.write(prelude);
-  return through.obj(function (file, enc, cb) {
-    console.log("processing file", file);
-    readContentsBuffer(file, function (buf, error) {
-      console.log("got contents");
-      if (error) {
-        throw error;
-      }
-      const lang = path.basename(file.path, ".po");
-      if (!lang) {
-        throw Error();
-      }
-      console.log("lang", lang);
-      const pojson = po2json.parse(buf, {format: "jed1.x", fuzzy: true});
-      outStream.write("strings['" + lang + "'] = " + JSON.stringify(pojson, 
null, "  ") + ";\n");
-      console.log("...done");
-      cb();
-    });
-  }, function (cb) {
-    console.log("processing done");
-    outStream.end();
-    this.push(f);
-    cb();
-  });
-}
-
-
-function tsconfig() {
-  let opts = {base: "."};
-  const files = concatStreams(
-          vfs.src(paths.ts.src, opts),
-          vfs.src(paths.ts.test, opts));
-  return files.pipe(genTSConfig(tsBaseArgs))
-              .pipe(gulp.dest("."));
-}
-
-
-function po2js() {
-  return gulp.src("src/i18n/*.po", {base: "."})
-             .pipe(pofilesToJs("src/i18n/strings.ts"))
-             .pipe(gulp.dest("."));
-}
-
-
-exports.srcdist = srcdist
-exports.tsconfig = tsconfig
-exports.po2js = po2js
-exports.stable = gulp.series(tsconfig, manifest_stable, compile_prod, 
dist_prod, package_stable)
-exports.default = exports.stable
diff --git a/package.json b/package.json
index 85bc31a6..eac8d69c 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
   "scripts": {
     "build": "make tsc",
     "pretty": "prettier --config .prettierrc --write src",
-    "test": "ava"
+    "test": "ava",
+    "coverage": "nyc ava"
   },
   "files": [
     "AUTHORS",
@@ -29,52 +30,44 @@
     "src/"
   ],
   "devDependencies": {
-    "@rollup/plugin-json": "^4.0.0",
-    "@types/chrome": "^0.0.91",
-    "@types/react": "^16.4.0",
-    "@types/react-dom": "^16.0.0",
+    "@ava/typescript": "^1.1.1",
+    "@rollup/plugin-json": "^4.0.2",
+    "@rollup/plugin-replace": "^2.3.1",
+    "@types/chrome": "^0.0.103",
+    "@types/react": "^16.9.6",
+    "@types/react-dom": "^16.9.6",
+    "@typescript-eslint/eslint-plugin": "^2.26.0",
+    "@typescript-eslint/parser": "^2.26.0",
     "ava": "^3.6.0",
-    "awesome-typescript-loader": "^5.2.1",
-    "glob": "^7.1.1",
-    "gulp": "^4.0.0",
-    "gulp-gzip": "^1.2.0",
-    "gulp-json-transform": "^0.4.2",
-    "gulp-rename": "^1.2.2",
-    "gulp-tar": "^3.0.0",
-    "gulp-zip": "^5.0.0",
+    "eslint": "^6.8.0",
+    "eslint-config-airbnb-typescript": "^7.2.0",
+    "eslint-plugin-import": "^2.20.2",
+    "eslint-plugin-jsx-a11y": "^6.2.3",
+    "eslint-plugin-react": "^7.19.0",
+    "eslint-plugin-react-hooks": "^3.0.0",
     "jed": "^1.1.1",
-    "map-stream": "^0.0.7",
     "moment": "^2.18.1",
-    "nyc": "^14.1.1",
-    "po2json": "^1.0.0-alpha",
+    "nyc": "^15.0.1",
+    "po2json": "^0.4.5",
     "pogen": "^0.0.5",
-    "prettier": "^2.0.3",
-    "react": "^16.8.5",
-    "react-dom": "^16.8.5",
-    "rollup": "^1.27.8",
+    "prettier": "^2.0.4",
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
+    "rollup": "^2.3.3",
     "rollup-plugin-commonjs": "^10.1.0",
     "rollup-plugin-node-resolve": "^5.2.0",
+    "rollup-plugin-terser": "^5.3.0",
     "structured-clone": "^0.2.2",
-    "terser-webpack-plugin": "^2.2.1",
-    "through2": "3.0.1",
-    "tslint": "^5.19.0",
-    "typedoc": "^0.15.0",
-    "typescript": "^3.8.3",
-    "uglify-js": "^3.0.27",
-    "vinyl": "^2.2.0",
-    "vinyl-fs": "^3.0.3",
-    "webpack": "^4.39.3",
-    "webpack-bundle-analyzer": "^3.0.2",
-    "webpack-cli": "^3.1.0",
-    "webpack-merge": "^4.2.2"
+    "typedoc": "^0.17.4",
+    "typescript": "^3.8.3"
   },
   "dependencies": {
-    "@ava/typescript": "^1.1.1",
     "axios": "^0.19.2",
     "big-integer": "^1.6.48",
     "idb-bridge": "^0.0.15",
     "qrcode-generator": "^1.4.3",
-    "source-map-support": "^0.5.12"
+    "source-map-support": "^0.5.12",
+    "tslib": "^1.11.1"
   },
   "ava": {
     "files": [
diff --git a/rollup.config.js b/rollup.config.js
index cfe0a4b8..e88ad5ce 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -1,56 +1,192 @@
 // rollup.config.js
-import commonjs from 'rollup-plugin-commonjs';
-import nodeResolve from 'rollup-plugin-node-resolve';
-import json from '@rollup/plugin-json';
-import builtins from 'builtin-modules'
+import commonjs from "rollup-plugin-commonjs";
+import nodeResolve from "rollup-plugin-node-resolve";
+import json from "@rollup/plugin-json";
+import replace from "@rollup/plugin-replace";
+import builtins from "builtin-modules";
+import { terser } from "rollup-plugin-terser";
 
 const walletCli = {
-  input: 'dist/node/headless/taler-wallet-cli.js',
+  input: "dist/node/headless/taler-wallet-cli.js",
   output: {
-    file: 'dist/standalone/taler-wallet-cli.js',
-    format: 'cjs'
+    file: "dist/standalone/taler-wallet-cli.js",
+    format: "cjs",
   },
   external: builtins,
   plugins: [
+    commonjs({
+      include: ["node_modules/**", "src/**"],
+      extensions: [".js", ".ts"],
+      ignoreGlobal: false, // Default: false
+      sourceMap: false,
+      ignore: ["taler-wallet"],
+    }),
     nodeResolve({
       preferBuiltins: true,
     }),
+
+    json(),
+  ],
+};
+
+const walletAndroid = {
+  input: "dist/node/android/index.js",
+  output: {
+    file: "dist/standalone/taler-wallet-android.js",
+    format: "cjs",
+    exports: "named",
+  },
+  external: builtins,
+  plugins: [
+    json(),
+
+    nodeResolve({
+      preferBuiltins: true,
+    }),
+
     commonjs({
-      include: ['node_modules/**', 'dist/node/**'],
-      extensions: [ '.js' ],
-      ignoreGlobal: false,  // Default: false
+      include: ["node_modules/**", "dist/node/**"],
+      extensions: [".js"],
+      ignoreGlobal: false, // Default: false
       sourceMap: false,
-      ignore: [ 'taler-wallet' ]
+      ignore: ["taler-wallet"],
     }),
+  ],
+};
 
+const webExtensionPageEntryPoint = {
+  input: "dist/node/webex/pageEntryPoint.js",
+  output: {
+    file: "dist/webextension/pageEntryPoint.js",
+    format: "iife",
+    exports: "default",
+    name: "webExtensionPageEntry",
+  },
+  external: builtins,
+  plugins: [
     json(),
 
-  ]
+    nodeResolve({
+      preferBuiltins: true,
+    }),
+
+    terser(),
+
+    replace({
+      "process.env.NODE_ENV": JSON.stringify("production"),
+    }),
+
+    commonjs({
+      include: ["node_modules/**", "dist/node/**"],
+      extensions: [".js"],
+      ignoreGlobal: false, // Default: false
+      sourceMap: false,
+      ignore: ["taler-wallet"],
+    }),
+  ],
 };
 
-const walletAndroid = {
-  input: 'dist/node/android/index.js',
+const webExtensionBackgroundPageScript = {
+  input: "dist/node/webex/background.js",
   output: {
-    file: 'dist/standalone/taler-wallet-android.js',
-    format: 'cjs',
-    exports: 'named',
+    file: "dist/webextension/background.js",
+    format: "iife",
+    exports: "default",
+    name: "webExtensionBackgroundScript",
   },
   external: builtins,
   plugins: [
     json(),
 
     nodeResolve({
-      preferBuiltins: true
+      preferBuiltins: true,
+    }),
+
+    terser(),
+
+    replace({
+      "process.env.NODE_ENV": JSON.stringify("production"),
     }),
 
     commonjs({
-      include: ['node_modules/**', 'dist/node/**'],
-      extensions: [ '.js' ],
-      ignoreGlobal: false,  // Default: false
+      include: ["node_modules/**", "dist/node/**"],
+      extensions: [".js"],
+      ignoreGlobal: false, // Default: false
       sourceMap: false,
-      ignore: [ 'taler-wallet' ]
-    })
-  ]
+      ignore: ["taler-wallet", "crypto"],
+    }),
+  ],
+};
+
+const webExtensionCryptoWorker = {
+  input: "dist/node/crypto/workers/browserWorkerEntry.js",
+  output: {
+    file: "dist/webextension/browserWorkerEntry.js",
+    format: "iife",
+    exports: "default",
+    name: "webExtensionCryptoWorker",
+  },
+  external: builtins,
+  plugins: [
+    json(),
+
+    nodeResolve({
+      preferBuiltins: true,
+    }),
+
+    terser(),
+
+    replace({
+      "process.env.NODE_ENV": JSON.stringify("production"),
+    }),
+
+    commonjs({
+      include: ["node_modules/**", "dist/node/**"],
+      extensions: [".js"],
+      ignoreGlobal: false, // Default: false
+      sourceMap: false,
+      ignore: ["taler-wallet", "crypto"],
+    }),
+  ],
+};
+
+const webExtensionContentScript = {
+  input: "dist/node/webex/notify.js",
+  output: {
+    file: "dist/webextension/contentScript.js",
+    format: "iife",
+    exports: "default",
+    name: "webExtensionContentScript",
+  },
+  external: builtins,
+  plugins: [
+    json(),
+
+    nodeResolve({
+      preferBuiltins: true,
+    }),
+
+    terser(),
+
+    replace({
+      "process.env.NODE_ENV": JSON.stringify("production"),
+    }),
+
+    commonjs({
+      include: ["node_modules/**", "dist/node/**"],
+      extensions: [".js"],
+      ignoreGlobal: false, // Default: false
+      sourceMap: false,
+      ignore: ["taler-wallet"],
+    }),
+  ],
 };
 
-export default [walletCli, walletAndroid];
+export default [
+  walletCli,
+  walletAndroid,
+  webExtensionPageEntryPoint,
+  webExtensionBackgroundPageScript,
+  webExtensionCryptoWorker,
+  webExtensionContentScript,
+];
diff --git a/src/android/index.ts b/src/android/index.ts
index a42b55a2..019fe1fb 100644
--- a/src/android/index.ts
+++ b/src/android/index.ts
@@ -24,7 +24,7 @@ import {
   DefaultNodeWalletArgs,
 } from "../headless/helpers";
 import { openPromise, OpenedPromise } from "../util/promiseUtils";
-import fs = require("fs");
+import fs from "fs";
 import {
   HttpRequestLibrary,
   HttpResponse,
@@ -32,7 +32,6 @@ import {
   Headers,
 } from "../util/http";
 import { NodeHttpLib } from "../headless/NodeHttpLib";
-import { OperationFailedAndReportedError } from "../operations/errors";
 import { WalletNotification } from "../types/notifications";
 
 // @ts-ignore: special built-in module
@@ -44,7 +43,7 @@ export {
 } from "../crypto/workers/nodeThreadWorker";
 
 export class AndroidHttpLib implements HttpRequestLibrary {
-  useNfcTunnel: boolean = false;
+  useNfcTunnel = false;
 
   private nodeHttpLib: HttpRequestLibrary = new NodeHttpLib();
 
@@ -99,7 +98,7 @@ export class AndroidHttpLib implements HttpRequestLibrary {
     }
   }
 
-  handleTunnelResponse(msg: any) {
+  handleTunnelResponse(msg: any): void {
     const myId = msg.id;
     const p = this.requestMap[myId];
     if (!p) {
@@ -123,7 +122,7 @@ export class AndroidHttpLib implements HttpRequestLibrary {
   }
 }
 
-function sendAkonoMessage(m: string) {
+function sendAkonoMessage(m: string): void {
   // @ts-ignore
   globalThis.__akono_sendMessage(m);
 }
@@ -266,7 +265,7 @@ class AndroidWalletMessageHandler {
   }
 }
 
-export function installAndroidWalletListener() {
+export function installAndroidWalletListener(): void {
   // @ts-ignore
   const sendMessage: (m: string) => void = globalThis.__akono_sendMessage;
   if (typeof sendMessage !== "function") {
@@ -276,7 +275,7 @@ export function installAndroidWalletListener() {
     throw new Error(errMsg);
   }
   const handler = new AndroidWalletMessageHandler();
-  const onMessage = async (msgStr: any) => {
+  const onMessage = async (msgStr: any): Promise<void> => {
     if (typeof msgStr !== "string") {
       console.error("expected string as message");
       return;
diff --git a/src/crypto/primitives/kdf.ts b/src/crypto/primitives/kdf.ts
index e1baed40..edc681bc 100644
--- a/src/crypto/primitives/kdf.ts
+++ b/src/crypto/primitives/kdf.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import nacl = require("./nacl-fast");
+import * as nacl from "./nacl-fast";
 import { sha256 } from "./sha256";
 
 export function sha512(data: Uint8Array): Uint8Array {
@@ -51,11 +51,11 @@ export function hmac(
   return digest(b2);
 }
 
-export function hmacSha512(key: Uint8Array, message: Uint8Array) {
+export function hmacSha512(key: Uint8Array, message: Uint8Array): Uint8Array {
   return hmac(sha512, 128, key, message);
 }
 
-export function hmacSha256(key: Uint8Array, message: Uint8Array) {
+export function hmacSha256(key: Uint8Array, message: Uint8Array): Uint8Array {
   return hmac(sha256, 64, key, message);
 }
 
diff --git a/src/crypto/primitives/nacl-fast.ts 
b/src/crypto/primitives/nacl-fast.ts
index 14cf569d..8d4aaeb6 100644
--- a/src/crypto/primitives/nacl-fast.ts
+++ b/src/crypto/primitives/nacl-fast.ts
@@ -5,7 +5,7 @@
 // Implementation derived from TweetNaCl version 20140427.
 // See for details: http://tweetnacl.cr.yp.to/
 
-const gf = function (init: number[] = []) {
+const gf = function (init: number[] = []): Float64Array {
   const r = new Float64Array(16);
   if (init) for (let i = 0; i < init.length; i++) r[i] = init[i];
   return r;
@@ -16,7 +16,6 @@ let randombytes = function (x: Uint8Array, n: number): void {
   throw new Error("no PRNG");
 };
 
-const _0 = new Uint8Array(16);
 const _9 = new Uint8Array(32);
 _9[0] = 9;
 
@@ -115,7 +114,7 @@ const I = gf([
   0x2b83,
 ]);
 
-function ts64(x: Uint8Array, i: number, h: number, l: number) {
+function ts64(x: Uint8Array, i: number, h: number, l: number): void {
   x[i] = (h >> 24) & 0xff;
   x[i + 1] = (h >> 16) & 0xff;
   x[i + 2] = (h >> 8) & 0xff;
@@ -126,20 +125,17 @@ function ts64(x: Uint8Array, i: number, h: number, l: 
number) {
   x[i + 7] = l & 0xff;
 }
 
-function vn(x: Uint8Array, xi: number, y: Uint8Array, yi: number, n: number) {
-  var i,
-    d = 0;
-  for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i];
-  return (1 & ((d - 1) >>> 8)) - 1;
-}
-
-function crypto_verify_16(
+function vn(
   x: Uint8Array,
   xi: number,
   y: Uint8Array,
   yi: number,
-) {
-  return vn(x, xi, y, yi, 16);
+  n: number,
+): number {
+  let i,
+    d = 0;
+  for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i];
+  return (1 & ((d - 1) >>> 8)) - 1;
 }
 
 function crypto_verify_32(
@@ -147,1015 +143,17 @@ function crypto_verify_32(
   xi: number,
   y: Uint8Array,
   yi: number,
-) {
+): number {
   return vn(x, xi, y, yi, 32);
 }
 
-// prettier-ignore
-function core_salsa20(o: Uint8Array, p: Uint8Array, k: Uint8Array, c: 
Uint8Array) {
-  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 
0xff)<<24,
-      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 
0xff)<<24,
-      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 
0xff)<<24,
-      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 
0xff)<<24,
-      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 
0xff)<<24,
-      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 
0xff)<<24,
-      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 
0xff)<<24,
-      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 
0xff)<<24,
-      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 
0xff)<<24,
-      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 
0xff)<<24,
-      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 
0xff)<<24,
-      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 
0xff)<<24,
-      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 
0xff)<<24,
-      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 
0xff)<<24,
-      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 
0xff)<<24,
-      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 
0xff)<<24;
-
-  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
-      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
-      x15 = j15, u;
-
-  for (var i = 0; i < 20; i += 2) {
-    u = x0 + x12 | 0;
-    x4 ^= u<<7 | u>>>(32-7);
-    u = x4 + x0 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x4 | 0;
-    x12 ^= u<<13 | u>>>(32-13);
-    u = x12 + x8 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x1 | 0;
-    x9 ^= u<<7 | u>>>(32-7);
-    u = x9 + x5 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x9 | 0;
-    x1 ^= u<<13 | u>>>(32-13);
-    u = x1 + x13 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x6 | 0;
-    x14 ^= u<<7 | u>>>(32-7);
-    u = x14 + x10 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x14 | 0;
-    x6 ^= u<<13 | u>>>(32-13);
-    u = x6 + x2 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x11 | 0;
-    x3 ^= u<<7 | u>>>(32-7);
-    u = x3 + x15 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x3 | 0;
-    x11 ^= u<<13 | u>>>(32-13);
-    u = x11 + x7 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-
-    u = x0 + x3 | 0;
-    x1 ^= u<<7 | u>>>(32-7);
-    u = x1 + x0 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x1 | 0;
-    x3 ^= u<<13 | u>>>(32-13);
-    u = x3 + x2 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x4 | 0;
-    x6 ^= u<<7 | u>>>(32-7);
-    u = x6 + x5 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x6 | 0;
-    x4 ^= u<<13 | u>>>(32-13);
-    u = x4 + x7 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x9 | 0;
-    x11 ^= u<<7 | u>>>(32-7);
-    u = x11 + x10 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x11 | 0;
-    x9 ^= u<<13 | u>>>(32-13);
-    u = x9 + x8 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x14 | 0;
-    x12 ^= u<<7 | u>>>(32-7);
-    u = x12 + x15 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x12 | 0;
-    x14 ^= u<<13 | u>>>(32-13);
-    u = x14 + x13 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-  }
-   x0 =  x0 +  j0 | 0;
-   x1 =  x1 +  j1 | 0;
-   x2 =  x2 +  j2 | 0;
-   x3 =  x3 +  j3 | 0;
-   x4 =  x4 +  j4 | 0;
-   x5 =  x5 +  j5 | 0;
-   x6 =  x6 +  j6 | 0;
-   x7 =  x7 +  j7 | 0;
-   x8 =  x8 +  j8 | 0;
-   x9 =  x9 +  j9 | 0;
-  x10 = x10 + j10 | 0;
-  x11 = x11 + j11 | 0;
-  x12 = x12 + j12 | 0;
-  x13 = x13 + j13 | 0;
-  x14 = x14 + j14 | 0;
-  x15 = x15 + j15 | 0;
-
-  o[ 0] = x0 >>>  0 & 0xff;
-  o[ 1] = x0 >>>  8 & 0xff;
-  o[ 2] = x0 >>> 16 & 0xff;
-  o[ 3] = x0 >>> 24 & 0xff;
-
-  o[ 4] = x1 >>>  0 & 0xff;
-  o[ 5] = x1 >>>  8 & 0xff;
-  o[ 6] = x1 >>> 16 & 0xff;
-  o[ 7] = x1 >>> 24 & 0xff;
-
-  o[ 8] = x2 >>>  0 & 0xff;
-  o[ 9] = x2 >>>  8 & 0xff;
-  o[10] = x2 >>> 16 & 0xff;
-  o[11] = x2 >>> 24 & 0xff;
-
-  o[12] = x3 >>>  0 & 0xff;
-  o[13] = x3 >>>  8 & 0xff;
-  o[14] = x3 >>> 16 & 0xff;
-  o[15] = x3 >>> 24 & 0xff;
-
-  o[16] = x4 >>>  0 & 0xff;
-  o[17] = x4 >>>  8 & 0xff;
-  o[18] = x4 >>> 16 & 0xff;
-  o[19] = x4 >>> 24 & 0xff;
-
-  o[20] = x5 >>>  0 & 0xff;
-  o[21] = x5 >>>  8 & 0xff;
-  o[22] = x5 >>> 16 & 0xff;
-  o[23] = x5 >>> 24 & 0xff;
-
-  o[24] = x6 >>>  0 & 0xff;
-  o[25] = x6 >>>  8 & 0xff;
-  o[26] = x6 >>> 16 & 0xff;
-  o[27] = x6 >>> 24 & 0xff;
-
-  o[28] = x7 >>>  0 & 0xff;
-  o[29] = x7 >>>  8 & 0xff;
-  o[30] = x7 >>> 16 & 0xff;
-  o[31] = x7 >>> 24 & 0xff;
-
-  o[32] = x8 >>>  0 & 0xff;
-  o[33] = x8 >>>  8 & 0xff;
-  o[34] = x8 >>> 16 & 0xff;
-  o[35] = x8 >>> 24 & 0xff;
-
-  o[36] = x9 >>>  0 & 0xff;
-  o[37] = x9 >>>  8 & 0xff;
-  o[38] = x9 >>> 16 & 0xff;
-  o[39] = x9 >>> 24 & 0xff;
-
-  o[40] = x10 >>>  0 & 0xff;
-  o[41] = x10 >>>  8 & 0xff;
-  o[42] = x10 >>> 16 & 0xff;
-  o[43] = x10 >>> 24 & 0xff;
-
-  o[44] = x11 >>>  0 & 0xff;
-  o[45] = x11 >>>  8 & 0xff;
-  o[46] = x11 >>> 16 & 0xff;
-  o[47] = x11 >>> 24 & 0xff;
-
-  o[48] = x12 >>>  0 & 0xff;
-  o[49] = x12 >>>  8 & 0xff;
-  o[50] = x12 >>> 16 & 0xff;
-  o[51] = x12 >>> 24 & 0xff;
-
-  o[52] = x13 >>>  0 & 0xff;
-  o[53] = x13 >>>  8 & 0xff;
-  o[54] = x13 >>> 16 & 0xff;
-  o[55] = x13 >>> 24 & 0xff;
-
-  o[56] = x14 >>>  0 & 0xff;
-  o[57] = x14 >>>  8 & 0xff;
-  o[58] = x14 >>> 16 & 0xff;
-  o[59] = x14 >>> 24 & 0xff;
-
-  o[60] = x15 >>>  0 & 0xff;
-  o[61] = x15 >>>  8 & 0xff;
-  o[62] = x15 >>> 16 & 0xff;
-  o[63] = x15 >>> 24 & 0xff;
-}
-
-function core_hsalsa20(
-  o: Uint8Array,
-  p: Uint8Array,
-  k: Uint8Array,
-  c: Uint8Array,
-) {
-  var j0 =
-      (c[0] & 0xff) |
-      ((c[1] & 0xff) << 8) |
-      ((c[2] & 0xff) << 16) |
-      ((c[3] & 0xff) << 24),
-    j1 =
-      (k[0] & 0xff) |
-      ((k[1] & 0xff) << 8) |
-      ((k[2] & 0xff) << 16) |
-      ((k[3] & 0xff) << 24),
-    j2 =
-      (k[4] & 0xff) |
-      ((k[5] & 0xff) << 8) |
-      ((k[6] & 0xff) << 16) |
-      ((k[7] & 0xff) << 24),
-    j3 =
-      (k[8] & 0xff) |
-      ((k[9] & 0xff) << 8) |
-      ((k[10] & 0xff) << 16) |
-      ((k[11] & 0xff) << 24),
-    j4 =
-      (k[12] & 0xff) |
-      ((k[13] & 0xff) << 8) |
-      ((k[14] & 0xff) << 16) |
-      ((k[15] & 0xff) << 24),
-    j5 =
-      (c[4] & 0xff) |
-      ((c[5] & 0xff) << 8) |
-      ((c[6] & 0xff) << 16) |
-      ((c[7] & 0xff) << 24),
-    j6 =
-      (p[0] & 0xff) |
-      ((p[1] & 0xff) << 8) |
-      ((p[2] & 0xff) << 16) |
-      ((p[3] & 0xff) << 24),
-    j7 =
-      (p[4] & 0xff) |
-      ((p[5] & 0xff) << 8) |
-      ((p[6] & 0xff) << 16) |
-      ((p[7] & 0xff) << 24),
-    j8 =
-      (p[8] & 0xff) |
-      ((p[9] & 0xff) << 8) |
-      ((p[10] & 0xff) << 16) |
-      ((p[11] & 0xff) << 24),
-    j9 =
-      (p[12] & 0xff) |
-      ((p[13] & 0xff) << 8) |
-      ((p[14] & 0xff) << 16) |
-      ((p[15] & 0xff) << 24),
-    j10 =
-      (c[8] & 0xff) |
-      ((c[9] & 0xff) << 8) |
-      ((c[10] & 0xff) << 16) |
-      ((c[11] & 0xff) << 24),
-    j11 =
-      (k[16] & 0xff) |
-      ((k[17] & 0xff) << 8) |
-      ((k[18] & 0xff) << 16) |
-      ((k[19] & 0xff) << 24),
-    j12 =
-      (k[20] & 0xff) |
-      ((k[21] & 0xff) << 8) |
-      ((k[22] & 0xff) << 16) |
-      ((k[23] & 0xff) << 24),
-    j13 =
-      (k[24] & 0xff) |
-      ((k[25] & 0xff) << 8) |
-      ((k[26] & 0xff) << 16) |
-      ((k[27] & 0xff) << 24),
-    j14 =
-      (k[28] & 0xff) |
-      ((k[29] & 0xff) << 8) |
-      ((k[30] & 0xff) << 16) |
-      ((k[31] & 0xff) << 24),
-    j15 =
-      (c[12] & 0xff) |
-      ((c[13] & 0xff) << 8) |
-      ((c[14] & 0xff) << 16) |
-      ((c[15] & 0xff) << 24);
-
-  var x0 = j0,
-    x1 = j1,
-    x2 = j2,
-    x3 = j3,
-    x4 = j4,
-    x5 = j5,
-    x6 = j6,
-    x7 = j7,
-    x8 = j8,
-    x9 = j9,
-    x10 = j10,
-    x11 = j11,
-    x12 = j12,
-    x13 = j13,
-    x14 = j14,
-    x15 = j15,
-    u;
-
-  for (var i = 0; i < 20; i += 2) {
-    u = (x0 + x12) | 0;
-    x4 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x4 + x0) | 0;
-    x8 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x8 + x4) | 0;
-    x12 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x12 + x8) | 0;
-    x0 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x5 + x1) | 0;
-    x9 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x9 + x5) | 0;
-    x13 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x13 + x9) | 0;
-    x1 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x1 + x13) | 0;
-    x5 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x10 + x6) | 0;
-    x14 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x14 + x10) | 0;
-    x2 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x2 + x14) | 0;
-    x6 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x6 + x2) | 0;
-    x10 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x15 + x11) | 0;
-    x3 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x3 + x15) | 0;
-    x7 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x7 + x3) | 0;
-    x11 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x11 + x7) | 0;
-    x15 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x0 + x3) | 0;
-    x1 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x1 + x0) | 0;
-    x2 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x2 + x1) | 0;
-    x3 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x3 + x2) | 0;
-    x0 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x5 + x4) | 0;
-    x6 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x6 + x5) | 0;
-    x7 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x7 + x6) | 0;
-    x4 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x4 + x7) | 0;
-    x5 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x10 + x9) | 0;
-    x11 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x11 + x10) | 0;
-    x8 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x8 + x11) | 0;
-    x9 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x9 + x8) | 0;
-    x10 ^= (u << 18) | (u >>> (32 - 18));
-
-    u = (x15 + x14) | 0;
-    x12 ^= (u << 7) | (u >>> (32 - 7));
-    u = (x12 + x15) | 0;
-    x13 ^= (u << 9) | (u >>> (32 - 9));
-    u = (x13 + x12) | 0;
-    x14 ^= (u << 13) | (u >>> (32 - 13));
-    u = (x14 + x13) | 0;
-    x15 ^= (u << 18) | (u >>> (32 - 18));
-  }
-
-  o[0] = (x0 >>> 0) & 0xff;
-  o[1] = (x0 >>> 8) & 0xff;
-  o[2] = (x0 >>> 16) & 0xff;
-  o[3] = (x0 >>> 24) & 0xff;
-
-  o[4] = (x5 >>> 0) & 0xff;
-  o[5] = (x5 >>> 8) & 0xff;
-  o[6] = (x5 >>> 16) & 0xff;
-  o[7] = (x5 >>> 24) & 0xff;
-
-  o[8] = (x10 >>> 0) & 0xff;
-  o[9] = (x10 >>> 8) & 0xff;
-  o[10] = (x10 >>> 16) & 0xff;
-  o[11] = (x10 >>> 24) & 0xff;
-
-  o[12] = (x15 >>> 0) & 0xff;
-  o[13] = (x15 >>> 8) & 0xff;
-  o[14] = (x15 >>> 16) & 0xff;
-  o[15] = (x15 >>> 24) & 0xff;
-
-  o[16] = (x6 >>> 0) & 0xff;
-  o[17] = (x6 >>> 8) & 0xff;
-  o[18] = (x6 >>> 16) & 0xff;
-  o[19] = (x6 >>> 24) & 0xff;
-
-  o[20] = (x7 >>> 0) & 0xff;
-  o[21] = (x7 >>> 8) & 0xff;
-  o[22] = (x7 >>> 16) & 0xff;
-  o[23] = (x7 >>> 24) & 0xff;
-
-  o[24] = (x8 >>> 0) & 0xff;
-  o[25] = (x8 >>> 8) & 0xff;
-  o[26] = (x8 >>> 16) & 0xff;
-  o[27] = (x8 >>> 24) & 0xff;
-
-  o[28] = (x9 >>> 0) & 0xff;
-  o[29] = (x9 >>> 8) & 0xff;
-  o[30] = (x9 >>> 16) & 0xff;
-  o[31] = (x9 >>> 24) & 0xff;
-}
-
-function crypto_core_salsa20(
-  out: Uint8Array,
-  inp: Uint8Array,
-  k: Uint8Array,
-  c: Uint8Array,
-) {
-  core_salsa20(out, inp, k, c);
-}
-
-function crypto_core_hsalsa20(
-  out: Uint8Array,
-  inp: Uint8Array,
-  k: Uint8Array,
-  c: Uint8Array,
-) {
-  core_hsalsa20(out, inp, k, c);
-}
-
-var sigma = new Uint8Array([
-  101,
-  120,
-  112,
-  97,
-  110,
-  100,
-  32,
-  51,
-  50,
-  45,
-  98,
-  121,
-  116,
-  101,
-  32,
-  107,
-]);
-// "expand 32-byte k"
-
-function crypto_stream_salsa20_xor(
-  c: Uint8Array,
-  cpos: number,
-  m: Uint8Array,
-  mpos: number,
-  b: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var z = new Uint8Array(16),
-    x = new Uint8Array(64);
-  var u, i;
-  for (i = 0; i < 16; i++) z[i] = 0;
-  for (i = 0; i < 8; i++) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x, z, k, sigma);
-    for (i = 0; i < 64; i++) c[cpos + i] = m[mpos + i] ^ x[i];
-    u = 1;
-    for (i = 8; i < 16; i++) {
-      u = (u + (z[i] & 0xff)) | 0;
-      z[i] = u & 0xff;
-      u >>>= 8;
-    }
-    b -= 64;
-    cpos += 64;
-    mpos += 64;
-  }
-  if (b > 0) {
-    crypto_core_salsa20(x, z, k, sigma);
-    for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i];
-  }
-  return 0;
-}
-
-function crypto_stream_salsa20(
-  c: Uint8Array,
-  cpos: number,
-  b: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var z = new Uint8Array(16),
-    x = new Uint8Array(64);
-  var u, i;
-  for (i = 0; i < 16; i++) z[i] = 0;
-  for (i = 0; i < 8; i++) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x, z, k, sigma);
-    for (i = 0; i < 64; i++) c[cpos + i] = x[i];
-    u = 1;
-    for (i = 8; i < 16; i++) {
-      u = (u + (z[i] & 0xff)) | 0;
-      z[i] = u & 0xff;
-      u >>>= 8;
-    }
-    b -= 64;
-    cpos += 64;
-  }
-  if (b > 0) {
-    crypto_core_salsa20(x, z, k, sigma);
-    for (i = 0; i < b; i++) c[cpos + i] = x[i];
-  }
-  return 0;
-}
-
-function crypto_stream(
-  c: Uint8Array,
-  cpos: number,
-  d: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s, n, k, sigma);
-  var sn = new Uint8Array(8);
-  for (var i = 0; i < 8; i++) sn[i] = n[i + 16];
-  return crypto_stream_salsa20(c, cpos, d, sn, s);
-}
-
-function crypto_stream_xor(
-  c: Uint8Array,
-  cpos: number,
-  m: Uint8Array,
-  mpos: number,
-  d: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s, n, k, sigma);
-  var sn = new Uint8Array(8);
-  for (var i = 0; i < 8; i++) sn[i] = n[i + 16];
-  return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s);
-}
-
-/*
- * Port of Andrew Moon's Poly1305-donna-16. Public domain.
- * https://github.com/floodyberry/poly1305-donna
- */
-
-class poly1305 {
-  buffer = new Uint8Array(16);
-  r = new Uint16Array(10);
-  h = new Uint16Array(10);
-  pad = new Uint16Array(8);
-  leftover = 0;
-  fin = 0;
-
-  constructor(key: Uint8Array) {
-    var t0, t1, t2, t3, t4, t5, t6, t7;
-
-    t0 = (key[0] & 0xff) | ((key[1] & 0xff) << 8);
-    this.r[0] = t0 & 0x1fff;
-    t1 = (key[2] & 0xff) | ((key[3] & 0xff) << 8);
-    this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;
-    t2 = (key[4] & 0xff) | ((key[5] & 0xff) << 8);
-    this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;
-    t3 = (key[6] & 0xff) | ((key[7] & 0xff) << 8);
-    this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;
-    t4 = (key[8] & 0xff) | ((key[9] & 0xff) << 8);
-    this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;
-    this.r[5] = (t4 >>> 1) & 0x1ffe;
-    t5 = (key[10] & 0xff) | ((key[11] & 0xff) << 8);
-    this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;
-    t6 = (key[12] & 0xff) | ((key[13] & 0xff) << 8);
-    this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;
-    t7 = (key[14] & 0xff) | ((key[15] & 0xff) << 8);
-    this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;
-    this.r[9] = (t7 >>> 5) & 0x007f;
-
-    this.pad[0] = (key[16] & 0xff) | ((key[17] & 0xff) << 8);
-    this.pad[1] = (key[18] & 0xff) | ((key[19] & 0xff) << 8);
-    this.pad[2] = (key[20] & 0xff) | ((key[21] & 0xff) << 8);
-    this.pad[3] = (key[22] & 0xff) | ((key[23] & 0xff) << 8);
-    this.pad[4] = (key[24] & 0xff) | ((key[25] & 0xff) << 8);
-    this.pad[5] = (key[26] & 0xff) | ((key[27] & 0xff) << 8);
-    this.pad[6] = (key[28] & 0xff) | ((key[29] & 0xff) << 8);
-    this.pad[7] = (key[30] & 0xff) | ((key[31] & 0xff) << 8);
-  }
-
-  blocks(m: Uint8Array, mpos: number, bytes: number) {
-    var hibit = this.fin ? 0 : 1 << 11;
-    var t0, t1, t2, t3, t4, t5, t6, t7, c;
-    var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;
-
-    var h0 = this.h[0],
-      h1 = this.h[1],
-      h2 = this.h[2],
-      h3 = this.h[3],
-      h4 = this.h[4],
-      h5 = this.h[5],
-      h6 = this.h[6],
-      h7 = this.h[7],
-      h8 = this.h[8],
-      h9 = this.h[9];
-
-    var r0 = this.r[0],
-      r1 = this.r[1],
-      r2 = this.r[2],
-      r3 = this.r[3],
-      r4 = this.r[4],
-      r5 = this.r[5],
-      r6 = this.r[6],
-      r7 = this.r[7],
-      r8 = this.r[8],
-      r9 = this.r[9];
-
-    while (bytes >= 16) {
-      t0 = (m[mpos + 0] & 0xff) | ((m[mpos + 1] & 0xff) << 8);
-      h0 += t0 & 0x1fff;
-      t1 = (m[mpos + 2] & 0xff) | ((m[mpos + 3] & 0xff) << 8);
-      h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;
-      t2 = (m[mpos + 4] & 0xff) | ((m[mpos + 5] & 0xff) << 8);
-      h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;
-      t3 = (m[mpos + 6] & 0xff) | ((m[mpos + 7] & 0xff) << 8);
-      h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;
-      t4 = (m[mpos + 8] & 0xff) | ((m[mpos + 9] & 0xff) << 8);
-      h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;
-      h5 += (t4 >>> 1) & 0x1fff;
-      t5 = (m[mpos + 10] & 0xff) | ((m[mpos + 11] & 0xff) << 8);
-      h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;
-      t6 = (m[mpos + 12] & 0xff) | ((m[mpos + 13] & 0xff) << 8);
-      h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;
-      t7 = (m[mpos + 14] & 0xff) | ((m[mpos + 15] & 0xff) << 8);
-      h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;
-      h9 += (t7 >>> 5) | hibit;
-
-      c = 0;
-
-      d0 = c;
-      d0 += h0 * r0;
-      d0 += h1 * (5 * r9);
-      d0 += h2 * (5 * r8);
-      d0 += h3 * (5 * r7);
-      d0 += h4 * (5 * r6);
-      c = d0 >>> 13;
-      d0 &= 0x1fff;
-      d0 += h5 * (5 * r5);
-      d0 += h6 * (5 * r4);
-      d0 += h7 * (5 * r3);
-      d0 += h8 * (5 * r2);
-      d0 += h9 * (5 * r1);
-      c += d0 >>> 13;
-      d0 &= 0x1fff;
-
-      d1 = c;
-      d1 += h0 * r1;
-      d1 += h1 * r0;
-      d1 += h2 * (5 * r9);
-      d1 += h3 * (5 * r8);
-      d1 += h4 * (5 * r7);
-      c = d1 >>> 13;
-      d1 &= 0x1fff;
-      d1 += h5 * (5 * r6);
-      d1 += h6 * (5 * r5);
-      d1 += h7 * (5 * r4);
-      d1 += h8 * (5 * r3);
-      d1 += h9 * (5 * r2);
-      c += d1 >>> 13;
-      d1 &= 0x1fff;
-
-      d2 = c;
-      d2 += h0 * r2;
-      d2 += h1 * r1;
-      d2 += h2 * r0;
-      d2 += h3 * (5 * r9);
-      d2 += h4 * (5 * r8);
-      c = d2 >>> 13;
-      d2 &= 0x1fff;
-      d2 += h5 * (5 * r7);
-      d2 += h6 * (5 * r6);
-      d2 += h7 * (5 * r5);
-      d2 += h8 * (5 * r4);
-      d2 += h9 * (5 * r3);
-      c += d2 >>> 13;
-      d2 &= 0x1fff;
-
-      d3 = c;
-      d3 += h0 * r3;
-      d3 += h1 * r2;
-      d3 += h2 * r1;
-      d3 += h3 * r0;
-      d3 += h4 * (5 * r9);
-      c = d3 >>> 13;
-      d3 &= 0x1fff;
-      d3 += h5 * (5 * r8);
-      d3 += h6 * (5 * r7);
-      d3 += h7 * (5 * r6);
-      d3 += h8 * (5 * r5);
-      d3 += h9 * (5 * r4);
-      c += d3 >>> 13;
-      d3 &= 0x1fff;
-
-      d4 = c;
-      d4 += h0 * r4;
-      d4 += h1 * r3;
-      d4 += h2 * r2;
-      d4 += h3 * r1;
-      d4 += h4 * r0;
-      c = d4 >>> 13;
-      d4 &= 0x1fff;
-      d4 += h5 * (5 * r9);
-      d4 += h6 * (5 * r8);
-      d4 += h7 * (5 * r7);
-      d4 += h8 * (5 * r6);
-      d4 += h9 * (5 * r5);
-      c += d4 >>> 13;
-      d4 &= 0x1fff;
-
-      d5 = c;
-      d5 += h0 * r5;
-      d5 += h1 * r4;
-      d5 += h2 * r3;
-      d5 += h3 * r2;
-      d5 += h4 * r1;
-      c = d5 >>> 13;
-      d5 &= 0x1fff;
-      d5 += h5 * r0;
-      d5 += h6 * (5 * r9);
-      d5 += h7 * (5 * r8);
-      d5 += h8 * (5 * r7);
-      d5 += h9 * (5 * r6);
-      c += d5 >>> 13;
-      d5 &= 0x1fff;
-
-      d6 = c;
-      d6 += h0 * r6;
-      d6 += h1 * r5;
-      d6 += h2 * r4;
-      d6 += h3 * r3;
-      d6 += h4 * r2;
-      c = d6 >>> 13;
-      d6 &= 0x1fff;
-      d6 += h5 * r1;
-      d6 += h6 * r0;
-      d6 += h7 * (5 * r9);
-      d6 += h8 * (5 * r8);
-      d6 += h9 * (5 * r7);
-      c += d6 >>> 13;
-      d6 &= 0x1fff;
-
-      d7 = c;
-      d7 += h0 * r7;
-      d7 += h1 * r6;
-      d7 += h2 * r5;
-      d7 += h3 * r4;
-      d7 += h4 * r3;
-      c = d7 >>> 13;
-      d7 &= 0x1fff;
-      d7 += h5 * r2;
-      d7 += h6 * r1;
-      d7 += h7 * r0;
-      d7 += h8 * (5 * r9);
-      d7 += h9 * (5 * r8);
-      c += d7 >>> 13;
-      d7 &= 0x1fff;
-
-      d8 = c;
-      d8 += h0 * r8;
-      d8 += h1 * r7;
-      d8 += h2 * r6;
-      d8 += h3 * r5;
-      d8 += h4 * r4;
-      c = d8 >>> 13;
-      d8 &= 0x1fff;
-      d8 += h5 * r3;
-      d8 += h6 * r2;
-      d8 += h7 * r1;
-      d8 += h8 * r0;
-      d8 += h9 * (5 * r9);
-      c += d8 >>> 13;
-      d8 &= 0x1fff;
-
-      d9 = c;
-      d9 += h0 * r9;
-      d9 += h1 * r8;
-      d9 += h2 * r7;
-      d9 += h3 * r6;
-      d9 += h4 * r5;
-      c = d9 >>> 13;
-      d9 &= 0x1fff;
-      d9 += h5 * r4;
-      d9 += h6 * r3;
-      d9 += h7 * r2;
-      d9 += h8 * r1;
-      d9 += h9 * r0;
-      c += d9 >>> 13;
-      d9 &= 0x1fff;
-
-      c = ((c << 2) + c) | 0;
-      c = (c + d0) | 0;
-      d0 = c & 0x1fff;
-      c = c >>> 13;
-      d1 += c;
-
-      h0 = d0;
-      h1 = d1;
-      h2 = d2;
-      h3 = d3;
-      h4 = d4;
-      h5 = d5;
-      h6 = d6;
-      h7 = d7;
-      h8 = d8;
-      h9 = d9;
-
-      mpos += 16;
-      bytes -= 16;
-    }
-    this.h[0] = h0;
-    this.h[1] = h1;
-    this.h[2] = h2;
-    this.h[3] = h3;
-    this.h[4] = h4;
-    this.h[5] = h5;
-    this.h[6] = h6;
-    this.h[7] = h7;
-    this.h[8] = h8;
-    this.h[9] = h9;
-  }
-
-  finish(mac: Uint8Array, macpos: number) {
-    var g = new Uint16Array(10);
-    var c, mask, f, i;
-
-    if (this.leftover) {
-      i = this.leftover;
-      this.buffer[i++] = 1;
-      for (; i < 16; i++) this.buffer[i] = 0;
-      this.fin = 1;
-      this.blocks(this.buffer, 0, 16);
-    }
-
-    c = this.h[1] >>> 13;
-    this.h[1] &= 0x1fff;
-    for (i = 2; i < 10; i++) {
-      this.h[i] += c;
-      c = this.h[i] >>> 13;
-      this.h[i] &= 0x1fff;
-    }
-    this.h[0] += c * 5;
-    c = this.h[0] >>> 13;
-    this.h[0] &= 0x1fff;
-    this.h[1] += c;
-    c = this.h[1] >>> 13;
-    this.h[1] &= 0x1fff;
-    this.h[2] += c;
-
-    g[0] = this.h[0] + 5;
-    c = g[0] >>> 13;
-    g[0] &= 0x1fff;
-    for (i = 1; i < 10; i++) {
-      g[i] = this.h[i] + c;
-      c = g[i] >>> 13;
-      g[i] &= 0x1fff;
-    }
-    g[9] -= 1 << 13;
-
-    mask = (c ^ 1) - 1;
-    for (i = 0; i < 10; i++) g[i] &= mask;
-    mask = ~mask;
-    for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];
-
-    this.h[0] = (this.h[0] | (this.h[1] << 13)) & 0xffff;
-    this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10)) & 0xffff;
-    this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7)) & 0xffff;
-    this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4)) & 0xffff;
-    this.h[4] =
-      ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;
-    this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11)) & 0xffff;
-    this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8)) & 0xffff;
-    this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff;
-
-    f = this.h[0] + this.pad[0];
-    this.h[0] = f & 0xffff;
-    for (i = 1; i < 8; i++) {
-      f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;
-      this.h[i] = f & 0xffff;
-    }
-
-    mac[macpos + 0] = (this.h[0] >>> 0) & 0xff;
-    mac[macpos + 1] = (this.h[0] >>> 8) & 0xff;
-    mac[macpos + 2] = (this.h[1] >>> 0) & 0xff;
-    mac[macpos + 3] = (this.h[1] >>> 8) & 0xff;
-    mac[macpos + 4] = (this.h[2] >>> 0) & 0xff;
-    mac[macpos + 5] = (this.h[2] >>> 8) & 0xff;
-    mac[macpos + 6] = (this.h[3] >>> 0) & 0xff;
-    mac[macpos + 7] = (this.h[3] >>> 8) & 0xff;
-    mac[macpos + 8] = (this.h[4] >>> 0) & 0xff;
-    mac[macpos + 9] = (this.h[4] >>> 8) & 0xff;
-    mac[macpos + 10] = (this.h[5] >>> 0) & 0xff;
-    mac[macpos + 11] = (this.h[5] >>> 8) & 0xff;
-    mac[macpos + 12] = (this.h[6] >>> 0) & 0xff;
-    mac[macpos + 13] = (this.h[6] >>> 8) & 0xff;
-    mac[macpos + 14] = (this.h[7] >>> 0) & 0xff;
-    mac[macpos + 15] = (this.h[7] >>> 8) & 0xff;
-  }
-
-  update(m: Uint8Array, mpos: number, bytes: number) {
-    var i, want;
-
-    if (this.leftover) {
-      want = 16 - this.leftover;
-      if (want > bytes) want = bytes;
-      for (i = 0; i < want; i++) this.buffer[this.leftover + i] = m[mpos + i];
-      bytes -= want;
-      mpos += want;
-      this.leftover += want;
-      if (this.leftover < 16) return;
-      this.blocks(this.buffer, 0, 16);
-      this.leftover = 0;
-    }
-
-    if (bytes >= 16) {
-      want = bytes - (bytes % 16);
-      this.blocks(m, mpos, want);
-      mpos += want;
-      bytes -= want;
-    }
-
-    if (bytes) {
-      for (i = 0; i < bytes; i++) this.buffer[this.leftover + i] = m[mpos + i];
-      this.leftover += bytes;
-    }
-  }
-}
-
-function crypto_onetimeauth(
-  out: Uint8Array,
-  outpos: number,
-  m: Uint8Array,
-  mpos: number,
-  n: number,
-  k: Uint8Array,
-) {
-  var s = new poly1305(k);
-  s.update(m, mpos, n);
-  s.finish(out, outpos);
-  return 0;
-}
-
-function crypto_onetimeauth_verify(
-  h: Uint8Array,
-  hpos: number,
-  m: Uint8Array,
-  mpos: number,
-  n: number,
-  k: Uint8Array,
-) {
-  var x = new Uint8Array(16);
-  crypto_onetimeauth(x, 0, m, mpos, n, k);
-  return crypto_verify_16(h, hpos, x, 0);
-}
-
-function crypto_secretbox(
-  c: Uint8Array,
-  m: Uint8Array,
-  d: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var i;
-  if (d < 32) return -1;
-  crypto_stream_xor(c, 0, m, 0, d, n, k);
-  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
-  for (i = 0; i < 16; i++) c[i] = 0;
-  return 0;
-}
-
-function crypto_secretbox_open(
-  m: Uint8Array,
-  c: Uint8Array,
-  d: number,
-  n: Uint8Array,
-  k: Uint8Array,
-) {
-  var i;
-  var x = new Uint8Array(32);
-  if (d < 32) return -1;
-  crypto_stream(x, 0, 32, n, k);
-  if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1;
-  crypto_stream_xor(m, 0, c, 0, d, n, k);
-  for (i = 0; i < 32; i++) m[i] = 0;
-  return 0;
-}
-
-function set25519(r: Float64Array, a: Float64Array) {
-  var i;
+function set25519(r: Float64Array, a: Float64Array): void {
+  let i;
   for (i = 0; i < 16; i++) r[i] = a[i] | 0;
 }
 
-function car25519(o: Float64Array) {
-  var i,
+function car25519(o: Float64Array): void {
+  let i,
     v,
     c = 1;
   for (i = 0; i < 16; i++) {
@@ -1166,19 +164,19 @@ function car25519(o: Float64Array) {
   o[0] += c - 1 + 37 * (c - 1);
 }
 
-function sel25519(p: Float64Array, q: Float64Array, b: number) {
-  var t,
-    c = ~(b - 1);
-  for (var i = 0; i < 16; i++) {
+function sel25519(p: Float64Array, q: Float64Array, b: number): void {
+  let t;
+  const c = ~(b - 1);
+  for (let i = 0; i < 16; i++) {
     t = c & (p[i] ^ q[i]);
     p[i] ^= t;
     q[i] ^= t;
   }
 }
 
-function pack25519(o: Uint8Array, n: Float64Array) {
-  var i, j, b;
-  var m = gf(),
+function pack25519(o: Uint8Array, n: Float64Array): void {
+  let i, j, b;
+  const m = gf(),
     t = gf();
   for (i = 0; i < 16; i++) t[i] = n[i];
   car25519(t);
@@ -1201,36 +199,36 @@ function pack25519(o: Uint8Array, n: Float64Array) {
   }
 }
 
-function neq25519(a: Float64Array, b: Float64Array) {
-  var c = new Uint8Array(32),
+function neq25519(a: Float64Array, b: Float64Array): number {
+  const c = new Uint8Array(32),
     d = new Uint8Array(32);
   pack25519(c, a);
   pack25519(d, b);
   return crypto_verify_32(c, 0, d, 0);
 }
 
-function par25519(a: Float64Array) {
-  var d = new Uint8Array(32);
+function par25519(a: Float64Array): number {
+  const d = new Uint8Array(32);
   pack25519(d, a);
   return d[0] & 1;
 }
 
-function unpack25519(o: Float64Array, n: Uint8Array) {
-  var i;
+function unpack25519(o: Float64Array, n: Uint8Array): void {
+  let i;
   for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8);
   o[15] &= 0x7fff;
 }
 
-function A(o: Float64Array, a: Float64Array, b: Float64Array) {
-  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];
+function A(o: Float64Array, a: Float64Array, b: Float64Array): void {
+  for (let i = 0; i < 16; i++) o[i] = a[i] + b[i];
 }
 
-function Z(o: Float64Array, a: Float64Array, b: Float64Array) {
-  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];
+function Z(o: Float64Array, a: Float64Array, b: Float64Array): void {
+  for (let i = 0; i < 16; i++) o[i] = a[i] - b[i];
 }
 
-function M(o: Float64Array, a: Float64Array, b: Float64Array) {
-  var v,
+function M(o: Float64Array, a: Float64Array, b: Float64Array): void {
+  let v,
     c,
     t0 = 0,
     t1 = 0,
@@ -1262,8 +260,8 @@ function M(o: Float64Array, a: Float64Array, b: 
Float64Array) {
     t27 = 0,
     t28 = 0,
     t29 = 0,
-    t30 = 0,
-    b0 = b[0],
+    t30 = 0;
+  const b0 = b[0],
     b1 = b[1],
     b2 = b[2],
     b3 = b[3],
@@ -1692,13 +690,13 @@ function M(o: Float64Array, a: Float64Array, b: 
Float64Array) {
   o[15] = t15;
 }
 
-function S(o: Float64Array, a: Float64Array) {
+function S(o: Float64Array, a: Float64Array): void {
   M(o, a, a);
 }
 
-function inv25519(o: Float64Array, i: Float64Array) {
-  var c = gf();
-  var a;
+function inv25519(o: Float64Array, i: Float64Array): void {
+  const c = gf();
+  let a;
   for (a = 0; a < 16; a++) c[a] = i[a];
   for (a = 253; a >= 0; a--) {
     S(c, c);
@@ -1707,9 +705,9 @@ function inv25519(o: Float64Array, i: Float64Array) {
   for (a = 0; a < 16; a++) o[a] = c[a];
 }
 
-function pow2523(o: Float64Array, i: Float64Array) {
-  var c = gf();
-  var a;
+function pow2523(o: Float64Array, i: Float64Array): void {
+  const c = gf();
+  let a;
   for (a = 0; a < 16; a++) c[a] = i[a];
   for (a = 250; a >= 0; a--) {
     S(c, c);
@@ -1718,12 +716,16 @@ function pow2523(o: Float64Array, i: Float64Array) {
   for (a = 0; a < 16; a++) o[a] = c[a];
 }
 
-function crypto_scalarmult(q: Uint8Array, n: Uint8Array, p: Uint8Array) {
-  var z = new Uint8Array(32);
-  var x = new Float64Array(80),
-    r,
-    i;
-  var a = gf(),
+function crypto_scalarmult(
+  q: Uint8Array,
+  n: Uint8Array,
+  p: Uint8Array,
+): number {
+  const z = new Uint8Array(32);
+  const x = new Float64Array(80);
+  let r;
+  let i;
+  const a = gf(),
     b = gf(),
     c = gf(),
     d = gf(),
@@ -1769,60 +771,20 @@ function crypto_scalarmult(q: Uint8Array, n: Uint8Array, 
p: Uint8Array) {
     x[i + 48] = b[i];
     x[i + 64] = d[i];
   }
-  var x32 = x.subarray(32);
-  var x16 = x.subarray(16);
+  const x32 = x.subarray(32);
+  const x16 = x.subarray(16);
   inv25519(x32, x32);
   M(x16, x16, x32);
   pack25519(q, x16);
   return 0;
 }
 
-function crypto_scalarmult_base(q: Uint8Array, n: Uint8Array) {
+function crypto_scalarmult_base(q: Uint8Array, n: Uint8Array): number {
   return crypto_scalarmult(q, n, _9);
 }
 
-function crypto_box_keypair(y: Uint8Array, x: Uint8Array) {
-  randombytes(x, 32);
-  return crypto_scalarmult_base(y, x);
-}
-
-function crypto_box_beforenm(k: Uint8Array, y: Uint8Array, x: Uint8Array) {
-  var s = new Uint8Array(32);
-  crypto_scalarmult(s, x, y);
-  return crypto_core_hsalsa20(k, _0, s, sigma);
-}
-
-var crypto_box_afternm = crypto_secretbox;
-var crypto_box_open_afternm = crypto_secretbox_open;
-
-function crypto_box(
-  c: Uint8Array,
-  m: Uint8Array,
-  d: number,
-  n: Uint8Array,
-  y: Uint8Array,
-  x: Uint8Array,
-) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_afternm(c, m, d, n, k);
-}
-
-function crypto_box_open(
-  m: Uint8Array,
-  c: Uint8Array,
-  d: number,
-  n: Uint8Array,
-  y: Uint8Array,
-  x: Uint8Array,
-) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_open_afternm(m, c, d, n, k);
-}
-
 // prettier-ignore
-var K = [
+const K = [
   0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
   0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
   0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
@@ -1870,10 +832,10 @@ function crypto_hashblocks_hl(
   hl: Int32Array,
   m: Uint8Array,
   n: number,
-) {
-  var wh = new Int32Array(16),
-    wl = new Int32Array(16),
-    bh0,
+): number {
+  const wh = new Int32Array(16),
+    wl = new Int32Array(16);
+  let bh0,
     bh1,
     bh2,
     bh3,
@@ -1900,7 +862,7 @@ function crypto_hashblocks_hl(
     c,
     d;
 
-  var ah0 = hh[0],
+  let ah0 = hh[0],
     ah1 = hh[1],
     ah2 = hh[2],
     ah3 = hh[3],
@@ -1917,7 +879,7 @@ function crypto_hashblocks_hl(
     al6 = hl[6],
     al7 = hl[7];
 
-  var pos = 0;
+  let pos = 0;
   while (n >= 128) {
     for (i = 0; i < 16; i++) {
       j = 8 * i + pos;
@@ -2338,11 +1300,11 @@ function crypto_hashblocks_hl(
   return n;
 }
 
-function crypto_hash(out: Uint8Array, m: Uint8Array, n: number) {
+function crypto_hash(out: Uint8Array, m: Uint8Array, n: number): number {
   const hh = new Int32Array(8);
   const hl = new Int32Array(8);
   const x = new Uint8Array(256);
-  let b = n;
+  const b = n;
 
   hh[0] = 0x6a09e667;
   hh[1] = 0xbb67ae85;
@@ -2436,7 +1398,7 @@ export class HashState {
     const out = new Uint8Array(64);
     let n = this.p;
     const x = new Uint8Array(256);
-    let b = this.total;
+    const b = this.total;
     for (let i = 0; i < n; i++) x[i] = this.next[i];
     x[n] = 128;
 
@@ -2450,8 +1412,8 @@ export class HashState {
   }
 }
 
-function add(p: Float64Array[], q: Float64Array[]) {
-  var a = gf(),
+function add(p: Float64Array[], q: Float64Array[]): void {
+  const a = gf(),
     b = gf(),
     c = gf(),
     d = gf(),
@@ -2482,15 +1444,15 @@ function add(p: Float64Array[], q: Float64Array[]) {
   M(p[3], e, h);
 }
 
-function cswap(p: Float64Array[], q: Float64Array[], b: number) {
-  var i;
+function cswap(p: Float64Array[], q: Float64Array[], b: number): void {
+  let i;
   for (i = 0; i < 4; i++) {
     sel25519(p[i], q[i], b);
   }
 }
 
-function pack(r: Uint8Array, p: Float64Array[]) {
-  var tx = gf(),
+function pack(r: Uint8Array, p: Float64Array[]): void {
+  const tx = gf(),
     ty = gf(),
     zi = gf();
   inv25519(zi, p[2]);
@@ -2500,8 +1462,8 @@ function pack(r: Uint8Array, p: Float64Array[]) {
   r[31] ^= par25519(tx) << 7;
 }
 
-function scalarmult(p: Float64Array[], q: Float64Array[], s: Uint8Array) {
-  var b, i;
+function scalarmult(p: Float64Array[], q: Float64Array[], s: Uint8Array): void 
{
+  let b, i;
   set25519(p[0], gf0);
   set25519(p[1], gf1);
   set25519(p[2], gf1);
@@ -2515,7 +1477,7 @@ function scalarmult(p: Float64Array[], q: Float64Array[], 
s: Uint8Array) {
   }
 }
 
-function scalarbase(p: Float64Array[], s: Uint8Array) {
+function scalarbase(p: Float64Array[], s: Uint8Array): void {
   const q = [gf(), gf(), gf(), gf()];
   set25519(q[0], X);
   set25519(q[1], Y);
@@ -2545,7 +1507,7 @@ function crypto_sign_keypair(
   return 0;
 }
 
-var L = new Float64Array([
+const L = new Float64Array([
   0xed,
   0xd3,
   0xf5,
@@ -2580,8 +1542,8 @@ var L = new Float64Array([
   0x10,
 ]);
 
-function modL(r: Uint8Array, x: Float64Array) {
-  var carry, i, j, k;
+function modL(r: Uint8Array, x: Float64Array): void {
+  let carry, i, j, k;
   for (i = 63; i >= 32; --i) {
     carry = 0;
     for (j = i - 32, k = i - 12; j < k; ++j) {
@@ -2605,7 +1567,7 @@ function modL(r: Uint8Array, x: Float64Array) {
   }
 }
 
-function reduce(r: Uint8Array) {
+function reduce(r: Uint8Array): void {
   const x = new Float64Array(64);
   for (let i = 0; i < 64; i++) x[i] = r[i];
   for (let i = 0; i < 64; i++) r[i] = 0;
@@ -2613,21 +1575,25 @@ function reduce(r: Uint8Array) {
 }
 
 // Note: difference from C - smlen returned, not passed as argument.
-function crypto_sign(sm: Uint8Array, m: Uint8Array, n: number, sk: Uint8Array) 
{
-  var d = new Uint8Array(64),
+function crypto_sign(
+  sm: Uint8Array,
+  m: Uint8Array,
+  n: number,
+  sk: Uint8Array,
+): number {
+  const d = new Uint8Array(64),
     h = new Uint8Array(64),
     r = new Uint8Array(64);
-  var i,
-    j,
-    x = new Float64Array(64);
-  var p = [gf(), gf(), gf(), gf()];
+  let i, j;
+  const x = new Float64Array(64);
+  const p = [gf(), gf(), gf(), gf()];
 
   crypto_hash(d, sk, 32);
   d[0] &= 248;
   d[31] &= 127;
   d[31] |= 64;
 
-  var smlen = n + 64;
+  const smlen = n + 64;
   for (i = 0; i < n; i++) sm[64 + i] = m[i];
   for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];
 
@@ -2652,7 +1618,7 @@ function crypto_sign(sm: Uint8Array, m: Uint8Array, n: 
number, sk: Uint8Array) {
   return smlen;
 }
 
-function unpackneg(r: Float64Array[], p: Uint8Array) {
+function unpackneg(r: Float64Array[], p: Uint8Array): number {
   const t = gf();
   const chk = gf();
   const num = gf();
@@ -2699,11 +1665,11 @@ function crypto_sign_open(
   sm: Uint8Array,
   n: number,
   pk: Uint8Array,
-) {
-  var i, mlen;
-  var t = new Uint8Array(32),
+): number {
+  let i, mlen;
+  const t = new Uint8Array(32),
     h = new Uint8Array(64);
-  var p = [gf(), gf(), gf(), gf()],
+  const p = [gf(), gf(), gf(), gf()],
     q = [gf(), gf(), gf(), gf()];
 
   mlen = -1;
@@ -2732,143 +1698,46 @@ function crypto_sign_open(
   return mlen;
 }
 
-var crypto_secretbox_KEYBYTES = 32,
-  crypto_secretbox_NONCEBYTES = 24,
-  crypto_secretbox_ZEROBYTES = 32,
-  crypto_secretbox_BOXZEROBYTES = 16,
-  crypto_scalarmult_BYTES = 32,
+const crypto_scalarmult_BYTES = 32,
   crypto_scalarmult_SCALARBYTES = 32,
-  crypto_box_PUBLICKEYBYTES = 32,
-  crypto_box_SECRETKEYBYTES = 32,
-  crypto_box_BEFORENMBYTES = 32,
-  crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
-  crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
-  crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
   crypto_sign_BYTES = 64,
   crypto_sign_PUBLICKEYBYTES = 32,
   crypto_sign_SECRETKEYBYTES = 64,
   crypto_sign_SEEDBYTES = 32,
   crypto_hash_BYTES = 64;
 
-const lowlevel = {
-  crypto_core_hsalsa20: crypto_core_hsalsa20,
-  crypto_stream_xor: crypto_stream_xor,
-  crypto_stream: crypto_stream,
-  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
-  crypto_stream_salsa20: crypto_stream_salsa20,
-  crypto_onetimeauth: crypto_onetimeauth,
-  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
-  crypto_verify_16: crypto_verify_16,
-  crypto_verify_32: crypto_verify_32,
-  crypto_secretbox: crypto_secretbox,
-  crypto_secretbox_open: crypto_secretbox_open,
-  crypto_scalarmult: crypto_scalarmult,
-  crypto_scalarmult_base: crypto_scalarmult_base,
-  crypto_box_beforenm: crypto_box_beforenm,
-  crypto_box_afternm: crypto_box_afternm,
-  crypto_box: crypto_box,
-  crypto_box_open: crypto_box_open,
-  crypto_box_keypair: crypto_box_keypair,
-  crypto_hash: crypto_hash,
-  crypto_sign: crypto_sign,
-  crypto_sign_keypair: crypto_sign_keypair,
-  crypto_sign_open: crypto_sign_open,
-
-  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
-  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
-  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
-  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
-  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
-  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
-  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
-  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
-  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
-  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
-  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
-  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
-  crypto_sign_BYTES: crypto_sign_BYTES,
-  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
-  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
-  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
-  crypto_hash_BYTES: crypto_hash_BYTES,
-};
-
 /* High-level API */
 
-function checkLengths(k: Uint8Array, n: Uint8Array) {
-  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error("bad key size");
-  if (n.length !== crypto_secretbox_NONCEBYTES)
-    throw new Error("bad nonce size");
-}
-
-function checkBoxLengths(pk: Uint8Array, sk: Uint8Array) {
-  if (pk.length !== crypto_box_PUBLICKEYBYTES)
-    throw new Error("bad public key size");
-  if (sk.length !== crypto_box_SECRETKEYBYTES)
-    throw new Error("bad secret key size");
-}
-
-function checkArrayTypes(...args: Uint8Array[]) {
-  for (var i = 0; i < args.length; i++) {
+function checkArrayTypes(...args: Uint8Array[]): void {
+  for (let i = 0; i < args.length; i++) {
     if (!(args[i] instanceof Uint8Array))
       throw new TypeError("unexpected type, use Uint8Array");
   }
 }
 
-function cleanup(arr: Uint8Array) {
-  for (var i = 0; i < arr.length; i++) arr[i] = 0;
+function cleanup(arr: Uint8Array): void {
+  for (let i = 0; i < arr.length; i++) arr[i] = 0;
 }
 
-export function randomBytes(n: number) {
-  var b = new Uint8Array(n);
+export function randomBytes(n: number): Uint8Array {
+  const b = new Uint8Array(n);
   randombytes(b, n);
   return b;
 }
 
-export function secretbox(msg: Uint8Array, nonce: Uint8Array, key: Uint8Array) 
{
-  checkArrayTypes(msg, nonce, key);
-  checkLengths(key, nonce);
-  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
-  var c = new Uint8Array(m.length);
-  for (var i = 0; i < msg.length; i++)
-    m[i + crypto_secretbox_ZEROBYTES] = msg[i];
-  crypto_secretbox(c, m, m.length, nonce, key);
-  return c.subarray(crypto_secretbox_BOXZEROBYTES);
-}
-
-export function secretbox_open(
-  box: Uint8Array,
-  nonce: Uint8Array,
-  key: Uint8Array,
-) {
-  checkArrayTypes(box, nonce, key);
-  checkLengths(key, nonce);
-  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
-  var m = new Uint8Array(c.length);
-  for (var i = 0; i < box.length; i++)
-    c[i + crypto_secretbox_BOXZEROBYTES] = box[i];
-  if (c.length < 32) return null;
-  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null;
-  return m.subarray(crypto_secretbox_ZEROBYTES);
-}
-
-export const secretbox_keyLength = crypto_secretbox_KEYBYTES;
-export const secretbox_nonceLength = crypto_secretbox_NONCEBYTES;
-export const secretbox_overheadLength = crypto_secretbox_BOXZEROBYTES;
-
-export function scalarMult(n: Uint8Array, p: Uint8Array) {
+export function scalarMult(n: Uint8Array, p: Uint8Array): Uint8Array {
   checkArrayTypes(n, p);
   if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n 
size");
   if (p.length !== crypto_scalarmult_BYTES) throw new Error("bad p size");
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
+  const q = new Uint8Array(crypto_scalarmult_BYTES);
   crypto_scalarmult(q, n, p);
   return q;
 }
 
-export function scalarMult_base(n: Uint8Array) {
+export function scalarMult_base(n: Uint8Array): Uint8Array {
   checkArrayTypes(n);
   if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n 
size");
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
+  const q = new Uint8Array(crypto_scalarmult_BYTES);
   crypto_scalarmult_base(q, n);
   return q;
 }
@@ -2876,85 +1745,37 @@ export function scalarMult_base(n: Uint8Array) {
 export const scalarMult_scalarLength = crypto_scalarmult_SCALARBYTES;
 export const scalarMult_groupElementLength = crypto_scalarmult_BYTES;
 
-export function box(
-  msg: Uint8Array,
-  nonce: Uint8Array,
-  publicKey: Uint8Array,
-  secretKey: Uint8Array,
-) {
-  var k = box_before(publicKey, secretKey);
-  return secretbox(msg, nonce, k);
-}
-
-export function box_before(publicKey: Uint8Array, secretKey: Uint8Array) {
-  checkArrayTypes(publicKey, secretKey);
-  checkBoxLengths(publicKey, secretKey);
-  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
-  crypto_box_beforenm(k, publicKey, secretKey);
-  return k;
-}
-
-export const box_after = secretbox;
-
-export function box_open(
-  msg: Uint8Array,
-  nonce: Uint8Array,
-  publicKey: Uint8Array,
-  secretKey: Uint8Array,
-) {
-  var k = box_before(publicKey, secretKey);
-  return secretbox_open(msg, nonce, k);
-}
-
-export const box_open_after = secretbox_open;
-
-export function box_keyPair() {
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
-  crypto_box_keypair(pk, sk);
-  return { publicKey: pk, secretKey: sk };
-}
-
-export function box_keyPair_fromSecretKey(secretKey: Uint8Array) {
-  checkArrayTypes(secretKey);
-  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
-    throw new Error("bad secret key size");
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  crypto_scalarmult_base(pk, secretKey);
-  return { publicKey: pk, secretKey: new Uint8Array(secretKey) };
-}
-
-export const box_publicKeyLength = crypto_box_PUBLICKEYBYTES;
-export const box_secretKeyLength = crypto_box_SECRETKEYBYTES;
-export const box_sharedKeyLength = crypto_box_BEFORENMBYTES;
-export const box_nonceLength = crypto_box_NONCEBYTES;
-export const box_overheadLength = secretbox_overheadLength;
-
-export function sign(msg: Uint8Array, secretKey: Uint8Array) {
+export function sign(msg: Uint8Array, secretKey: Uint8Array): Uint8Array {
   checkArrayTypes(msg, secretKey);
   if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
     throw new Error("bad secret key size");
-  var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length);
+  const signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length);
   crypto_sign(signedMsg, msg, msg.length, secretKey);
   return signedMsg;
 }
 
-export function sign_open(signedMsg: Uint8Array, publicKey: Uint8Array) {
+export function sign_open(
+  signedMsg: Uint8Array,
+  publicKey: Uint8Array,
+): Uint8Array | null {
   checkArrayTypes(signedMsg, publicKey);
   if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
     throw new Error("bad public key size");
-  var tmp = new Uint8Array(signedMsg.length);
-  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
+  const tmp = new Uint8Array(signedMsg.length);
+  const mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
   if (mlen < 0) return null;
-  var m = new Uint8Array(mlen);
-  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
+  const m = new Uint8Array(mlen);
+  for (let i = 0; i < m.length; i++) m[i] = tmp[i];
   return m;
 }
 
-export function sign_detached(msg: Uint8Array, secretKey: Uint8Array) {
-  var signedMsg = sign(msg, secretKey);
-  var sig = new Uint8Array(crypto_sign_BYTES);
-  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
+export function sign_detached(
+  msg: Uint8Array,
+  secretKey: Uint8Array,
+): Uint8Array {
+  const signedMsg = sign(msg, secretKey);
+  const sig = new Uint8Array(crypto_sign_BYTES);
+  for (let i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
   return sig;
 }
 
@@ -2962,22 +1783,25 @@ export function sign_detached_verify(
   msg: Uint8Array,
   sig: Uint8Array,
   publicKey: Uint8Array,
-) {
+): boolean {
   checkArrayTypes(msg, sig, publicKey);
   if (sig.length !== crypto_sign_BYTES) throw new Error("bad signature size");
   if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
     throw new Error("bad public key size");
-  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var i;
+  const sm = new Uint8Array(crypto_sign_BYTES + msg.length);
+  const m = new Uint8Array(crypto_sign_BYTES + msg.length);
+  let i;
   for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
   for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i];
   return crypto_sign_open(m, sm, sm.length, publicKey) >= 0;
 }
 
-export function sign_keyPair() {
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
+export function sign_keyPair(): {
+  publicKey: Uint8Array;
+  secretKey: Uint8Array;
+} {
+  const pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
+  const sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
   crypto_sign_keypair(pk, sk, false);
   return { publicKey: pk, secretKey: sk };
 }
@@ -3005,21 +1829,31 @@ export function x25519_edwards_keyPair_fromSecretKey(
   return pk;
 }
 
-export function sign_keyPair_fromSecretKey(secretKey: Uint8Array) {
+export function sign_keyPair_fromSecretKey(
+  secretKey: Uint8Array,
+): {
+  publicKey: Uint8Array;
+  secretKey: Uint8Array;
+} {
   checkArrayTypes(secretKey);
   if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
     throw new Error("bad secret key size");
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i];
+  const pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
+  for (let i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i];
   return { publicKey: pk, secretKey: new Uint8Array(secretKey) };
 }
 
-export function sign_keyPair_fromSeed(seed: Uint8Array) {
+export function sign_keyPair_fromSeed(
+  seed: Uint8Array,
+): {
+  publicKey: Uint8Array;
+  secretKey: Uint8Array;
+} {
   checkArrayTypes(seed);
   if (seed.length !== crypto_sign_SEEDBYTES) throw new Error("bad seed size");
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
-  for (var i = 0; i < 32; i++) sk[i] = seed[i];
+  const pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
+  const sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
+  for (let i = 0; i < 32; i++) sk[i] = seed[i];
   crypto_sign_keypair(pk, sk, true);
   return { publicKey: pk, secretKey: sk };
 }
@@ -3029,16 +1863,16 @@ export const sign_secretKeyLength = 
crypto_sign_SECRETKEYBYTES;
 export const sign_seedLength = crypto_sign_SEEDBYTES;
 export const sign_signatureLength = crypto_sign_BYTES;
 
-export function hash(msg: Uint8Array) {
+export function hash(msg: Uint8Array): Uint8Array {
   checkArrayTypes(msg);
-  var h = new Uint8Array(crypto_hash_BYTES);
+  const h = new Uint8Array(crypto_hash_BYTES);
   crypto_hash(h, msg, msg.length);
   return h;
 }
 
 export const hash_hashLength = crypto_hash_BYTES;
 
-export function verify(x: Uint8Array, y: Uint8Array) {
+export function verify(x: Uint8Array, y: Uint8Array): boolean {
   checkArrayTypes(x, y);
   // Zero length arguments are considered not equal.
   if (x.length === 0 || y.length === 0) return false;
@@ -3046,7 +1880,7 @@ export function verify(x: Uint8Array, y: Uint8Array) {
   return vn(x, 0, y, 0, x.length) === 0 ? true : false;
 }
 
-export function setPRNG(fn: (x: Uint8Array, n: number) => void) {
+export function setPRNG(fn: (x: Uint8Array, n: number) => void): void {
   randombytes = fn;
 }
 
@@ -3078,28 +1912,28 @@ export function sign_ed25519_pk_to_curve25519(
 (function () {
   // Initialize PRNG if environment provides CSPRNG.
   // If not, methods calling randombytes will throw.
-  const crypto =
+  const cr =
     typeof self !== "undefined" ? self.crypto || (self as any).msCrypto : null;
-  if (crypto && crypto.getRandomValues) {
+  if (cr && cr.getRandomValues) {
     // Browsers.
-    var QUOTA = 65536;
+    const QUOTA = 65536;
     setPRNG(function (x: Uint8Array, n: number) {
-      var i,
-        v = new Uint8Array(n);
+      let i;
+      const v = new Uint8Array(n);
       for (i = 0; i < n; i += QUOTA) {
-        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
+        cr.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
       }
       for (i = 0; i < n; i++) x[i] = v[i];
       cleanup(v);
     });
   } else if (typeof require !== "undefined") {
     // Node.js.
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
     const cr = require("crypto");
     if (cr && cr.randomBytes) {
       setPRNG(function (x: Uint8Array, n: number) {
-        var i,
-          v = cr.randomBytes(n);
-        for (i = 0; i < n; i++) x[i] = v[i];
+        const v = cr.randomBytes(n);
+        for (let i = 0; i < n; i++) x[i] = v[i];
         cleanup(v);
       });
     }
diff --git a/src/crypto/primitives/sha256.ts b/src/crypto/primitives/sha256.ts
index c0f245bb..97723dbf 100644
--- a/src/crypto/primitives/sha256.ts
+++ b/src/crypto/primitives/sha256.ts
@@ -11,8 +11,8 @@
 //  Classes:
 //
 //   new sha256.Hash()
-export const digestLength: number = 32;
-export const blockSize: number = 64;
+export const digestLength = 32;
+export const blockSize = 64;
 
 // SHA-256 constants
 const K = new Uint32Array([
@@ -188,10 +188,10 @@ export class HashSha256 {
   private state: Int32Array = new Int32Array(8); // hash state
   private temp: Int32Array = new Int32Array(64); // temporary state
   private buffer: Uint8Array = new Uint8Array(128); // buffer for data to hash
-  private bufferLength: number = 0; // number of bytes in buffer
-  private bytesHashed: number = 0; // number of total bytes hashed
+  private bufferLength = 0; // number of bytes in buffer
+  private bytesHashed = 0; // number of total bytes hashed
 
-  finished: boolean = false; // indicates whether the hash was finalized
+  finished = false; // indicates whether the hash was finalized
 
   constructor() {
     this.reset();
@@ -215,7 +215,7 @@ export class HashSha256 {
   }
 
   // Cleans internal buffers and re-initializes hash state.
-  clean() {
+  clean(): void {
     for (let i = 0; i < this.buffer.length; i++) {
       this.buffer[i] = 0;
     }
@@ -306,14 +306,14 @@ export class HashSha256 {
   }
 
   // Internal function for use in HMAC for optimization.
-  _saveState(out: Uint32Array) {
+  _saveState(out: Uint32Array): void {
     for (let i = 0; i < this.state.length; i++) {
       out[i] = this.state[i];
     }
   }
 
   // Internal function for use in HMAC for optimization.
-  _restoreState(from: Uint32Array, bytesHashed: number) {
+  _restoreState(from: Uint32Array, bytesHashed: number): void {
     for (let i = 0; i < this.state.length; i++) {
       this.state[i] = from[i];
     }
@@ -376,7 +376,7 @@ export class HMAC {
   }
 
   // Cleans HMAC state.
-  clean() {
+  clean(): void {
     for (let i = 0; i < this.istate.length; i++) {
       this.ostate[i] = this.istate[i] = 0;
     }
@@ -418,7 +418,7 @@ export function sha256(data: Uint8Array): Uint8Array {
 }
 
 // Returns HMAC-SHA256 of data under the key.
-export function hmacSha256(key: Uint8Array, data: Uint8Array) {
+export function hmacSha256(key: Uint8Array, data: Uint8Array): Uint8Array {
   const h = new HMAC(key).update(data);
   const digest = h.digest();
   h.clean();
diff --git a/src/crypto/talerCrypto-test.ts b/src/crypto/talerCrypto-test.ts
index 85c22d60..1efa766f 100644
--- a/src/crypto/talerCrypto-test.ts
+++ b/src/crypto/talerCrypto-test.ts
@@ -30,7 +30,7 @@ import {
   rsaVerify,
 } from "./talerCrypto";
 import { sha512, kdf } from "./primitives/kdf";
-import nacl = require("./primitives/nacl-fast");
+import * as nacl from "./primitives/nacl-fast";
 
 function hexToBytes(hex: string) {
   for (var bytes = [], c = 0; c < hex.length; c += 2)
@@ -40,7 +40,7 @@ function hexToBytes(hex: string) {
 
 function bytesToHex(bytes: Uint8Array): string {
   for (var hex = [], i = 0; i < bytes.length; i++) {
-    var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
+    const current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
     hex.push((current >>> 4).toString(16));
     hex.push((current & 0xf).toString(16));
   }
diff --git a/src/crypto/talerCrypto.ts b/src/crypto/talerCrypto.ts
index 317b1af5..457009a0 100644
--- a/src/crypto/talerCrypto.ts
+++ b/src/crypto/talerCrypto.ts
@@ -18,7 +18,7 @@
  * Native implementation of GNU Taler crypto.
  */
 
-import nacl = require("./primitives/nacl-fast");
+import * as nacl from "./primitives/nacl-fast";
 import bigint from "big-integer";
 import { kdf } from "./primitives/kdf";
 
@@ -191,12 +191,12 @@ function kdfMod(
   }
 }
 
-export function stringToBytes(s: string) {
+export function stringToBytes(s: string): Uint8Array {
   const te = new TextEncoder();
   return te.encode(s);
 }
 
-function loadBigInt(arr: Uint8Array) {
+function loadBigInt(arr: Uint8Array): bigint.BigInteger {
   return bigint.fromArray(Array.from(arr), 256, false);
 }
 
@@ -219,7 +219,7 @@ function rsaBlindingKeyDerive(
  * @param r KDF result
  * @param n RSA modulus of the public key
  */
-function rsaGcdValidate(r: bigint.BigInteger, n: bigint.BigInteger) {
+function rsaGcdValidate(r: bigint.BigInteger, n: bigint.BigInteger): void {
   const t = bigint.gcd(r, n);
   if (!t.equals(bigint.one)) {
     throw Error("malicious RSA public key");
diff --git a/src/crypto/workers/cryptoApi.ts b/src/crypto/workers/cryptoApi.ts
index d3b12e26..456bf309 100644
--- a/src/crypto/workers/cryptoApi.ts
+++ b/src/crypto/workers/cryptoApi.ts
@@ -34,13 +34,7 @@ import {
 
 import { CryptoWorker } from "./cryptoWorker";
 
-import {
-  RecoupRequest,
-  CoinDepositPermission,
-  RecoupConfirmation,
-  ExchangeSignKeyJson,
-  EddsaPublicKeyString,
-} from "../../types/talerTypes";
+import { RecoupRequest, CoinDepositPermission } from "../../types/talerTypes";
 
 import {
   BenchmarkResult,
@@ -110,7 +104,7 @@ export interface CryptoWorkerFactory {
 export class BrowserCryptoWorkerFactory implements CryptoWorkerFactory {
   startWorker(): CryptoWorker {
     const workerCtor = Worker;
-    const workerPath = "/dist/cryptoWorker-bundle.js";
+    const workerPath = "/dist/webextension/browserWorkerEntry.js";
     return new workerCtor(workerPath) as CryptoWorker;
   }
 
@@ -133,7 +127,7 @@ export class BrowserCryptoWorkerFactory implements 
CryptoWorkerFactory {
  * for the execution of expensive operations.
  */
 export class CryptoApi {
-  private nextRpcId: number = 1;
+  private nextRpcId = 1;
   private workers: WorkerState[];
   private workQueues: WorkItem[][];
 
@@ -142,20 +136,20 @@ export class CryptoApi {
   /**
    * Number of busy workers.
    */
-  private numBusy: number = 0;
+  private numBusy = 0;
 
   /**
    * Did we stop accepting new requests?
    */
-  private stopped: boolean = false;
+  private stopped = false;
 
   static enableTracing = false;
 
   /**
    * Terminate all worker threads.
    */
-  terminateWorkers() {
-    for (let worker of this.workers) {
+  terminateWorkers(): void {
+    for (const worker of this.workers) {
       if (worker.w) {
         CryptoApi.enableTracing && console.log("terminating worker");
         worker.w.terminate();
@@ -172,7 +166,7 @@ export class CryptoApi {
     }
   }
 
-  stop() {
+  stop(): void {
     this.terminateWorkers();
     this.stopped = true;
   }
@@ -192,11 +186,14 @@ export class CryptoApi {
     }
     ws.currentWorkItem = work;
     this.numBusy++;
+    let worker: CryptoWorker;
     if (!ws.w) {
-      const w = this.workerFactory.startWorker();
-      w.onmessage = (m: MessageEvent) => this.handleWorkerMessage(ws, m);
-      w.onerror = (e: ErrorEvent) => this.handleWorkerError(ws, e);
-      ws.w = w;
+      worker = this.workerFactory.startWorker();
+      worker.onmessage = (m: MessageEvent) => this.handleWorkerMessage(ws, m);
+      worker.onerror = (e: ErrorEvent) => this.handleWorkerError(ws, e);
+      ws.w = worker;
+    } else {
+      worker = ws.w;
     }
 
     const msg: any = {
@@ -206,28 +203,28 @@ export class CryptoApi {
     };
     this.resetWorkerTimeout(ws);
     work.startTime = timer.performanceNow();
-    setImmediate(() => ws.w!.postMessage(msg));
+    setTimeout(() => worker.postMessage(msg), 0);
   }
 
-  resetWorkerTimeout(ws: WorkerState) {
+  resetWorkerTimeout(ws: WorkerState): void {
     if (ws.terminationTimerHandle !== null) {
       ws.terminationTimerHandle.clear();
       ws.terminationTimerHandle = null;
     }
-    const destroy = () => {
+    const destroy = (): void => {
       // terminate worker if it's idle
       if (ws.w && ws.currentWorkItem === null) {
-        ws.w!.terminate();
+        ws.w.terminate();
         ws.w = null;
       }
     };
     ws.terminationTimerHandle = timer.after(15 * 1000, destroy);
   }
 
-  handleWorkerError(ws: WorkerState, e: ErrorEvent) {
+  handleWorkerError(ws: WorkerState, e: ErrorEvent): void {
     if (ws.currentWorkItem) {
       console.error(
-        `error in worker during ${ws.currentWorkItem!.operation}`,
+        `error in worker during ${ws.currentWorkItem.operation}`,
         e,
       );
     } else {
@@ -235,8 +232,10 @@ export class CryptoApi {
     }
     console.error(e.message);
     try {
-      ws.w!.terminate();
-      ws.w = null;
+      if (ws.w) {
+        ws.w.terminate();
+        ws.w = null;
+      }
     } catch (e) {
       console.error(e);
     }
@@ -248,19 +247,22 @@ export class CryptoApi {
     this.findWork(ws);
   }
 
-  private findWork(ws: WorkerState) {
+  private findWork(ws: WorkerState): void {
     // try to find more work for this worker
     for (let i = 0; i < NUM_PRIO; i++) {
       const q = this.workQueues[NUM_PRIO - i - 1];
       if (q.length !== 0) {
-        const work: WorkItem = q.shift()!;
+        const work: WorkItem | undefined = q.shift();
+        if (!work) {
+          continue;
+        }
         this.wake(ws, work);
         return;
       }
     }
   }
 
-  handleWorkerMessage(ws: WorkerState, msg: MessageEvent) {
+  handleWorkerMessage(ws: WorkerState, msg: MessageEvent): void {
     const id = msg.data.id;
     if (typeof id !== "number") {
       console.error("rpc id must be number");
diff --git a/src/crypto/workers/cryptoImplementation.ts 
b/src/crypto/workers/cryptoImplementation.ts
index eef8f595..96ad29bc 100644
--- a/src/crypto/workers/cryptoImplementation.ts
+++ b/src/crypto/workers/cryptoImplementation.ts
@@ -36,13 +36,7 @@ import {
   CoinSourceType,
 } from "../../types/dbTypes";
 
-import {
-  CoinDepositPermission,
-  RecoupRequest,
-  RecoupConfirmation,
-  ExchangeSignKeyJson,
-  EddsaPublicKeyString,
-} from "../../types/talerTypes";
+import { CoinDepositPermission, RecoupRequest } from "../../types/talerTypes";
 import {
   BenchmarkResult,
   PlanchetCreationResult,
@@ -70,11 +64,7 @@ import {
 } from "../talerCrypto";
 import { randomBytes } from "../primitives/nacl-fast";
 import { kdf } from "../primitives/kdf";
-import {
-  Timestamp,
-  getTimestampNow,
-  timestampIsBetween,
-} from "../../util/time";
+import { Timestamp, getTimestampNow } from "../../util/time";
 
 enum SignaturePurpose {
   RESERVE_WITHDRAW = 1200,
@@ -123,13 +113,13 @@ class SignaturePurposeBuilder {
 
   build(): Uint8Array {
     let payloadLen = 0;
-    for (let c of this.chunks) {
+    for (const c of this.chunks) {
       payloadLen += c.byteLength;
     }
     const buf = new ArrayBuffer(4 + 4 + payloadLen);
     const u8buf = new Uint8Array(buf);
     let p = 8;
-    for (let c of this.chunks) {
+    for (const c of this.chunks) {
       u8buf.set(c, p);
       p += c.byteLength;
     }
@@ -144,23 +134,8 @@ function buildSigPS(purposeNum: number): 
SignaturePurposeBuilder {
   return new SignaturePurposeBuilder(purposeNum);
 }
 
-function checkSignKeyOkay(
-  key: string,
-  exchangeKeys: ExchangeSignKeyJson[],
-): boolean {
-  const now = getTimestampNow();
-  for (const k of exchangeKeys) {
-    if (k.key == key) {
-      return timestampIsBetween(now, k.stamp_start, k.stamp_end);
-    }
-  }
-  return false;
-}
-
 export class CryptoImplementation {
-  static enableTracing: boolean = false;
-
-  constructor() {}
+  static enableTracing = false;
 
   /**
    * Create a pre-coin of the given denomination to be withdrawn from then 
given
@@ -535,7 +510,7 @@ export class CryptoImplementation {
     let time_eddsa_create = 0;
     for (let i = 0; i < repetitions; i++) {
       const start = timer.performanceNow();
-      const pair = createEddsaKeyPair();
+      createEddsaKeyPair();
       time_eddsa_create += timer.performanceNow() - start;
     }
 
diff --git a/src/crypto/workers/nodeThreadWorker.ts 
b/src/crypto/workers/nodeThreadWorker.ts
index 1247900f..6c9dfc56 100644
--- a/src/crypto/workers/nodeThreadWorker.ts
+++ b/src/crypto/workers/nodeThreadWorker.ts
@@ -1,5 +1,3 @@
-import { CryptoWorkerFactory } from "./cryptoApi";
-
 /*
  This file is part of TALER
  (C) 2016 GNUnet e.V.
@@ -16,10 +14,12 @@ import { CryptoWorkerFactory } from "./cryptoApi";
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-// tslint:disable:no-var-requires
-
+/**
+ * Imports
+ */
+import { CryptoWorkerFactory } from "./cryptoApi";
 import { CryptoWorker } from "./cryptoWorker";
-import os = require("os");
+import os from "os";
 import { CryptoImplementation } from "./cryptoImplementation";
 
 const f = __filename;
@@ -55,7 +55,7 @@ const workerCode = `
  * This function is executed in the worker thread to handle
  * a message.
  */
-export function handleWorkerMessage(msg: any) {
+export function handleWorkerMessage(msg: any): void {
   const args = msg.args;
   if (!Array.isArray(args)) {
     console.error("args must be array");
@@ -72,7 +72,7 @@ export function handleWorkerMessage(msg: any) {
     return;
   }
 
-  const handleRequest = async () => {
+  const handleRequest = async (): Promise<void> => {
     const impl = new CryptoImplementation();
 
     if (!(operation in impl)) {
@@ -82,6 +82,7 @@ export function handleWorkerMessage(msg: any) {
 
     try {
       const result = (impl as any)[operation](...args);
+      // eslint-disable-next-line @typescript-eslint/no-var-requires
       const worker_threads = require("worker_threads");
       const p = worker_threads.parentPort;
       worker_threads.parentPort?.postMessage;
@@ -101,7 +102,7 @@ export function handleWorkerMessage(msg: any) {
   });
 }
 
-export function handleWorkerError(e: Error) {
+export function handleWorkerError(e: Error): void {
   console.log("got error from worker", e);
 }
 
@@ -135,6 +136,7 @@ class NodeThreadCryptoWorker implements CryptoWorker {
   private nodeWorker: import("worker_threads").Worker;
 
   constructor() {
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
     const worker_threads = require("worker_threads");
     this.nodeWorker = new worker_threads.Worker(workerCode, { eval: true });
     this.nodeWorker.on("error", (err: Error) => {
@@ -168,14 +170,14 @@ class NodeThreadCryptoWorker implements CryptoWorker {
   /**
    * Send a message to the worker thread.
    */
-  postMessage(msg: any) {
+  postMessage(msg: any): void {
     this.nodeWorker.postMessage(msg);
   }
 
   /**
    * Forcibly terminate the worker thread.
    */
-  terminate() {
+  terminate(): void {
     this.nodeWorker.terminate();
   }
 }
diff --git a/src/crypto/workers/synchronousWorker.ts 
b/src/crypto/workers/synchronousWorker.ts
index b453468d..2cc74097 100644
--- a/src/crypto/workers/synchronousWorker.ts
+++ b/src/crypto/workers/synchronousWorker.ts
@@ -70,13 +70,17 @@ export class SynchronousCryptoWorker {
     }
   }
 
-  private dispatchMessage(msg: any) {
+  private dispatchMessage(msg: any): void {
     if (this.onmessage) {
       this.onmessage({ data: msg });
     }
   }
 
-  private async handleRequest(operation: string, id: number, args: string[]) {
+  private async handleRequest(
+    operation: string,
+    id: number,
+    args: string[],
+  ): Promise<void> {
     const impl = new CryptoImplementation();
 
     if (!(operation in impl)) {
@@ -93,7 +97,7 @@ export class SynchronousCryptoWorker {
     }
 
     try {
-      setImmediate(() => this.dispatchMessage({ result, id }));
+      setTimeout(() => this.dispatchMessage({ result, id }), 0);
     } catch (e) {
       console.log("got error during dispatch", e);
     }
@@ -102,7 +106,7 @@ export class SynchronousCryptoWorker {
   /**
    * Send a message to the worker thread.
    */
-  postMessage(msg: any) {
+  postMessage(msg: any): void {
     const args = msg.args;
     if (!Array.isArray(args)) {
       console.error("args must be array");
@@ -127,7 +131,7 @@ export class SynchronousCryptoWorker {
   /**
    * Forcibly terminate the worker thread.
    */
-  terminate() {
+  terminate(): void {
     // This is a no-op.
   }
 }
diff --git a/src/db.ts b/src/db.ts
index da43cf82..18efbf2b 100644
--- a/src/db.ts
+++ b/src/db.ts
@@ -23,7 +23,7 @@ export function openTalerDatabase(
     db: IDBDatabase,
     oldVersion: number,
     newVersion: number,
-  ) => {
+  ): void => {
     switch (oldVersion) {
       case 0: // DB does not exist yet
         for (const n in Stores) {
@@ -53,6 +53,6 @@ export function openTalerDatabase(
   );
 }
 
-export function deleteTalerDatabase(idbFactory: IDBFactory) {
+export function deleteTalerDatabase(idbFactory: IDBFactory): void {
   Database.deleteDatabase(idbFactory, TALER_DB_NAME);
 }
diff --git a/src/headless/bank.ts b/src/headless/bank.ts
index 81b5293b..2177908a 100644
--- a/src/headless/bank.ts
+++ b/src/headless/bank.ts
@@ -95,7 +95,7 @@ export class Bank {
     amount: string,
     reservePub: string,
     exchangePaytoUri: string,
-  ) {
+  ): Promise<void> {
     const reqUrl = new URL("testing/withdraw", this.bankBaseUrl).href;
 
     const body = {
diff --git a/src/headless/clk.ts b/src/headless/clk.ts
index 7d7417ea..a905464b 100644
--- a/src/headless/clk.ts
+++ b/src/headless/clk.ts
@@ -17,14 +17,14 @@
 /**
  * Imports.
  */
-import process = require("process");
-import path = require("path");
-import readline = require("readline");
+import process from "process";
+import path from "path";
+import readline from "readline";
 
 class Converter<T> {}
 
-export let INT = new Converter<number>();
-export let STRING: Converter<string> = new Converter<string>();
+export const INT = new Converter<number>();
+export const STRING: Converter<string> = new Converter<string>();
 
 export interface OptionArgs<T> {
   help?: string;
@@ -90,7 +90,7 @@ function splitOpt(opt: string): { key: string; value?: string 
} {
 }
 
 function formatListing(key: string, value?: string): string {
-  let res = "  " + key;
+  const res = "  " + key;
   if (!value) {
     return res;
   }
@@ -117,7 +117,7 @@ export class CommandGroup<GN extends keyof any, TG> {
     private scArgs: SubcommandArgs,
   ) {}
 
-  action(f: ActionFn<TG>) {
+  action(f: ActionFn<TG>): void {
     if (this.myAction) {
       throw Error("only one action supported per command");
     }
@@ -139,7 +139,7 @@ export class CommandGroup<GN extends keyof any, TG> {
       name: name as string,
     };
     this.options.push(def);
-    for (let flag of flagspec) {
+    for (const flag of flagspec) {
       if (flag.startsWith("--")) {
         const flagname = flag.substring(2);
         this.longOptions[flagname] = def;
@@ -168,7 +168,7 @@ export class CommandGroup<GN extends keyof any, TG> {
       name: name as string,
     };
     this.options.push(def);
-    for (let flag of flagspec) {
+    for (const flag of flagspec) {
       if (flag.startsWith("--")) {
         const flagname = flag.substring(2);
         this.longOptions[flagname] = def;
@@ -225,7 +225,7 @@ export class CommandGroup<GN extends keyof any, TG> {
       name: name as string,
     };
     this.options.push(def);
-    for (let flag of flagspec) {
+    for (const flag of flagspec) {
       if (flag.startsWith("--")) {
         const flagname = flag.substring(2);
         this.longOptions[flagname] = def;
@@ -269,9 +269,9 @@ export class CommandGroup<GN extends keyof any, TG> {
     return cg as any;
   }
 
-  printHelp(progName: string, parents: CommandGroup<any, any>[]) {
+  printHelp(progName: string, parents: CommandGroup<any, any>[]): void {
     let usageSpec = "";
-    for (let p of parents) {
+    for (const p of parents) {
       usageSpec += (p.name ?? progName) + " ";
       if (p.arguments.length >= 1) {
         usageSpec += "<ARGS...> ";
@@ -281,7 +281,7 @@ export class CommandGroup<GN extends keyof any, TG> {
     if (this.subcommands.length != 0) {
       usageSpec += "COMMAND ";
     }
-    for (let a of this.arguments) {
+    for (const a of this.arguments) {
       const argName = a.args.metavar ?? a.name;
       usageSpec += `<${argName}> `;
     }
@@ -294,7 +294,7 @@ export class CommandGroup<GN extends keyof any, TG> {
     if (this.options.length != 0) {
       console.log();
       console.log("Options:");
-      for (let opt of this.options) {
+      for (const opt of this.options) {
         let optSpec = opt.flagspec.join(", ");
         if (!opt.isFlag) {
           optSpec = optSpec + "=VALUE";
@@ -306,7 +306,7 @@ export class CommandGroup<GN extends keyof any, TG> {
     if (this.subcommands.length != 0) {
       console.log();
       console.log("Commands:");
-      for (let subcmd of this.subcommands) {
+      for (const subcmd of this.subcommands) {
         console.log(formatListing(subcmd.name, subcmd.args.help));
       }
     }
@@ -320,7 +320,7 @@ export class CommandGroup<GN extends keyof any, TG> {
     parents: CommandGroup<any, any>[],
     unparsedArgs: string[],
     parsedArgs: any,
-  ) {
+  ): void {
     let posArgIndex = 0;
     let argsTerminated = false;
     let i;
@@ -444,7 +444,7 @@ export class CommandGroup<GN extends keyof any, TG> {
       }
     }
 
-    for (let option of this.options) {
+    for (const option of this.options) {
       if (option.isFlag == false && option.required == true) {
         if (!foundOptions[option.name]) {
           if (option.args.default !== undefined) {
@@ -459,7 +459,7 @@ export class CommandGroup<GN extends keyof any, TG> {
       }
     }
 
-    for (let option of this.options) {
+    for (const option of this.options) {
       const ph = option.args.onPresentHandler;
       if (ph && foundOptions[option.name]) {
         ph(myArgs[option.name]);
@@ -507,7 +507,7 @@ export class Program<PN extends keyof any, T> {
     });
   }
 
-  run() {
+  run(): void {
     const args = process.argv;
     if (args.length < 2) {
       console.error(
diff --git a/src/headless/helpers.ts b/src/headless/helpers.ts
index 92452e78..47a0844b 100644
--- a/src/headless/helpers.ts
+++ b/src/headless/helpers.ts
@@ -28,7 +28,7 @@ import { openTalerDatabase } from "../db";
 import { HttpRequestLibrary } from "../util/http";
 import * as amounts from "../util/amounts";
 import { Bank } from "./bank";
-import fs = require("fs");
+import fs from "fs";
 import { NodeThreadCryptoWorkerFactory } from 
"../crypto/workers/nodeThreadWorker";
 import { WalletNotification, NotificationType } from "../types/notifications";
 import { Database } from "../util/query";
@@ -106,7 +106,7 @@ export async function getDefaultNodeWallet(
     myHttpLib = new NodeHttpLib();
   }
 
-  const myVersionChange = () => {
+  const myVersionChange = (): Promise<void> => {
     console.error("version change requested, should not happen");
     throw Error();
   };
@@ -138,10 +138,10 @@ export async function getDefaultNodeWallet(
 
 export async function withdrawTestBalance(
   myWallet: Wallet,
-  amount: string = "TESTKUDOS:10",
-  bankBaseUrl: string = "https://bank.test.taler.net/";,
-  exchangeBaseUrl: string = "https://exchange.test.taler.net/";,
-) {
+  amount = "TESTKUDOS:10",
+  bankBaseUrl = "https://bank.test.taler.net/";,
+  exchangeBaseUrl = "https://exchange.test.taler.net/";,
+): Promise<void> {
   const reserveResponse = await myWallet.createReserve({
     amount: amounts.parseOrThrow(amount),
     exchange: exchangeBaseUrl,
diff --git a/src/headless/integrationtest.ts b/src/headless/integrationtest.ts
index 6e45b76e..9934f204 100644
--- a/src/headless/integrationtest.ts
+++ b/src/headless/integrationtest.ts
@@ -43,7 +43,7 @@ async function makePayment(
   amount: string,
   summary: string,
 ): Promise<{ orderId: string }> {
-  let orderResp = await merchant.createOrder(
+  const orderResp = await merchant.createOrder(
     amount,
     summary,
     "taler://fulfillment-success/thx",
@@ -60,7 +60,7 @@ async function makePayment(
     throw Error("no taler://pay/ URI in payment response");
   }
 
-  let preparePayResult = await wallet.preparePayForUri(talerPayUri);
+  const preparePayResult = await wallet.preparePayForUri(talerPayUri);
 
   console.log("prepare pay result", preparePayResult);
 
@@ -68,7 +68,7 @@ async function makePayment(
     throw Error("payment not possible");
   }
 
-  let confirmPayResult = await wallet.confirmPay(
+  const confirmPayResult = await wallet.confirmPay(
     preparePayResult.proposalId,
     undefined,
   );
@@ -159,7 +159,7 @@ export async function runIntegrationTest(args: 
IntegrationTestArgs) {
   // Wait until the withdraw is done
   await myWallet.runUntilDone();
 
-  let { orderId: refundOrderId } = await makePayment(
+  const { orderId: refundOrderId } = await makePayment(
     myWallet,
     myMerchant,
     Amounts.stringify(spendAmountTwo),
@@ -299,7 +299,7 @@ export async function runIntegrationTestBasic(cfg: 
Configuration) {
   // Wait until the withdraw is done
   await myWallet.runUntilDone();
 
-  let { orderId: refundOrderId } = await makePayment(
+  const { orderId: refundOrderId } = await makePayment(
     myWallet,
     myMerchant,
     Amounts.stringify(spendAmountTwo),
diff --git a/src/headless/merchant.ts b/src/headless/merchant.ts
index 27e7e3f2..b479c5a8 100644
--- a/src/headless/merchant.ts
+++ b/src/headless/merchant.ts
@@ -65,7 +65,7 @@ export class MerchantBackendConnection {
 
   constructor(public merchantBaseUrl: string, public apiKey: string) {}
 
-  async authorizeTip(amount: string, justification: string) {
+  async authorizeTip(amount: string, justification: string): Promise<string> {
     const reqUrl = new URL("tip-authorize", this.merchantBaseUrl).href;
     const tipReq = {
       amount,
diff --git a/src/headless/taler-wallet-cli.ts b/src/headless/taler-wallet-cli.ts
index d183ef31..3da01a2d 100644
--- a/src/headless/taler-wallet-cli.ts
+++ b/src/headless/taler-wallet-cli.ts
@@ -14,32 +14,26 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import os = require("os");
-import fs = require("fs");
+import os from "os";
+import fs from "fs";
 import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers";
 import { MerchantBackendConnection } from "./merchant";
 import { runIntegrationTest, runIntegrationTestBasic } from 
"./integrationtest";
 import { Wallet } from "../wallet";
-import qrcodeGenerator = require("qrcode-generator");
+import qrcodeGenerator from "qrcode-generator";
 import * as clk from "./clk";
-import { BridgeIDBFactory, MemoryBackend } from "idb-bridge";
+import { BridgeIDBFactory } from "idb-bridge";
 import { Logger } from "../util/logging";
 import { Amounts } from "../util/amounts";
 import { decodeCrock } from "../crypto/talerCrypto";
 import { OperationFailedAndReportedError } from "../operations/errors";
 import { Bank } from "./bank";
 import { classifyTalerUri, TalerUriType } from "../util/taleruri";
-import util = require("util");
 import { Configuration } from "../util/talerconfig";
 import { setDangerousTimetravel } from "../util/time";
 import { makeCodecForList, codecForString } from "../util/codec";
 import { NodeHttpLib } from "./NodeHttpLib";
 
-// Backwards compatibility with nodejs<0.11, where TextEncoder and TextDecoder
-// are not globals yet.
-(global as any).TextEncoder = util.TextEncoder;
-(global as any).TextDecoder = util.TextDecoder;
-
 const logger = new Logger("taler-wallet-cli.ts");
 
 const defaultWalletDbPath = os.homedir + "/" + ".talerwalletdb.json";
@@ -52,7 +46,7 @@ async function doPay(
   wallet: Wallet,
   payUrl: string,
   options: { alwaysYes: boolean } = { alwaysYes: true },
-) {
+): Promise<void> {
   const result = await wallet.preparePayForUri(payUrl);
   if (result.status === "error") {
     console.error("Could not pay:", result.error);
@@ -95,21 +89,22 @@ async function doPay(
   }
 
   if (pay) {
-    const payRes = await wallet.confirmPay(result.proposalId, undefined);
+    await wallet.confirmPay(result.proposalId, undefined);
     console.log("paid!");
   } else {
     console.log("not paying");
   }
 }
 
-function applyVerbose(verbose: boolean) {
+function applyVerbose(verbose: boolean): void {
   if (verbose) {
     console.log("enabled verbose logging");
     BridgeIDBFactory.enableTracing = true;
   }
 }
 
-function printVersion() {
+function printVersion(): void {
+  // eslint-disable-next-line @typescript-eslint/no-var-requires
   const info = require("../../../package.json");
   console.log(`${info.version}`);
   process.exit(0);
@@ -335,7 +330,7 @@ exchangesCli
   .flag("force", ["-f", "--force"])
   .action(async (args) => {
     await withWallet(args, async (wallet) => {
-      const res = await wallet.updateExchangeFromUrl(
+      await wallet.updateExchangeFromUrl(
         args.exchangesUpdateCmd.url,
         args.exchangesUpdateCmd.force,
       );
@@ -599,7 +594,7 @@ testCli
   })
   .action(async (args) => {
     applyVerbose(args.wallet.verbose);
-    let cmdObj = args.integrationtestCmd;
+    const cmdObj = args.integrationtestCmd;
 
     try {
       await runIntegrationTest({
diff --git a/src/i18n/strings-prelude b/src/i18n/strings-prelude
index 147b6c93..aa6602bd 100644
--- a/src/i18n/strings-prelude
+++ b/src/i18n/strings-prelude
@@ -14,4 +14,4 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-export let strings: {[s: string]: any} = {};
+export const strings: {[s: string]: any} = {};
diff --git a/src/i18n/strings.ts b/src/i18n/strings.ts
index 289dcbed..06fb7a89 100644
--- a/src/i18n/strings.ts
+++ b/src/i18n/strings.ts
@@ -14,7 +14,7 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-export let strings: { [s: string]: any } = {};
+export const strings: { [s: string]: any } = {};
 strings["de"] = {
   domain: "messages",
   locale_data: {
diff --git a/src/operations/balance.ts b/src/operations/balance.ts
index 7c2d0e3f..c369af19 100644
--- a/src/operations/balance.ts
+++ b/src/operations/balance.ts
@@ -18,9 +18,9 @@
  * Imports.
  */
 import { WalletBalance, WalletBalanceEntry } from "../types/walletTypes";
-import { Database, TransactionHandle } from "../util/query";
+import { TransactionHandle } from "../util/query";
 import { InternalWalletState } from "./state";
-import { Stores, TipRecord, CoinStatus } from "../types/dbTypes";
+import { Stores, CoinStatus } from "../types/dbTypes";
 import * as Amounts from "../util/amounts";
 import { AmountJson } from "../util/amounts";
 import { Logger } from "../util/logging";
diff --git a/src/operations/exchanges.ts b/src/operations/exchanges.ts
index b9806bb6..a9e5158e 100644
--- a/src/operations/exchanges.ts
+++ b/src/operations/exchanges.ts
@@ -31,7 +31,6 @@ import {
   WireFee,
   ExchangeUpdateReason,
   ExchangeUpdatedEventRecord,
-  CoinStatus,
 } from "../types/dbTypes";
 import { canonicalizeBaseUrl } from "../util/helpers";
 import * as Amounts from "../util/amounts";
@@ -81,7 +80,7 @@ async function setExchangeError(
   err: OperationError,
 ): Promise<void> {
   console.log(`last error for exchange ${baseUrl}:`, err);
-  const mut = (exchange: ExchangeRecord) => {
+  const mut = (exchange: ExchangeRecord): ExchangeRecord => {
     exchange.lastError = err;
     return exchange;
   };
@@ -198,7 +197,7 @@ async function updateExchangeWithKeys(
     ),
   );
 
-  let recoupGroupId: string | undefined = undefined;
+  const recoupGroupId: string | undefined = undefined;
 
   await ws.db.runWithWriteTransaction(
     [Stores.exchanges, Stores.denominations, Stores.recoupGroups, 
Stores.coins],
@@ -284,7 +283,7 @@ async function updateExchangeWithKeys(
 async function updateExchangeFinalize(
   ws: InternalWalletState,
   exchangeBaseUrl: string,
-) {
+): Promise<void> {
   const exchange = await ws.db.get(Stores.exchanges, exchangeBaseUrl);
   if (!exchange) {
     return;
@@ -316,7 +315,7 @@ async function updateExchangeFinalize(
 async function updateExchangeWithTermsOfService(
   ws: InternalWalletState,
   exchangeBaseUrl: string,
-) {
+): Promise<void> {
   const exchange = await ws.db.get(Stores.exchanges, exchangeBaseUrl);
   if (!exchange) {
     return;
@@ -357,7 +356,7 @@ export async function acceptExchangeTermsOfService(
   ws: InternalWalletState,
   exchangeBaseUrl: string,
   etag: string | undefined,
-) {
+): Promise<void> {
   await ws.db.runWithWriteTransaction([Stores.exchanges], async (tx) => {
     const r = await tx.get(Stores.exchanges, exchangeBaseUrl);
     if (!r) {
@@ -377,7 +376,7 @@ export async function acceptExchangeTermsOfService(
 async function updateExchangeWithWireInfo(
   ws: InternalWalletState,
   exchangeBaseUrl: string,
-) {
+): Promise<void> {
   const exchange = await ws.db.get(Stores.exchanges, exchangeBaseUrl);
   if (!exchange) {
     return;
@@ -459,9 +458,10 @@ async function updateExchangeWithWireInfo(
 export async function updateExchangeFromUrl(
   ws: InternalWalletState,
   baseUrl: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<ExchangeRecord> {
-  const onOpErr = (e: OperationError) => setExchangeError(ws, baseUrl, e);
+  const onOpErr = (e: OperationError): Promise<void> =>
+    setExchangeError(ws, baseUrl, e);
   return await guardOperationException(
     () => updateExchangeFromUrlImpl(ws, baseUrl, forceNow),
     onOpErr,
@@ -476,7 +476,7 @@ export async function updateExchangeFromUrl(
 async function updateExchangeFromUrlImpl(
   ws: InternalWalletState,
   baseUrl: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<ExchangeRecord> {
   const now = getTimestampNow();
   baseUrl = canonicalizeBaseUrl(baseUrl);
@@ -583,7 +583,7 @@ export async function getExchangePaytoUri(
   if (!exchangeWireInfo) {
     throw Error(`Exchange wire info for '${exchangeBaseUrl}' not found.`);
   }
-  for (let account of exchangeWireInfo.accounts) {
+  for (const account of exchangeWireInfo.accounts) {
     const res = parsePaytoUri(account.payto_uri);
     if (!res) {
       continue;
diff --git a/src/operations/history.ts b/src/operations/history.ts
index edb4d9f2..efbfbf37 100644
--- a/src/operations/history.ts
+++ b/src/operations/history.ts
@@ -20,11 +20,9 @@
 import { InternalWalletState } from "./state";
 import {
   Stores,
-  TipRecord,
   ProposalStatus,
   ProposalRecord,
   PlanchetRecord,
-  CoinRecord,
 } from "../types/dbTypes";
 import { Amounts } from "../util/amounts";
 import { AmountJson } from "../util/amounts";
@@ -40,14 +38,14 @@ import {
   VerboseRefreshDetails,
 } from "../types/history";
 import { assertUnreachable } from "../util/assertUnreachable";
-import { TransactionHandle, Store } from "../util/query";
+import { TransactionHandle } from "../util/query";
 import { timestampCmp } from "../util/time";
 import { summarizeReserveHistory } from "../util/reserveHistoryUtil";
 
 /**
  * Create an event ID from the type and the primary key for the event.
  */
-function makeEventId(type: HistoryEventType, ...args: string[]) {
+function makeEventId(type: HistoryEventType, ...args: string[]): string {
   return type + ";" + args.map((x) => encodeURIComponent(x)).join(";");
 }
 
@@ -72,7 +70,7 @@ async function collectProposalHistory(
   tx: TransactionHandle,
   history: HistoryEvent[],
   historyQuery?: HistoryQuery,
-) {
+): Promise<void> {
   tx.iter(Stores.proposals).forEachAsync(async (proposal) => {
     const status = proposal.proposalStatus;
     switch (status) {
@@ -333,7 +331,7 @@ export async function getHistory(
             amountsRaw.push(c.currentAmount);
           }
         }
-        let amountRefreshedRaw = Amounts.sum(amountsRaw).amount;
+        const amountRefreshedRaw = Amounts.sum(amountsRaw).amount;
         let amountRefreshedEffective: AmountJson;
         if (amountsEffective.length == 0) {
           amountRefreshedEffective = Amounts.getZero(
diff --git a/src/operations/pay.ts b/src/operations/pay.ts
index 9b9d2fa9..337068b5 100644
--- a/src/operations/pay.ts
+++ b/src/operations/pay.ts
@@ -198,8 +198,8 @@ export function selectPayCoins(
   let totalFees = Amounts.getZero(currency);
   let amountPayRemaining = paymentAmount;
   let amountDepositFeeLimitRemaining = depositFeeLimit;
-  let customerWireFees = Amounts.getZero(currency);
-  let customerDepositFees = Amounts.getZero(currency);
+  const customerWireFees = Amounts.getZero(currency);
+  const customerDepositFees = Amounts.getZero(currency);
   for (const aci of acis) {
     // Don't use this coin if depositing it is more expensive than
     // the amount it would give the merchant.
@@ -283,7 +283,7 @@ async function getCoinsForPayment(
   const exchanges = await ws.db.iter(Stores.exchanges).toArray();
 
   for (const exchange of exchanges) {
-    let isOkay: boolean = false;
+    let isOkay = false;
     const exchangeDetails = exchange.details;
     if (!exchangeDetails) {
       continue;
@@ -618,9 +618,9 @@ async function incrementPurchasePayRetry(
 export async function processDownloadProposal(
   ws: InternalWalletState,
   proposalId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (err: OperationError) =>
+  const onOpErr = (err: OperationError): Promise<void> =>
     incrementProposalRetry(ws, proposalId, err);
   await guardOperationException(
     () => processDownloadProposalImpl(ws, proposalId, forceNow),
@@ -631,7 +631,7 @@ export async function processDownloadProposal(
 async function resetDownloadProposalRetry(
   ws: InternalWalletState,
   proposalId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.proposals, proposalId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
@@ -1106,9 +1106,9 @@ export async function confirmPay(
 export async function processPurchasePay(
   ws: InternalWalletState,
   proposalId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (e: OperationError) =>
+  const onOpErr = (e: OperationError): Promise<void> =>
     incrementPurchasePayRetry(ws, proposalId, e);
   await guardOperationException(
     () => processPurchasePayImpl(ws, proposalId, forceNow),
@@ -1119,7 +1119,7 @@ export async function processPurchasePay(
 async function resetPurchasePayRetry(
   ws: InternalWalletState,
   proposalId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.payRetryInfo.active) {
       x.payRetryInfo = initRetryInfo();
@@ -1150,7 +1150,7 @@ async function processPurchasePayImpl(
 export async function refuseProposal(
   ws: InternalWalletState,
   proposalId: string,
-) {
+): Promise<void> {
   const success = await ws.db.runWithWriteTransaction(
     [Stores.proposals],
     async (tx) => {
diff --git a/src/operations/pending.ts b/src/operations/pending.ts
index 106e5053..3e548a27 100644
--- a/src/operations/pending.ts
+++ b/src/operations/pending.ts
@@ -37,7 +37,7 @@ import {
 } from "../util/time";
 import { TransactionHandle } from "../util/query";
 import { InternalWalletState } from "./state";
-import { getBalances, getBalancesInsideTransaction } from "./balance";
+import { getBalancesInsideTransaction } from "./balance";
 import { ReserveType } from "../types/history";
 
 function updateRetryDelay(
@@ -54,7 +54,7 @@ async function gatherExchangePending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   if (onlyDue) {
     // FIXME: exchanges should also be updated regularly
@@ -146,7 +146,7 @@ async function gatherReservePending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   // FIXME: this should be optimized by using an index for "onlyDue==true".
   await tx.iter(Stores.reserves).forEach((reserve) => {
@@ -215,7 +215,7 @@ async function gatherRefreshPending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.refreshGroups).forEach((r) => {
     if (r.timestampFinished) {
@@ -244,7 +244,7 @@ async function gatherWithdrawalPending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.withdrawalGroups).forEach((wsr) => {
     if (wsr.timestampFinish) {
@@ -279,20 +279,30 @@ async function gatherProposalPending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.proposals).forEach((proposal) => {
     if (proposal.proposalStatus == ProposalStatus.PROPOSED) {
       if (onlyDue) {
         return;
       }
-      resp.pendingOperations.push({
-        type: PendingOperationType.ProposalChoice,
-        givesLifeness: false,
-        merchantBaseUrl: proposal.download!!.contractData.merchantBaseUrl,
-        proposalId: proposal.proposalId,
-        proposalTimestamp: proposal.timestamp,
-      });
+      const dl = proposal.download;
+      if (!dl) {
+        resp.pendingOperations.push({
+          type: PendingOperationType.Bug,
+          message: "proposal is in invalid state",
+          details: {},
+          givesLifeness: false,
+        });
+      } else {
+        resp.pendingOperations.push({
+          type: PendingOperationType.ProposalChoice,
+          givesLifeness: false,
+          merchantBaseUrl: dl.contractData.merchantBaseUrl,
+          proposalId: proposal.proposalId,
+          proposalTimestamp: proposal.timestamp,
+        });
+      }
     } else if (proposal.proposalStatus == ProposalStatus.DOWNLOADING) {
       resp.nextRetryDelay = updateRetryDelay(
         resp.nextRetryDelay,
@@ -320,7 +330,7 @@ async function gatherTipPending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.tips).forEach((tip) => {
     if (tip.pickedUp) {
@@ -350,7 +360,7 @@ async function gatherPurchasePending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.purchases).forEach((pr) => {
     if (pr.paymentSubmitPending) {
@@ -413,7 +423,7 @@ async function gatherRecoupPending(
   tx: TransactionHandle,
   now: Timestamp,
   resp: PendingOperationsResponse,
-  onlyDue: boolean = false,
+  onlyDue = false,
 ): Promise<void> {
   await tx.iter(Stores.recoupGroups).forEach((rg) => {
     if (rg.timestampFinished) {
diff --git a/src/operations/recoup.ts b/src/operations/recoup.ts
index e13ae3c1..e1c2325d 100644
--- a/src/operations/recoup.ts
+++ b/src/operations/recoup.ts
@@ -279,7 +279,7 @@ async function recoupRefreshCoin(
 async function resetRecoupGroupRetry(
   ws: InternalWalletState,
   recoupGroupId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.recoupGroups, recoupGroupId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
@@ -291,10 +291,10 @@ async function resetRecoupGroupRetry(
 export async function processRecoupGroup(
   ws: InternalWalletState,
   recoupGroupId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
   await ws.memoProcessRecoup.memo(recoupGroupId, async () => {
-    const onOpErr = (e: OperationError) =>
+    const onOpErr = (e: OperationError): Promise<void> =>
       incrementRecoupRetry(ws, recoupGroupId, e);
     return await guardOperationException(
       async () => await processRecoupGroupImpl(ws, recoupGroupId, forceNow),
@@ -306,7 +306,7 @@ export async function processRecoupGroup(
 async function processRecoupGroupImpl(
   ws: InternalWalletState,
   recoupGroupId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
   if (forceNow) {
     await resetRecoupGroupRetry(ws, recoupGroupId);
@@ -386,7 +386,7 @@ async function processRecoup(
 
   const coinPub = recoupGroup.coinPubs[coinIdx];
 
-  let coin = await ws.db.get(Stores.coins, coinPub);
+  const coin = await ws.db.get(Stores.coins, coinPub);
   if (!coin) {
     throw Error(`Coin ${coinPub} not found, can't request payback`);
   }
diff --git a/src/operations/refresh.ts b/src/operations/refresh.ts
index be4f5c5a..92476933 100644
--- a/src/operations/refresh.ts
+++ b/src/operations/refresh.ts
@@ -28,7 +28,7 @@ import {
   CoinSourceType,
 } from "../types/dbTypes";
 import { amountToPretty } from "../util/helpers";
-import { Database, TransactionHandle } from "../util/query";
+import { TransactionHandle } from "../util/query";
 import { InternalWalletState } from "./state";
 import { Logger } from "../util/logging";
 import { getWithdrawDenomList } from "./withdraw";
@@ -390,8 +390,7 @@ async function refreshReveal(
       console.error("denom not found");
       continue;
     }
-    const pc =
-      refreshSession.planchetsForGammas[refreshSession.norevealIndex!][i];
+    const pc = refreshSession.planchetsForGammas[norevealIndex][i];
     const denomSig = await ws.cryptoApi.rsaUnblind(
       respJson.ev_sigs[i].ev_sig,
       pc.blindingKey,
@@ -446,7 +445,7 @@ async function refreshReveal(
         rg.timestampFinished = getTimestampNow();
         rg.retryInfo = initRetryInfo(false);
       }
-      for (let coin of coins) {
+      for (const coin of coins) {
         await tx.put(Stores.coins, coin);
       }
       await tx.put(Stores.refreshGroups, rg);
@@ -482,10 +481,10 @@ async function incrementRefreshRetry(
 export async function processRefreshGroup(
   ws: InternalWalletState,
   refreshGroupId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
   await ws.memoProcessRefresh.memo(refreshGroupId, async () => {
-    const onOpErr = (e: OperationError) =>
+    const onOpErr = (e: OperationError): Promise<void> =>
       incrementRefreshRetry(ws, refreshGroupId, e);
     return await guardOperationException(
       async () => await processRefreshGroupImpl(ws, refreshGroupId, forceNow),
@@ -497,7 +496,7 @@ export async function processRefreshGroup(
 async function resetRefreshGroupRetry(
   ws: InternalWalletState,
   refreshSessionId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.refreshGroups, refreshSessionId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
@@ -510,7 +509,7 @@ async function processRefreshGroupImpl(
   ws: InternalWalletState,
   refreshGroupId: string,
   forceNow: boolean,
-) {
+): Promise<void> {
   if (forceNow) {
     await resetRefreshGroupRetry(ws, refreshGroupId);
   }
@@ -532,7 +531,7 @@ async function processRefreshSession(
   ws: InternalWalletState,
   refreshGroupId: string,
   coinIndex: number,
-) {
+): Promise<void> {
   logger.trace(
     `processing refresh session for coin ${coinIndex} of group 
${refreshGroupId}`,
   );
diff --git a/src/operations/refund.ts b/src/operations/refund.ts
index f0fec406..8feb2bae 100644
--- a/src/operations/refund.ts
+++ b/src/operations/refund.ts
@@ -300,9 +300,9 @@ export async function applyRefund(
 export async function processPurchaseQueryRefund(
   ws: InternalWalletState,
   proposalId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (e: OperationError) =>
+  const onOpErr = (e: OperationError): Promise<void> =>
     incrementPurchaseQueryRefundRetry(ws, proposalId, e);
   await guardOperationException(
     () => processPurchaseQueryRefundImpl(ws, proposalId, forceNow),
@@ -313,7 +313,7 @@ export async function processPurchaseQueryRefund(
 async function resetPurchaseQueryRefundRetry(
   ws: InternalWalletState,
   proposalId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.refundStatusRetryInfo.active) {
       x.refundStatusRetryInfo = initRetryInfo();
@@ -366,9 +366,9 @@ async function processPurchaseQueryRefundImpl(
 export async function processPurchaseApplyRefund(
   ws: InternalWalletState,
   proposalId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (e: OperationError) =>
+  const onOpErr = (e: OperationError): Promise<void> =>
     incrementPurchaseApplyRefundRetry(ws, proposalId, e);
   await guardOperationException(
     () => processPurchaseApplyRefundImpl(ws, proposalId, forceNow),
@@ -379,7 +379,7 @@ export async function processPurchaseApplyRefund(
 async function resetPurchaseApplyRefundRetry(
   ws: InternalWalletState,
   proposalId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.refundApplyRetryInfo.active) {
       x.refundApplyRetryInfo = initRetryInfo();
@@ -435,11 +435,10 @@ async function processPurchaseApplyRefundImpl(
         // We're too late, refund is expired.
         newRefundsFailed[pk] = info;
         break;
-      default:
+      default: {
         let body: string | null = null;
-        try {
-          body = await resp.json();
-        } catch {}
+        // FIXME: error handling!
+        body = await resp.json();
         const m = "refund request (at exchange) failed";
         throw new OperationFailedError({
           message: m,
@@ -448,6 +447,7 @@ async function processPurchaseApplyRefundImpl(
             body,
           },
         });
+      }
     }
   }
   let allRefundsProcessed = false;
@@ -460,12 +460,12 @@ async function processPurchaseApplyRefundImpl(
       }
 
       // Groups that failed/succeeded
-      let groups: { [refundGroupId: string]: boolean } = {};
+      const groups: { [refundGroupId: string]: boolean } = {};
 
       // Avoid duplicates
       const refreshCoinsMap: { [coinPub: string]: CoinPublicKey } = {};
 
-      const modCoin = async (perm: MerchantRefundPermission) => {
+      const modCoin = async (perm: MerchantRefundPermission): Promise<void> => 
{
         const c = await tx.get(Stores.coins, perm.coin_pub);
         if (!c) {
           console.warn("coin not found, can't apply refund");
diff --git a/src/operations/reserves.ts b/src/operations/reserves.ts
index 5c299d11..153ad6b8 100644
--- a/src/operations/reserves.ts
+++ b/src/operations/reserves.ts
@@ -44,10 +44,7 @@ import {
   getExchangeTrust,
   getExchangePaytoUri,
 } from "./exchanges";
-import {
-  WithdrawOperationStatusResponse,
-  codecForWithdrawOperationStatusResponse,
-} from "../types/talerTypes";
+import { codecForWithdrawOperationStatusResponse } from "../types/talerTypes";
 import { assertUnreachable } from "../util/assertUnreachable";
 import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
 import { randomBytes } from "../crypto/primitives/nacl-fast";
@@ -71,7 +68,10 @@ import {
 
 const logger = new Logger("reserves.ts");
 
-async function resetReserveRetry(ws: InternalWalletState, reservePub: string) {
+async function resetReserveRetry(
+  ws: InternalWalletState,
+  reservePub: string,
+): Promise<void> {
   await ws.db.mutate(Stores.reserves, reservePub, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
@@ -101,8 +101,6 @@ export async function createReserve(
     reserveStatus = ReserveRecordStatus.UNCONFIRMED;
   }
 
-  const currency = req.amount.currency;
-
   const reserveRecord: ReserveRecord = {
     timestampCreated: now,
     exchangeBaseUrl: canonExchange,
@@ -248,10 +246,10 @@ export async function forceQueryReserve(
 export async function processReserve(
   ws: InternalWalletState,
   reservePub: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
   return ws.memoProcessReserve.memo(reservePub, async () => {
-    const onOpError = (err: OperationError) =>
+    const onOpError = (err: OperationError): Promise<void> =>
       incrementReserveRetry(ws, reservePub, err);
     await guardOperationException(
       () => processReserveImpl(ws, reservePub, forceNow),
@@ -264,7 +262,7 @@ async function registerReserveWithBank(
   ws: InternalWalletState,
   reservePub: string,
 ): Promise<void> {
-  let reserve = await ws.db.get(Stores.reserves, reservePub);
+  const reserve = await ws.db.get(Stores.reserves, reservePub);
   switch (reserve?.reserveStatus) {
     case ReserveRecordStatus.WAIT_CONFIRM_BANK:
     case ReserveRecordStatus.REGISTERING_BANK:
@@ -280,7 +278,8 @@ async function registerReserveWithBank(
   if (reserve.timestampReserveInfoPosted) {
     throw Error("bank claims that reserve info selection is not done");
   }
-  const bankResp = await ws.http.postJson(bankStatusUrl, {
+  // FIXME: parse bank response
+  await ws.http.postJson(bankStatusUrl, {
     reserve_pub: reservePub,
     selected_exchange: reserve.exchangeWire,
   });
@@ -305,7 +304,7 @@ export async function processReserveBankStatus(
   ws: InternalWalletState,
   reservePub: string,
 ): Promise<void> {
-  const onOpError = (err: OperationError) =>
+  const onOpError = (err: OperationError): Promise<void> =>
     incrementReserveRetry(ws, reservePub, err);
   await guardOperationException(
     () => processReserveBankStatusImpl(ws, reservePub),
@@ -317,7 +316,7 @@ async function processReserveBankStatusImpl(
   ws: InternalWalletState,
   reservePub: string,
 ): Promise<void> {
-  let reserve = await ws.db.get(Stores.reserves, reservePub);
+  const reserve = await ws.db.get(Stores.reserves, reservePub);
   switch (reserve?.reserveStatus) {
     case ReserveRecordStatus.WAIT_CONFIRM_BANK:
     case ReserveRecordStatus.REGISTERING_BANK:
@@ -330,20 +329,13 @@ async function processReserveBankStatusImpl(
     return;
   }
 
-  let status: WithdrawOperationStatusResponse;
-  try {
-    const statusResp = await ws.http.get(bankStatusUrl);
-    if (statusResp.status !== 200) {
-      throw Error(
-        `unexpected status ${statusResp.status} for bank status query`,
-      );
-    }
-    status = codecForWithdrawOperationStatusResponse().decode(
-      await statusResp.json(),
-    );
-  } catch (e) {
-    throw e;
+  const statusResp = await ws.http.get(bankStatusUrl);
+  if (statusResp.status !== 200) {
+    throw Error(`unexpected status ${statusResp.status} for bank status 
query`);
   }
+  const status = codecForWithdrawOperationStatusResponse().decode(
+    await statusResp.json(),
+  );
 
   ws.notify({ type: NotificationType.Wildcard });
 
@@ -534,7 +526,7 @@ async function updateReserve(
 async function processReserveImpl(
   ws: InternalWalletState,
   reservePub: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
   const reserve = await ws.db.get(Stores.reserves, reservePub);
   if (!reserve) {
diff --git a/src/operations/state.ts b/src/operations/state.ts
index f571fe93..97d59124 100644
--- a/src/operations/state.ts
+++ b/src/operations/state.ts
@@ -49,13 +49,13 @@ export class InternalWalletState {
     this.cryptoApi = new CryptoApi(cryptoWorkerFactory);
   }
 
-  public notify(n: WalletNotification) {
+  public notify(n: WalletNotification): void {
     logger.trace("Notification", n);
     for (const l of this.listeners) {
       const nc = JSON.parse(JSON.stringify(n));
-      setImmediate(() => {
+      setTimeout(() => {
         l(nc);
-      });
+      }, 0);
     }
   }
 
diff --git a/src/operations/tip.ts b/src/operations/tip.ts
index 7bfbddb6..6f492ea3 100644
--- a/src/operations/tip.ts
+++ b/src/operations/tip.ts
@@ -18,9 +18,7 @@ import { InternalWalletState } from "./state";
 import { parseTipUri } from "../util/taleruri";
 import { TipStatus, OperationError } from "../types/walletTypes";
 import {
-  TipPickupGetResponse,
   TipPlanchetDetail,
-  TipResponse,
   codecForTipPickupGetResponse,
   codecForTipResponse,
 } from "../types/talerTypes";
@@ -66,7 +64,7 @@ export async function getTipStatus(
 
   console.log("status", tipPickupStatus);
 
-  let amount = Amounts.parseOrThrow(tipPickupStatus.amount);
+  const amount = Amounts.parseOrThrow(tipPickupStatus.amount);
 
   let tipRecord = await ws.db.get(Stores.tips, [
     res.merchantTipId,
@@ -147,9 +145,10 @@ async function incrementTipRetry(
 export async function processTip(
   ws: InternalWalletState,
   tipId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (e: OperationError) => incrementTipRetry(ws, tipId, e);
+  const onOpErr = (e: OperationError): Promise<void> =>
+    incrementTipRetry(ws, tipId, e);
   await guardOperationException(
     () => processTipImpl(ws, tipId, forceNow),
     onOpErr,
@@ -172,7 +171,7 @@ async function processTipImpl(
   ws: InternalWalletState,
   tipId: string,
   forceNow: boolean,
-) {
+): Promise<void> {
   if (forceNow) {
     await resetTipRetry(ws, tipId);
   }
diff --git a/src/operations/withdraw.ts b/src/operations/withdraw.ts
index fcd9d70c..1f5bfd0b 100644
--- a/src/operations/withdraw.ts
+++ b/src/operations/withdraw.ts
@@ -21,7 +21,6 @@ import {
   DenominationStatus,
   CoinStatus,
   CoinRecord,
-  PlanchetRecord,
   initRetryInfo,
   updateRetryInfoTimeout,
   CoinSourceType,
@@ -52,14 +51,10 @@ import {
   timestampCmp,
   timestampSubtractDuraction,
 } from "../util/time";
-import {
-  summarizeReserveHistory,
-  ReserveHistorySummary,
-} from "../util/reserveHistoryUtil";
 
 const logger = new Logger("withdraw.ts");
 
-function isWithdrawableDenom(d: DenominationRecord) {
+function isWithdrawableDenom(d: DenominationRecord): boolean {
   const now = getTimestampNow();
   const started = timestampCmp(now, d.stampStart) >= 0;
   const lastPossibleWithdraw = timestampSubtractDuraction(
@@ -175,8 +170,6 @@ async function processPlanchet(
   if (withdrawalGroup.withdrawn[coinIdx]) {
     return;
   }
-  if (withdrawalGroup.source.type === "reserve") {
-  }
   const planchet = withdrawalGroup.planchets[coinIdx];
   if (!planchet) {
     console.log("processPlanchet: planchet not found");
@@ -248,7 +241,6 @@ async function processPlanchet(
   };
 
   let withdrawalGroupFinished = false;
-  let summary: ReserveHistorySummary | undefined = undefined;
 
   const success = await ws.db.runWithWriteTransaction(
     [Stores.coins, Stores.withdrawalGroups, Stores.reserves],
@@ -276,12 +268,6 @@ async function processPlanchet(
         withdrawalGroupFinished = true;
       }
       await tx.put(Stores.withdrawalGroups, ws);
-      if (!planchet.isFromTip) {
-        const r = await tx.get(Stores.reserves, planchet.reservePub);
-        if (r) {
-          summary = summarizeReserveHistory(r.reserveTransactions, r.currency);
-        }
-      }
       await tx.add(Stores.coins, coin);
       return true;
     },
@@ -394,9 +380,9 @@ async function incrementWithdrawalRetry(
 export async function processWithdrawGroup(
   ws: InternalWalletState,
   withdrawalGroupId: string,
-  forceNow: boolean = false,
+  forceNow = false,
 ): Promise<void> {
-  const onOpErr = (e: OperationError) =>
+  const onOpErr = (e: OperationError): Promise<void> =>
     incrementWithdrawalRetry(ws, withdrawalGroupId, e);
   await guardOperationException(
     () => processWithdrawGroupImpl(ws, withdrawalGroupId, forceNow),
@@ -407,7 +393,7 @@ export async function processWithdrawGroup(
 async function resetWithdrawalGroupRetry(
   ws: InternalWalletState,
   withdrawalGroupId: string,
-) {
+): Promise<void> {
   await ws.db.mutate(Stores.withdrawalGroups, withdrawalGroupId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
@@ -470,7 +456,7 @@ export async function getExchangeWithdrawalInfo(
     .reduce((a, b) => Amounts.add(a, b).amount);
 
   const exchangeWireAccounts: string[] = [];
-  for (let account of exchangeWireInfo.accounts) {
+  for (const account of exchangeWireInfo.accounts) {
     exchangeWireAccounts.push(account.payto_uri);
   }
 
diff --git a/src/types/ReserveStatus.ts b/src/types/ReserveStatus.ts
index 8ab7225e..18601b9a 100644
--- a/src/types/ReserveStatus.ts
+++ b/src/types/ReserveStatus.ts
@@ -23,11 +23,9 @@
  */
 import {
   codecForString,
-  typecheckedCodec,
   makeCodecForObject,
-  makeCodecForConstString,
-  makeCodecForUnion,
   makeCodecForList,
+  Codec,
 } from "../util/codec";
 import { AmountString } from "./talerTypes";
 import {
@@ -52,10 +50,8 @@ export interface ReserveStatus {
   history: ReserveTransaction[];
 }
 
-export const codecForReserveStatus = () =>
-  typecheckedCodec<ReserveStatus>(
-    makeCodecForObject<ReserveStatus>()
-      .property("balance", codecForString)
-      .property("history", makeCodecForList(codecForReserveTransaction()))
-      .build("ReserveStatus"),
-  );
+export const codecForReserveStatus = (): Codec<ReserveStatus> =>
+  makeCodecForObject<ReserveStatus>()
+    .property("balance", codecForString)
+    .property("history", makeCodecForList(codecForReserveTransaction()))
+    .build("ReserveStatus");
diff --git a/src/types/ReserveTransaction.ts b/src/types/ReserveTransaction.ts
index cebccd2d..bdd9b0f9 100644
--- a/src/types/ReserveTransaction.ts
+++ b/src/types/ReserveTransaction.ts
@@ -23,10 +23,10 @@
  */
 import {
   codecForString,
-  typecheckedCodec,
   makeCodecForObject,
   makeCodecForConstString,
   makeCodecForUnion,
+  Codec,
 } from "../util/codec";
 import {
   AmountString,
@@ -179,77 +179,72 @@ export type ReserveTransaction =
   | ReserveClosingTransaction
   | ReserveRecoupTransaction;
 
-export const codecForReserveWithdrawTransaction = () =>
-  typecheckedCodec<ReserveWithdrawTransaction>(
-    makeCodecForObject<ReserveWithdrawTransaction>()
-      .property("amount", codecForString)
-      .property("h_coin_envelope", codecForString)
-      .property("h_denom_pub", codecForString)
-      .property("reserve_sig", codecForString)
-      .property(
-        "type",
-        makeCodecForConstString(ReserveTransactionType.Withdraw),
-      )
-      .property("withdraw_fee", codecForString)
-      .build("ReserveWithdrawTransaction"),
-  );
-
-export const codecForReserveCreditTransaction = () =>
-  typecheckedCodec<ReserveCreditTransaction>(
-    makeCodecForObject<ReserveCreditTransaction>()
-      .property("amount", codecForString)
-      .property("sender_account_url", codecForString)
-      .property("timestamp", codecForTimestamp)
-      .property("wire_reference", codecForString)
-      .property("type", makeCodecForConstString(ReserveTransactionType.Credit))
-      .build("ReserveCreditTransaction"),
-  );
-
-export const codecForReserveClosingTransaction = () =>
-  typecheckedCodec<ReserveClosingTransaction>(
-    makeCodecForObject<ReserveClosingTransaction>()
-      .property("amount", codecForString)
-      .property("closing_fee", codecForString)
-      .property("exchange_pub", codecForString)
-      .property("exchange_sig", codecForString)
-      .property("h_wire", codecForString)
-      .property("timestamp", codecForTimestamp)
-      .property("type", 
makeCodecForConstString(ReserveTransactionType.Closing))
-      .property("wtid", codecForString)
-      .build("ReserveClosingTransaction"),
-  );
-
-export const codecForReserveRecoupTransaction = () =>
-  typecheckedCodec<ReserveRecoupTransaction>(
-    makeCodecForObject<ReserveRecoupTransaction>()
-      .property("amount", codecForString)
-      .property("coin_pub", codecForString)
-      .property("exchange_pub", codecForString)
-      .property("exchange_sig", codecForString)
-      .property("timestamp", codecForTimestamp)
-      .property("type", makeCodecForConstString(ReserveTransactionType.Recoup))
-      .build("ReserveRecoupTransaction"),
-  );
-
-export const codecForReserveTransaction = () =>
-  typecheckedCodec<ReserveTransaction>(
-    makeCodecForUnion<ReserveTransaction>()
-      .discriminateOn("type")
-      .alternative(
-        ReserveTransactionType.Withdraw,
-        codecForReserveWithdrawTransaction(),
-      )
-      .alternative(
-        ReserveTransactionType.Closing,
-        codecForReserveClosingTransaction(),
-      )
-      .alternative(
-        ReserveTransactionType.Recoup,
-        codecForReserveRecoupTransaction(),
-      )
-      .alternative(
-        ReserveTransactionType.Credit,
-        codecForReserveCreditTransaction(),
-      )
-      .build<ReserveTransaction>("ReserveTransaction"),
-  );
+export const codecForReserveWithdrawTransaction = (): Codec<
+  ReserveWithdrawTransaction
+> =>
+  makeCodecForObject<ReserveWithdrawTransaction>()
+    .property("amount", codecForString)
+    .property("h_coin_envelope", codecForString)
+    .property("h_denom_pub", codecForString)
+    .property("reserve_sig", codecForString)
+    .property("type", makeCodecForConstString(ReserveTransactionType.Withdraw))
+    .property("withdraw_fee", codecForString)
+    .build("ReserveWithdrawTransaction");
+
+export const codecForReserveCreditTransaction = (): Codec<
+  ReserveCreditTransaction
+> =>
+  makeCodecForObject<ReserveCreditTransaction>()
+    .property("amount", codecForString)
+    .property("sender_account_url", codecForString)
+    .property("timestamp", codecForTimestamp)
+    .property("wire_reference", codecForString)
+    .property("type", makeCodecForConstString(ReserveTransactionType.Credit))
+    .build("ReserveCreditTransaction");
+
+export const codecForReserveClosingTransaction = (): Codec<
+  ReserveClosingTransaction
+> =>
+  makeCodecForObject<ReserveClosingTransaction>()
+    .property("amount", codecForString)
+    .property("closing_fee", codecForString)
+    .property("exchange_pub", codecForString)
+    .property("exchange_sig", codecForString)
+    .property("h_wire", codecForString)
+    .property("timestamp", codecForTimestamp)
+    .property("type", makeCodecForConstString(ReserveTransactionType.Closing))
+    .property("wtid", codecForString)
+    .build("ReserveClosingTransaction");
+
+export const codecForReserveRecoupTransaction = (): Codec<
+  ReserveRecoupTransaction
+> =>
+  makeCodecForObject<ReserveRecoupTransaction>()
+    .property("amount", codecForString)
+    .property("coin_pub", codecForString)
+    .property("exchange_pub", codecForString)
+    .property("exchange_sig", codecForString)
+    .property("timestamp", codecForTimestamp)
+    .property("type", makeCodecForConstString(ReserveTransactionType.Recoup))
+    .build("ReserveRecoupTransaction");
+
+export const codecForReserveTransaction = (): Codec<ReserveTransaction> =>
+  makeCodecForUnion<ReserveTransaction>()
+    .discriminateOn("type")
+    .alternative(
+      ReserveTransactionType.Withdraw,
+      codecForReserveWithdrawTransaction(),
+    )
+    .alternative(
+      ReserveTransactionType.Closing,
+      codecForReserveClosingTransaction(),
+    )
+    .alternative(
+      ReserveTransactionType.Recoup,
+      codecForReserveRecoupTransaction(),
+    )
+    .alternative(
+      ReserveTransactionType.Credit,
+      codecForReserveCreditTransaction(),
+    )
+    .build<ReserveTransaction>("ReserveTransaction");
diff --git a/src/types/dbTypes.ts b/src/types/dbTypes.ts
index f94fb6c6..009b0531 100644
--- a/src/types/dbTypes.ts
+++ b/src/types/dbTypes.ts
@@ -43,7 +43,6 @@ import {
   ReserveRecoupTransaction,
 } from "./ReserveTransaction";
 import { Timestamp, Duration, getTimestampNow } from "../util/time";
-import { Wallet } from "../wallet";
 
 export enum ReserveRecordStatus {
   /**
@@ -117,7 +116,7 @@ export function updateRetryInfoTimeout(
 }
 
 export function initRetryInfo(
-  active: boolean = true,
+  active = true,
   p: RetryPolicy = defaultRetryPolicy,
 ): RetryInfo {
   if (!active) {
@@ -1524,6 +1523,7 @@ export class WalletImportRecord {
 /**
  * The stores and indices for the wallet database.
  */
+// eslint-disable-next-line @typescript-eslint/no-namespace
 export namespace Stores {
   class ExchangesStore extends Store<ExchangeRecord> {
     constructor() {
diff --git a/src/types/history.ts b/src/types/history.ts
index 8179f626..a5f4e9d3 100644
--- a/src/types/history.ts
+++ b/src/types/history.ts
@@ -22,7 +22,6 @@
  * Imports.
  */
 import { RefreshReason } from "./walletTypes";
-import { ReserveTransaction } from "./ReserveTransaction";
 import { WithdrawalSource } from "./dbTypes";
 import { Timestamp } from "../util/time";
 
diff --git a/src/types/notifications.ts b/src/types/notifications.ts
index 05d3c273..3cd5be89 100644
--- a/src/types/notifications.ts
+++ b/src/types/notifications.ts
@@ -1,6 +1,3 @@
-import { OperationError } from "./walletTypes";
-import { WithdrawCoinSource, WithdrawalSource } from "./dbTypes";
-
 /*
  This file is part of GNU Taler
  (C) 2019 GNUnet e.V.
@@ -22,6 +19,12 @@ import { WithdrawCoinSource, WithdrawalSource } from 
"./dbTypes";
  * of the wallet.
  */
 
+/**
+ * Imports.
+ */
+import { OperationError } from "./walletTypes";
+import { WithdrawalSource } from "./dbTypes";
+
 export const enum NotificationType {
   CoinWithdrawn = "coin-withdrawn",
   ProposalAccepted = "proposal-accepted",
diff --git a/src/types/pending.ts b/src/types/pending.ts
index 5bca8c39..4ff82f55 100644
--- a/src/types/pending.ts
+++ b/src/types/pending.ts
@@ -25,7 +25,6 @@ import { OperationError, WalletBalance } from "./walletTypes";
 import { WithdrawalSource, RetryInfo, ReserveRecordStatus } from "./dbTypes";
 import { Timestamp, Duration } from "../util/time";
 import { ReserveType } from "./history";
-import { AmountString } from "./talerTypes";
 
 export const enum PendingOperationType {
   Bug = "bug",
diff --git a/src/types/talerTypes.ts b/src/types/talerTypes.ts
index 0f35f7ed..799c84dc 100644
--- a/src/types/talerTypes.ts
+++ b/src/types/talerTypes.ts
@@ -28,7 +28,6 @@
  */
 
 import {
-  typecheckedCodec,
   makeCodecForObject,
   codecForString,
   makeCodecForList,
@@ -37,6 +36,7 @@ import {
   codecForNumber,
   codecForBoolean,
   makeCodecForMap,
+  Codec,
 } from "../util/codec";
 import {
   Timestamp,
@@ -786,243 +786,199 @@ export type EddsaSignatureString = string;
 export type EddsaPublicKeyString = string;
 export type CoinPublicKeyString = string;
 
-export const codecForDenomination = () =>
-  typecheckedCodec<Denomination>(
-    makeCodecForObject<Denomination>()
-      .property("value", codecForString)
-      .property("denom_pub", codecForString)
-      .property("fee_withdraw", codecForString)
-      .property("fee_deposit", codecForString)
-      .property("fee_refresh", codecForString)
-      .property("fee_refund", codecForString)
-      .property("stamp_start", codecForTimestamp)
-      .property("stamp_expire_withdraw", codecForTimestamp)
-      .property("stamp_expire_legal", codecForTimestamp)
-      .property("stamp_expire_deposit", codecForTimestamp)
-      .property("master_sig", codecForString)
-      .build("Denomination"),
-  );
-
-export const codecForAuditorDenomSig = () =>
-  typecheckedCodec<AuditorDenomSig>(
-    makeCodecForObject<AuditorDenomSig>()
-      .property("denom_pub_h", codecForString)
-      .property("auditor_sig", codecForString)
-      .build("AuditorDenomSig"),
-  );
-
-export const codecForAuditor = () =>
-  typecheckedCodec<Auditor>(
-    makeCodecForObject<Auditor>()
-      .property("auditor_pub", codecForString)
-      .property("auditor_url", codecForString)
-      .property(
-        "denomination_keys",
-        makeCodecForList(codecForAuditorDenomSig()),
-      )
-      .build("Auditor"),
-  );
-
-export const codecForExchangeHandle = () =>
-  typecheckedCodec<ExchangeHandle>(
-    makeCodecForObject<ExchangeHandle>()
-      .property("master_pub", codecForString)
-      .property("url", codecForString)
-      .build("ExchangeHandle"),
-  );
-
-export const codecForAuditorHandle = () =>
-  typecheckedCodec<AuditorHandle>(
-    makeCodecForObject<AuditorHandle>()
-      .property("name", codecForString)
-      .property("master_pub", codecForString)
-      .property("url", codecForString)
-      .build("AuditorHandle"),
-  );
-
-export const codecForContractTerms = () =>
-  typecheckedCodec<ContractTerms>(
-    makeCodecForObject<ContractTerms>()
-      .property("order_id", codecForString)
-      .property("fulfillment_url", codecForString)
-      .property("merchant_base_url", codecForString)
-      .property("h_wire", codecForString)
-      .property("auto_refund", makeCodecOptional(codecForDuration))
-      .property("wire_method", codecForString)
-      .property("summary", codecForString)
-      .property("nonce", codecForString)
-      .property("amount", codecForString)
-      .property("auditors", makeCodecForList(codecForAuditorHandle()))
-      .property("pay_deadline", codecForTimestamp)
-      .property("refund_deadline", codecForTimestamp)
-      .property("wire_transfer_deadline", codecForTimestamp)
-      .property("timestamp", codecForTimestamp)
-      .property("locations", codecForAny)
-      .property("max_fee", codecForString)
-      .property("max_wire_fee", makeCodecOptional(codecForString))
-      .property("merchant", codecForAny)
-      .property("merchant_pub", codecForString)
-      .property("exchanges", makeCodecForList(codecForExchangeHandle()))
-      .property("products", makeCodecOptional(makeCodecForList(codecForAny)))
-      .property("extra", codecForAny)
-      .build("ContractTerms"),
-  );
-
-export const codecForMerchantRefundPermission = () =>
-  typecheckedCodec<MerchantRefundPermission>(
-    makeCodecForObject<MerchantRefundPermission>()
-      .property("refund_amount", codecForString)
-      .property("refund_fee", codecForString)
-      .property("coin_pub", codecForString)
-      .property("rtransaction_id", codecForNumber)
-      .property("merchant_sig", codecForString)
-      .build("MerchantRefundPermission"),
-  );
-
-export const codecForMerchantRefundResponse = () =>
-  typecheckedCodec<MerchantRefundResponse>(
-    makeCodecForObject<MerchantRefundResponse>()
-      .property("merchant_pub", codecForString)
-      .property("h_contract_terms", codecForString)
-      .property(
-        "refund_permissions",
-        makeCodecForList(codecForMerchantRefundPermission()),
-      )
-      .build("MerchantRefundResponse"),
-  );
-
-export const codecForReserveSigSingleton = () =>
-  typecheckedCodec<ReserveSigSingleton>(
-    makeCodecForObject<ReserveSigSingleton>()
-      .property("reserve_sig", codecForString)
-      .build("ReserveSigSingleton"),
-  );
-
-export const codecForTipResponse = () =>
-  typecheckedCodec<TipResponse>(
-    makeCodecForObject<TipResponse>()
-      .property("reserve_pub", codecForString)
-      .property("reserve_sigs", 
makeCodecForList(codecForReserveSigSingleton()))
-      .build("TipResponse"),
-  );
-
-export const codecForRecoup = () =>
-  typecheckedCodec<Recoup>(
-    makeCodecForObject<Recoup>()
-      .property("h_denom_pub", codecForString)
-      .build("Payback"),
-  );
-
-export const codecForExchangeSigningKey = () =>
-  typecheckedCodec<ExchangeSignKeyJson>(
-    makeCodecForObject<ExchangeSignKeyJson>()
-      .property("key", codecForString)
-      .property("master_sig", codecForString)
-      .property("stamp_end", codecForTimestamp)
-      .property("stamp_start", codecForTimestamp)
-      .property("stamp_expire", codecForTimestamp)
-      .build("ExchangeSignKeyJson"),
-  );
-
-export const codecForExchangeKeysJson = () =>
-  typecheckedCodec<ExchangeKeysJson>(
-    makeCodecForObject<ExchangeKeysJson>()
-      .property("denoms", makeCodecForList(codecForDenomination()))
-      .property("master_public_key", codecForString)
-      .property("auditors", makeCodecForList(codecForAuditor()))
-      .property("list_issue_date", codecForTimestamp)
-      .property("recoup", 
makeCodecOptional(makeCodecForList(codecForRecoup())))
-      .property("signkeys", makeCodecForList(codecForExchangeSigningKey()))
-      .property("version", codecForString)
-      .build("KeysJson"),
-  );
-
-export const codecForWireFeesJson = () =>
-  typecheckedCodec<WireFeesJson>(
-    makeCodecForObject<WireFeesJson>()
-      .property("wire_fee", codecForString)
-      .property("closing_fee", codecForString)
-      .property("sig", codecForString)
-      .property("start_date", codecForTimestamp)
-      .property("end_date", codecForTimestamp)
-      .build("WireFeesJson"),
-  );
-
-export const codecForAccountInfo = () =>
-  typecheckedCodec<AccountInfo>(
-    makeCodecForObject<AccountInfo>()
-      .property("payto_uri", codecForString)
-      .property("master_sig", codecForString)
-      .build("AccountInfo"),
-  );
-
-export const codecForExchangeWireJson = () =>
-  typecheckedCodec<ExchangeWireJson>(
-    makeCodecForObject<ExchangeWireJson>()
-      .property("accounts", makeCodecForList(codecForAccountInfo()))
-      .property(
-        "fees",
-        makeCodecForMap(makeCodecForList(codecForWireFeesJson())),
-      )
-      .build("ExchangeWireJson"),
-  );
-
-export const codecForProposal = () =>
-  typecheckedCodec<Proposal>(
-    makeCodecForObject<Proposal>()
-      .property("contract_terms", codecForAny)
-      .property("sig", codecForString)
-      .build("Proposal"),
-  );
-
-export const codecForCheckPaymentResponse = () =>
-  typecheckedCodec<CheckPaymentResponse>(
-    makeCodecForObject<CheckPaymentResponse>()
-      .property("paid", codecForBoolean)
-      .property("refunded", makeCodecOptional(codecForBoolean))
-      .property("refunded_amount", makeCodecOptional(codecForString))
-      .property("contract_terms", makeCodecOptional(codecForAny))
-      .property("taler_pay_uri", makeCodecOptional(codecForString))
-      .property("contract_url", makeCodecOptional(codecForString))
-      .build("CheckPaymentResponse"),
-  );
-
-export const codecForWithdrawOperationStatusResponse = () =>
-  typecheckedCodec<WithdrawOperationStatusResponse>(
-    makeCodecForObject<WithdrawOperationStatusResponse>()
-      .property("selection_done", codecForBoolean)
-      .property("transfer_done", codecForBoolean)
-      .property("amount", codecForString)
-      .property("sender_wire", makeCodecOptional(codecForString))
-      .property("suggested_exchange", makeCodecOptional(codecForString))
-      .property("confirm_transfer_url", makeCodecOptional(codecForString))
-      .property("wire_types", makeCodecForList(codecForString))
-      .build("WithdrawOperationStatusResponse"),
-  );
-
-export const codecForTipPickupGetResponse = () =>
-  typecheckedCodec<TipPickupGetResponse>(
-    makeCodecForObject<TipPickupGetResponse>()
-      .property("extra", codecForAny)
-      .property("amount", codecForString)
-      .property("amount_left", codecForString)
-      .property("exchange_url", codecForString)
-      .property("stamp_expire", codecForTimestamp)
-      .property("stamp_created", codecForTimestamp)
-      .build("TipPickupGetResponse"),
-  );
-
-export const codecForRecoupConfirmation = () =>
-  typecheckedCodec<RecoupConfirmation>(
-    makeCodecForObject<RecoupConfirmation>()
-      .property("reserve_pub", makeCodecOptional(codecForString))
-      .property("old_coin_pub", makeCodecOptional(codecForString))
-      .build("RecoupConfirmation"),
-  );
-
-export const codecForWithdrawResponse = () =>
-  typecheckedCodec<WithdrawResponse>(
-    makeCodecForObject<WithdrawResponse>()
-      .property("ev_sig", codecForString)
-      .build("WithdrawResponse"),
-  );
+export const codecForDenomination = (): Codec<Denomination> =>
+  makeCodecForObject<Denomination>()
+    .property("value", codecForString)
+    .property("denom_pub", codecForString)
+    .property("fee_withdraw", codecForString)
+    .property("fee_deposit", codecForString)
+    .property("fee_refresh", codecForString)
+    .property("fee_refund", codecForString)
+    .property("stamp_start", codecForTimestamp)
+    .property("stamp_expire_withdraw", codecForTimestamp)
+    .property("stamp_expire_legal", codecForTimestamp)
+    .property("stamp_expire_deposit", codecForTimestamp)
+    .property("master_sig", codecForString)
+    .build("Denomination");
+
+export const codecForAuditorDenomSig = (): Codec<AuditorDenomSig> =>
+  makeCodecForObject<AuditorDenomSig>()
+    .property("denom_pub_h", codecForString)
+    .property("auditor_sig", codecForString)
+    .build("AuditorDenomSig");
+
+export const codecForAuditor = (): Codec<Auditor> =>
+  makeCodecForObject<Auditor>()
+    .property("auditor_pub", codecForString)
+    .property("auditor_url", codecForString)
+    .property("denomination_keys", makeCodecForList(codecForAuditorDenomSig()))
+    .build("Auditor");
+
+export const codecForExchangeHandle = (): Codec<ExchangeHandle> =>
+  makeCodecForObject<ExchangeHandle>()
+    .property("master_pub", codecForString)
+    .property("url", codecForString)
+    .build("ExchangeHandle");
+
+export const codecForAuditorHandle = (): Codec<AuditorHandle> =>
+  makeCodecForObject<AuditorHandle>()
+    .property("name", codecForString)
+    .property("master_pub", codecForString)
+    .property("url", codecForString)
+    .build("AuditorHandle");
+
+export const codecForContractTerms = (): Codec<ContractTerms> =>
+  makeCodecForObject<ContractTerms>()
+    .property("order_id", codecForString)
+    .property("fulfillment_url", codecForString)
+    .property("merchant_base_url", codecForString)
+    .property("h_wire", codecForString)
+    .property("auto_refund", makeCodecOptional(codecForDuration))
+    .property("wire_method", codecForString)
+    .property("summary", codecForString)
+    .property("nonce", codecForString)
+    .property("amount", codecForString)
+    .property("auditors", makeCodecForList(codecForAuditorHandle()))
+    .property("pay_deadline", codecForTimestamp)
+    .property("refund_deadline", codecForTimestamp)
+    .property("wire_transfer_deadline", codecForTimestamp)
+    .property("timestamp", codecForTimestamp)
+    .property("locations", codecForAny)
+    .property("max_fee", codecForString)
+    .property("max_wire_fee", makeCodecOptional(codecForString))
+    .property("merchant", codecForAny)
+    .property("merchant_pub", codecForString)
+    .property("exchanges", makeCodecForList(codecForExchangeHandle()))
+    .property("products", makeCodecOptional(makeCodecForList(codecForAny)))
+    .property("extra", codecForAny)
+    .build("ContractTerms");
+
+export const codecForMerchantRefundPermission = (): Codec<
+  MerchantRefundPermission
+> =>
+  makeCodecForObject<MerchantRefundPermission>()
+    .property("refund_amount", codecForString)
+    .property("refund_fee", codecForString)
+    .property("coin_pub", codecForString)
+    .property("rtransaction_id", codecForNumber)
+    .property("merchant_sig", codecForString)
+    .build("MerchantRefundPermission");
+
+export const codecForMerchantRefundResponse = (): Codec<
+  MerchantRefundResponse
+> =>
+  makeCodecForObject<MerchantRefundResponse>()
+    .property("merchant_pub", codecForString)
+    .property("h_contract_terms", codecForString)
+    .property(
+      "refund_permissions",
+      makeCodecForList(codecForMerchantRefundPermission()),
+    )
+    .build("MerchantRefundResponse");
+
+export const codecForReserveSigSingleton = (): Codec<ReserveSigSingleton> =>
+  makeCodecForObject<ReserveSigSingleton>()
+    .property("reserve_sig", codecForString)
+    .build("ReserveSigSingleton");
+
+export const codecForTipResponse = (): Codec<TipResponse> =>
+  makeCodecForObject<TipResponse>()
+    .property("reserve_pub", codecForString)
+    .property("reserve_sigs", makeCodecForList(codecForReserveSigSingleton()))
+    .build("TipResponse");
+
+export const codecForRecoup = (): Codec<Recoup> =>
+  makeCodecForObject<Recoup>()
+    .property("h_denom_pub", codecForString)
+    .build("Recoup");
+
+export const codecForExchangeSigningKey = (): Codec<ExchangeSignKeyJson> =>
+  makeCodecForObject<ExchangeSignKeyJson>()
+    .property("key", codecForString)
+    .property("master_sig", codecForString)
+    .property("stamp_end", codecForTimestamp)
+    .property("stamp_start", codecForTimestamp)
+    .property("stamp_expire", codecForTimestamp)
+    .build("ExchangeSignKeyJson");
+
+export const codecForExchangeKeysJson = (): Codec<ExchangeKeysJson> =>
+  makeCodecForObject<ExchangeKeysJson>()
+    .property("denoms", makeCodecForList(codecForDenomination()))
+    .property("master_public_key", codecForString)
+    .property("auditors", makeCodecForList(codecForAuditor()))
+    .property("list_issue_date", codecForTimestamp)
+    .property("recoup", makeCodecOptional(makeCodecForList(codecForRecoup())))
+    .property("signkeys", makeCodecForList(codecForExchangeSigningKey()))
+    .property("version", codecForString)
+    .build("KeysJson");
+
+export const codecForWireFeesJson = (): Codec<WireFeesJson> =>
+  makeCodecForObject<WireFeesJson>()
+    .property("wire_fee", codecForString)
+    .property("closing_fee", codecForString)
+    .property("sig", codecForString)
+    .property("start_date", codecForTimestamp)
+    .property("end_date", codecForTimestamp)
+    .build("WireFeesJson");
+
+export const codecForAccountInfo = (): Codec<AccountInfo> =>
+  makeCodecForObject<AccountInfo>()
+    .property("payto_uri", codecForString)
+    .property("master_sig", codecForString)
+    .build("AccountInfo");
+
+export const codecForExchangeWireJson = (): Codec<ExchangeWireJson> =>
+  makeCodecForObject<ExchangeWireJson>()
+    .property("accounts", makeCodecForList(codecForAccountInfo()))
+    .property("fees", 
makeCodecForMap(makeCodecForList(codecForWireFeesJson())))
+    .build("ExchangeWireJson");
+
+export const codecForProposal = (): Codec<Proposal> =>
+  makeCodecForObject<Proposal>()
+    .property("contract_terms", codecForAny)
+    .property("sig", codecForString)
+    .build("Proposal");
+
+export const codecForCheckPaymentResponse = (): Codec<CheckPaymentResponse> =>
+  makeCodecForObject<CheckPaymentResponse>()
+    .property("paid", codecForBoolean)
+    .property("refunded", makeCodecOptional(codecForBoolean))
+    .property("refunded_amount", makeCodecOptional(codecForString))
+    .property("contract_terms", makeCodecOptional(codecForAny))
+    .property("taler_pay_uri", makeCodecOptional(codecForString))
+    .property("contract_url", makeCodecOptional(codecForString))
+    .build("CheckPaymentResponse");
+
+export const codecForWithdrawOperationStatusResponse = (): Codec<
+  WithdrawOperationStatusResponse
+> =>
+  makeCodecForObject<WithdrawOperationStatusResponse>()
+    .property("selection_done", codecForBoolean)
+    .property("transfer_done", codecForBoolean)
+    .property("amount", codecForString)
+    .property("sender_wire", makeCodecOptional(codecForString))
+    .property("suggested_exchange", makeCodecOptional(codecForString))
+    .property("confirm_transfer_url", makeCodecOptional(codecForString))
+    .property("wire_types", makeCodecForList(codecForString))
+    .build("WithdrawOperationStatusResponse");
+
+export const codecForTipPickupGetResponse = (): Codec<TipPickupGetResponse> =>
+  makeCodecForObject<TipPickupGetResponse>()
+    .property("extra", codecForAny)
+    .property("amount", codecForString)
+    .property("amount_left", codecForString)
+    .property("exchange_url", codecForString)
+    .property("stamp_expire", codecForTimestamp)
+    .property("stamp_created", codecForTimestamp)
+    .build("TipPickupGetResponse");
+
+export const codecForRecoupConfirmation = (): Codec<RecoupConfirmation> =>
+  makeCodecForObject<RecoupConfirmation>()
+    .property("reserve_pub", makeCodecOptional(codecForString))
+    .property("old_coin_pub", makeCodecOptional(codecForString))
+    .build("RecoupConfirmation");
+
+export const codecForWithdrawResponse = (): Codec<WithdrawResponse> =>
+  makeCodecForObject<WithdrawResponse>()
+    .property("ev_sig", codecForString)
+    .build("WithdrawResponse");
diff --git a/src/types/walletTypes.ts b/src/types/walletTypes.ts
index 5d28c5ae..113a137c 100644
--- a/src/types/walletTypes.ts
+++ b/src/types/walletTypes.ts
@@ -30,18 +30,16 @@
 import { AmountJson, codecForAmountJson } from "../util/amounts";
 import * as LibtoolVersion from "../util/libtoolVersion";
 import {
-  CoinRecord,
   DenominationRecord,
   ExchangeRecord,
   ExchangeWireInfo,
 } from "./dbTypes";
-import { CoinDepositPermission, ContractTerms } from "./talerTypes";
 import { Timestamp } from "../util/time";
 import {
-  typecheckedCodec,
   makeCodecForObject,
   codecForString,
   makeCodecOptional,
+  Codec,
 } from "../util/codec";
 
 /**
@@ -261,16 +259,14 @@ export interface CreateReserveRequest {
   bankWithdrawStatusUrl?: string;
 }
 
-export const codecForCreateReserveRequest = () =>
-  typecheckedCodec<CreateReserveRequest>(
-    makeCodecForObject<CreateReserveRequest>()
-      .property("amount", codecForAmountJson())
-      .property("exchange", codecForString)
-      .property("exchangeWire", codecForString)
-      .property("senderWire", makeCodecOptional(codecForString))
-      .property("bankWithdrawStatusUrl", makeCodecOptional(codecForString))
-      .build("CreateReserveRequest"),
-  );
+export const codecForCreateReserveRequest = (): Codec<CreateReserveRequest> =>
+  makeCodecForObject<CreateReserveRequest>()
+    .property("amount", codecForAmountJson())
+    .property("exchange", codecForString)
+    .property("exchangeWire", codecForString)
+    .property("senderWire", makeCodecOptional(codecForString))
+    .property("bankWithdrawStatusUrl", makeCodecOptional(codecForString))
+    .build("CreateReserveRequest");
 
 /**
  * Request to mark a reserve as confirmed.
@@ -283,12 +279,10 @@ export interface ConfirmReserveRequest {
   reservePub: string;
 }
 
-export const codecForConfirmReserveRequest = () =>
-  typecheckedCodec<ConfirmReserveRequest>(
-    makeCodecForObject<ConfirmReserveRequest>()
-      .property("reservePub", codecForString)
-      .build("ConfirmReserveRequest"),
-  );
+export const codecForConfirmReserveRequest = (): Codec<ConfirmReserveRequest> 
=>
+  makeCodecForObject<ConfirmReserveRequest>()
+    .property("reservePub", codecForString)
+    .build("ConfirmReserveRequest");
 
 /**
  * Wire coins to the user's own bank account.
diff --git a/src/util/RequestThrottler.ts b/src/util/RequestThrottler.ts
index c99c7e94..d979fbfc 100644
--- a/src/util/RequestThrottler.ts
+++ b/src/util/RequestThrottler.ts
@@ -21,12 +21,7 @@
 /**
  * Imports.
  */
-import {
-  getTimestampNow,
-  Timestamp,
-  timestampSubtractDuraction,
-  timestampDifference,
-} from "../util/time";
+import { getTimestampNow, timestampDifference } from "../util/time";
 
 /**
  * Maximum request per second, per origin.
diff --git a/src/util/amounts.ts b/src/util/amounts.ts
index f9946393..5953f513 100644
--- a/src/util/amounts.ts
+++ b/src/util/amounts.ts
@@ -22,10 +22,10 @@
  * Imports.
  */
 import {
-  typecheckedCodec,
   makeCodecForObject,
   codecForString,
   codecForNumber,
+  Codec,
 } from "./codec";
 
 /**
@@ -66,14 +66,12 @@ export interface AmountJson {
   readonly currency: string;
 }
 
-export const codecForAmountJson = () =>
-  typecheckedCodec<AmountJson>(
-    makeCodecForObject<AmountJson>()
-      .property("currency", codecForString)
-      .property("value", codecForNumber)
-      .property("fraction", codecForNumber)
-      .build("AmountJson"),
-  );
+export const codecForAmountJson = (): Codec<AmountJson> =>
+  makeCodecForObject<AmountJson>()
+    .property("currency", codecForString)
+    .property("value", codecForNumber)
+    .property("fraction", codecForNumber)
+    .build("AmountJson");
 
 /**
  * Result of a possibly overflowing operation.
@@ -100,7 +98,7 @@ export function getZero(currency: string): AmountJson {
   };
 }
 
-export function sum(amounts: AmountJson[]) {
+export function sum(amounts: AmountJson[]): Result {
   if (amounts.length <= 0) {
     throw Error("can't sum zero amounts");
   }
@@ -260,7 +258,7 @@ export function parse(s: string): AmountJson | undefined {
   if (tail.length > fractionalLength + 1) {
     return undefined;
   }
-  let value = Number.parseInt(res[2]);
+  const value = Number.parseInt(res[2]);
   if (value > maxAmountValue) {
     return undefined;
   }
@@ -287,7 +285,7 @@ export function parseOrThrow(s: string): AmountJson {
  * Convert a float to a Taler amount.
  * Loss of precision possible.
  */
-export function fromFloat(floatVal: number, currency: string) {
+export function fromFloat(floatVal: number, currency: string): AmountJson {
   return {
     currency,
     fraction: Math.floor((floatVal - Math.floor(floatVal)) * fractionalBase),
diff --git a/src/util/asyncMemo.ts b/src/util/asyncMemo.ts
index 84fe6b80..6e88081b 100644
--- a/src/util/asyncMemo.ts
+++ b/src/util/asyncMemo.ts
@@ -24,7 +24,7 @@ export class AsyncOpMemoMap<T> {
   private n = 0;
   private memoMap: { [k: string]: MemoEntry<T> } = {};
 
-  private cleanUp(key: string, n: number) {
+  private cleanUp(key: string, n: number): void {
     const r = this.memoMap[key];
     if (r && r.n === n) {
       delete this.memoMap[key];
@@ -48,7 +48,7 @@ export class AsyncOpMemoMap<T> {
       this.cleanUp(key, n);
     });
   }
-  clear() {
+  clear(): void {
     this.memoMap = {};
   }
 }
@@ -57,7 +57,7 @@ export class AsyncOpMemoSingle<T> {
   private n = 0;
   private memoEntry: MemoEntry<T> | undefined;
 
-  private cleanUp(n: number) {
+  private cleanUp(n: number): void {
     if (this.memoEntry && this.memoEntry.n === n) {
       this.memoEntry = undefined;
     }
@@ -81,7 +81,7 @@ export class AsyncOpMemoSingle<T> {
     };
     return p;
   }
-  clear() {
+  clear(): void {
     this.memoEntry = undefined;
   }
 }
diff --git a/src/util/codec.ts b/src/util/codec.ts
index a8f49523..136c5b05 100644
--- a/src/util/codec.ts
+++ b/src/util/codec.ts
@@ -347,7 +347,3 @@ export function makeCodecOptional<V>(
     },
   };
 }
-
-export function typecheckedCodec<T = undefined>(c: Codec<T>): Codec<T> {
-  return c;
-}
diff --git a/src/util/helpers.ts b/src/util/helpers.ts
index 0e19d7ab..7cd9e423 100644
--- a/src/util/helpers.ts
+++ b/src/util/helpers.ts
@@ -39,7 +39,7 @@ export function amountToPretty(amount: AmountJson): string {
  *
  * See http://api.taler.net/wallet.html#general
  */
-export function canonicalizeBaseUrl(url: string) {
+export function canonicalizeBaseUrl(url: string): string {
   if (!url.startsWith("http") && !url.startsWith("https")) {
     url = "https://"; + url;
   }
@@ -145,13 +145,3 @@ export function strcmp(s1: string, s2: string): number {
   }
   return 0;
 }
-
-/**
- * Run a function and return its result.
- *
- * Used as a nicer-looking way to do immediately invoked function
- * expressions (IFFEs).
- */
-export function runBlock<T>(f: () => T) {
-  return f();
-}
diff --git a/src/util/http.ts b/src/util/http.ts
index 1a5cb85f..0ac989a1 100644
--- a/src/util/http.ts
+++ b/src/util/http.ts
@@ -116,7 +116,7 @@ export class BrowserHttpLib implements HttpRequestLibrary {
             );
             return;
           }
-          const makeJson = async () => {
+          const makeJson = async (): Promise<any> => {
             let responseJson;
             try {
               responseJson = JSON.parse(myRequest.responseText);
@@ -136,9 +136,13 @@ export class BrowserHttpLib implements HttpRequestLibrary {
           const headerMap = new Headers();
           arr.forEach(function (line) {
             const parts = line.split(": ");
-            const header = parts.shift();
+            const headerName = parts.shift();
+            if (!headerName) {
+              console.error("invalid header");
+              return;
+            }
             const value = parts.join(": ");
-            headerMap.set(header!, value);
+            headerMap.set(headerName, value);
           });
           const resp: HttpResponse = {
             status: myRequest.status,
@@ -152,15 +156,19 @@ export class BrowserHttpLib implements HttpRequestLibrary 
{
     });
   }
 
-  get(url: string, opt?: HttpRequestOptions) {
+  get(url: string, opt?: HttpRequestOptions): Promise<HttpResponse> {
     return this.req("get", url, undefined, opt);
   }
 
-  postJson(url: string, body: any, opt?: HttpRequestOptions) {
+  postJson(
+    url: string,
+    body: any,
+    opt?: HttpRequestOptions,
+  ): Promise<HttpResponse> {
     return this.req("post", url, JSON.stringify(body), opt);
   }
 
-  stop() {
+  stop(): void {
     // Nothing to do
   }
 }
diff --git a/src/util/logging.ts b/src/util/logging.ts
index 80ba344d..83e8d219 100644
--- a/src/util/logging.ts
+++ b/src/util/logging.ts
@@ -24,7 +24,7 @@ function writeNodeLog(
   tag: string,
   level: string,
   args: any[],
-) {
+): void {
   process.stderr.write(`${new Date().toISOString()} ${tag} ${level} `);
   process.stderr.write(message);
   if (args.length != 0) {
@@ -41,7 +41,7 @@ function writeNodeLog(
 export class Logger {
   constructor(private tag: string) {}
 
-  info(message: string, ...args: any[]) {
+  info(message: string, ...args: any[]): void {
     if (isNode()) {
       writeNodeLog(message, this.tag, "INFO", args);
     } else {
@@ -52,7 +52,7 @@ export class Logger {
     }
   }
 
-  warn(message: string, ...args: any[]) {
+  warn(message: string, ...args: any[]): void {
     if (isNode()) {
       writeNodeLog(message, this.tag, "WARN", args);
     } else {
@@ -63,7 +63,7 @@ export class Logger {
     }
   }
 
-  error(message: string, ...args: any[]) {
+  error(message: string, ...args: any[]): void {
     if (isNode()) {
       writeNodeLog(message, this.tag, "ERROR", args);
     } else {
@@ -74,7 +74,7 @@ export class Logger {
     }
   }
 
-  trace(message: any, ...args: any[]) {
+  trace(message: any, ...args: any[]): void {
     if (isNode()) {
       writeNodeLog(message, this.tag, "TRACE", args);
     } else {
diff --git a/src/util/query.ts b/src/util/query.ts
index ce704b4f..8dd3ff1e 100644
--- a/src/util/query.ts
+++ b/src/util/query.ts
@@ -25,6 +25,11 @@
  */
 import { openPromise } from "./promiseUtils";
 
+/**
+ * Exception that should be thrown by client code to abort a transaction.
+ */
+export const TransactionAbort = Symbol("transaction_abort");
+
 /**
  * Definition of an object store.
  */
@@ -123,8 +128,8 @@ interface CursorValueResult<T> {
 
 class ResultStream<T> {
   private currentPromise: Promise<void>;
-  private gotCursorEnd: boolean = false;
-  private awaitingResult: boolean = false;
+  private gotCursorEnd = false;
+  private awaitingResult = false;
 
   constructor(private req: IDBRequest) {
     this.awaitingResult = true;
@@ -287,7 +292,11 @@ export class TransactionHandle {
     return requestToPromise(req);
   }
 
-  mutate<T>(store: Store<T>, key: any, f: (x: T) => T | undefined) {
+  mutate<T>(
+    store: Store<T>,
+    key: any,
+    f: (x: T) => T | undefined,
+  ): Promise<void> {
     const req = this.tx.objectStore(store.name).openCursor(key);
     return applyMutation(req, f);
   }
@@ -304,7 +313,7 @@ function runWithTransaction<T>(
     const storeName = stores.map((x) => x.name);
     const tx = db.transaction(storeName, mode);
     let funResult: any = undefined;
-    let gotFunResult: boolean = false;
+    let gotFunResult = false;
     tx.oncomplete = () => {
       // This is a fatal error: The transaction completed *before*
       // the transaction function returned.  Likely, the transaction
@@ -430,15 +439,10 @@ export function openDatabase(
   });
 }
 
-/**
- * Exception that should be thrown by client code to abort a transaction.
- */
-export const TransactionAbort = Symbol("transaction_abort");
-
 export class Database {
   constructor(private db: IDBDatabase) {}
 
-  static deleteDatabase(idbFactory: IDBFactory, dbName: string) {
+  static deleteDatabase(idbFactory: IDBFactory, dbName: string): void {
     idbFactory.deleteDatabase(dbName);
   }
 
diff --git a/src/util/talerconfig.ts b/src/util/talerconfig.ts
index 61c75574..ec08c352 100644
--- a/src/util/talerconfig.ts
+++ b/src/util/talerconfig.ts
@@ -59,8 +59,6 @@ export class ConfigValue<T> {
 export class Configuration {
   private sectionMap: SectionMap = {};
 
-  constructor() {}
-
   loadFromString(s: string): void {
     const reComment = /^\s*#.*$/;
     const reSection = /^\s*\[\s*([^\]]*)\s*\]\s*$/;
diff --git a/src/util/taleruri-test.ts b/src/util/taleruri-test.ts
index 9efc1846..1510880c 100644
--- a/src/util/taleruri-test.ts
+++ b/src/util/taleruri-test.ts
@@ -28,7 +28,7 @@ test("taler pay url parsing: wrong scheme", (t) => {
   t.is(r1, undefined);
 
   const url2 = "taler://refund/a/b/c/d/e/f";
-  const r2 = parsePayUri(url1);
+  const r2 = parsePayUri(url2);
   t.is(r2, undefined);
 });
 
diff --git a/src/util/taleruri.ts b/src/util/taleruri.ts
index 8ad79669..46cc199f 100644
--- a/src/util/taleruri.ts
+++ b/src/util/taleruri.ts
@@ -97,7 +97,7 @@ export function classifyTalerUri(s: string): TalerUriType {
   return TalerUriType.Unknown;
 }
 
-export function getOrderDownloadUrl(merchantBaseUrl: string, orderId: string) {
+export function getOrderDownloadUrl(merchantBaseUrl: string, orderId: string): 
string {
   const u = new URL("proposal", merchantBaseUrl);
   u.searchParams.set("order_id", orderId);
   return u.href;
diff --git a/src/util/time.ts b/src/util/time.ts
index 138ecb87..ea4f8ca8 100644
--- a/src/util/time.ts
+++ b/src/util/time.ts
@@ -34,9 +34,9 @@ export interface Duration {
   readonly d_ms: number | "forever";
 }
 
-let timeshift: number = 0;
+let timeshift = 0;
 
-export function setDangerousTimetravel(dt: number) {
+export function setDangerousTimetravel(dt: number): void {
   timeshift = dt;
 }
 
@@ -121,7 +121,7 @@ export function timestampSubtractDuraction(
   return { t_ms: Math.max(0, t1.t_ms - d.d_ms) };
 }
 
-export function stringifyTimestamp(t: Timestamp) {
+export function stringifyTimestamp(t: Timestamp): string {
   if (t.t_ms === "never") {
     return "never";
   }
@@ -142,7 +142,7 @@ export function timestampIsBetween(
   t: Timestamp,
   start: Timestamp,
   end: Timestamp,
-) {
+): boolean {
   if (timestampCmp(t, start) < 0) {
     return false;
   }
diff --git a/src/util/timer.ts b/src/util/timer.ts
index 8706c939..9d743b8e 100644
--- a/src/util/timer.ts
+++ b/src/util/timer.ts
@@ -1,5 +1,3 @@
-import { Duration } from "./time";
-
 /*
  This file is part of GNU Taler
  (C) 2017-2019 Taler Systems S.A.
@@ -23,6 +21,11 @@ import { Duration } from "./time";
  * this abstracts over these differences.
  */
 
+/**
+ * Imports.
+ */
+import { Duration } from "./time";
+
 /**
  * Cancelable timer.
  */
@@ -33,7 +36,7 @@ export interface TimerHandle {
 class IntervalHandle {
   constructor(public h: any) {}
 
-  clear() {
+  clear(): void {
     clearInterval(this.h);
   }
 }
@@ -41,7 +44,7 @@ class IntervalHandle {
 class TimeoutHandle {
   constructor(public h: any) {}
 
-  clear() {
+  clear(): void {
     clearTimeout(this.h);
   }
 }
@@ -55,7 +58,7 @@ export const performanceNow: () => number = (() => {
       const t = process.hrtime();
       return t[0] * 1e9 + t[1];
     };
-  } else if (typeof "performance" !== "undefined") {
+  } else if (typeof performance !== "undefined") {
     return () => performance.now();
   } else {
     return () => 0;
@@ -87,13 +90,13 @@ const nullTimerHandle = {
  * Group of timers that can be destroyed at once.
  */
 export class TimerGroup {
-  private stopped: boolean = false;
+  private stopped = false;
 
   private timerMap: { [index: number]: TimerHandle } = {};
 
   private idGen = 1;
 
-  stopCurrentAndFutureTimers() {
+  stopCurrentAndFutureTimers(): void {
     this.stopped = true;
     for (const x in this.timerMap) {
       if (!this.timerMap.hasOwnProperty(x)) {
diff --git a/src/wallet-test.ts b/src/wallet-test.ts
index d1551b09..42252366 100644
--- a/src/wallet-test.ts
+++ b/src/wallet-test.ts
@@ -16,9 +16,6 @@
 
 import test from "ava";
 
-import * as dbTypes from "./types/dbTypes";
-import * as types from "./types/walletTypes";
-
 import { AmountJson } from "./util/amounts";
 import * as Amounts from "./util/amounts";
 import { selectPayCoins, AvailableCoinInfo } from "./operations/pay";
diff --git a/src/wallet.ts b/src/wallet.ts
index 3171d0ce..273a9f87 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -47,7 +47,6 @@ import {
   CurrencyRecord,
   DenominationRecord,
   ExchangeRecord,
-  ProposalRecord,
   PurchaseRecord,
   ReserveRecord,
   Stores,
@@ -140,7 +139,7 @@ export class Wallet {
   private ws: InternalWalletState;
   private timerGroup: TimerGroup = new TimerGroup();
   private latch = new AsyncCondition();
-  private stopped: boolean = false;
+  private stopped = false;
   private memoRunRetryLoop = new AsyncOpMemoSingle<void>();
 
   get db(): Database {
@@ -155,7 +154,10 @@ export class Wallet {
     this.ws = new InternalWalletState(db, http, cryptoWorkerFactory);
   }
 
-  getExchangePaytoUri(exchangeBaseUrl: string, supportedTargetTypes: string[]) 
{
+  getExchangePaytoUri(
+    exchangeBaseUrl: string,
+    supportedTargetTypes: string[],
+  ): Promise<string> {
     return getExchangePaytoUri(this.ws, exchangeBaseUrl, supportedTargetTypes);
   }
 
@@ -175,7 +177,7 @@ export class Wallet {
    */
   async processOnePendingOperation(
     pending: PendingOperationInfo,
-    forceNow: boolean = false,
+    forceNow = false,
   ): Promise<void> {
     console.log("running pending", pending);
     switch (pending.type) {
@@ -230,7 +232,7 @@ export class Wallet {
   /**
    * Process pending operations.
    */
-  public async runPending(forceNow: boolean = false): Promise<void> {
+  public async runPending(forceNow = false): Promise<void> {
     const onlyDue = !forceNow;
     const pendingOpsResponse = await this.getPendingOperations({ onlyDue });
     for (const p of pendingOpsResponse.pendingOperations) {
@@ -318,7 +320,7 @@ export class Wallet {
   private async runRetryLoopImpl(): Promise<void> {
     while (!this.stopped) {
       console.log("running wallet retry loop iteration");
-      let pending = await this.getPendingOperations({ onlyDue: true });
+      const pending = await this.getPendingOperations({ onlyDue: true });
       console.log("pending ops", JSON.stringify(pending, undefined, 2));
       if (pending.pendingOperations.length === 0) {
         const allPending = await this.getPendingOperations({ onlyDue: false });
@@ -371,7 +373,7 @@ export class Wallet {
    * auditors into the database, unless these defaults have
    * already been applied.
    */
-  async fillDefaults() {
+  async fillDefaults(): Promise<void> {
     await this.db.runWithWriteTransaction(
       [Stores.config, Stores.currencies],
       async (tx) => {
@@ -382,7 +384,7 @@ export class Wallet {
           }
         });
         if (!applied) {
-          for (let c of builtinCurrencies) {
+          for (const c of builtinCurrencies) {
             await tx.put(Stores.currencies, c);
           }
         }
@@ -489,7 +491,7 @@ export class Wallet {
    */
   async updateExchangeFromUrl(
     baseUrl: string,
-    force: boolean = false,
+    force = false,
   ): Promise<ExchangeRecord> {
     try {
       return updateExchangeFromUrl(this.ws, baseUrl, force);
@@ -549,7 +551,7 @@ export class Wallet {
   async acceptExchangeTermsOfService(
     exchangeBaseUrl: string,
     etag: string | undefined,
-  ) {
+  ): Promise<void> {
     return acceptExchangeTermsOfService(this.ws, exchangeBaseUrl, etag);
   }
 
@@ -596,7 +598,7 @@ export class Wallet {
   /**
    * Stop ongoing processing.
    */
-  stop() {
+  stop(): void {
     this.stopped = true;
     this.timerGroup.stopCurrentAndFutureTimers();
     this.ws.cryptoApi.stop();
@@ -685,7 +687,7 @@ export class Wallet {
    * Inform the wallet that the status of a reserve has changed (e.g. due to a
    * confirmation from the bank.).
    */
-  public async handleNotifyReserve() {
+  public async handleNotifyReserve(): Promise<void> {
     const reserves = await this.db.iter(Stores.reserves).toArray();
     for (const r of reserves) {
       if (r.reserveStatus === ReserveRecordStatus.WAIT_CONFIRM_BANK) {
@@ -702,7 +704,7 @@ export class Wallet {
    * Remove unreferenced / expired data from the wallet's database
    * based on the current system time.
    */
-  async collectGarbage() {
+  async collectGarbage(): Promise<void> {
     // FIXME(#5845)
     // We currently do not garbage-collect the wallet database.  This might 
change
     // after the feature has been properly re-designed, and we have come up 
with a
diff --git a/src/webex/chromeBadge.ts b/src/webex/chromeBadge.ts
index cdd99f8c..7bc5d368 100644
--- a/src/webex/chromeBadge.ts
+++ b/src/webex/chromeBadge.ts
@@ -20,7 +20,7 @@ import { isFirefox } from "./compat";
  * Polyfill for requestAnimationFrame, which
  * doesn't work from a background page.
  */
-function rAF(cb: (ts: number) => void) {
+function rAF(cb: (ts: number) => void): void {
   window.setTimeout(() => {
     cb(performance.now());
   }, 100 /* 100 ms delay between frames */);
@@ -38,25 +38,25 @@ export class ChromeBadge {
    * might still be running even if we're not busy anymore,
    * just to transition to the "normal" state in a animated way.
    */
-  private animationRunning: boolean = false;
+  private animationRunning = false;
 
   /**
    * Is the wallet still busy? Note that we do not stop the
    * animation immediately when the wallet goes idle, but
    * instead slowly close the gap.
    */
-  private isBusy: boolean = false;
+  private isBusy = false;
 
   /**
    * Current rotation angle, ranges from 0 to rotationAngleMax.
    */
-  private rotationAngle: number = 0;
+  private rotationAngle = 0;
 
   /**
    * While animating, how wide is the current gap in the circle?
    * Ranges from 0 to openMax.
    */
-  private gapWidth: number = 0;
+  private gapWidth = 0;
 
   /**
    * Should we show the notification dot?
@@ -99,14 +99,18 @@ export class ChromeBadge {
     // size in draw() as well!
     this.canvas.width = 32;
     this.canvas.height = 32;
-    this.ctx = this.canvas.getContext("2d")!;
+    const ctx = this.canvas.getContext("2d");
+    if (!ctx) {
+      throw Error("unable to get canvas context");
+    }
+    this.ctx = ctx;
     this.draw();
   }
 
   /**
    * Draw the badge based on the current state.
    */
-  private draw() {
+  private draw(): void {
     this.ctx.setTransform(1, 0, 0, 1, 0, 0);
     this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
 
@@ -202,7 +206,7 @@ export class ChromeBadge {
     }
   }
 
-  private animate() {
+  private animate(): void {
     if (this.animationRunning) {
       return;
     }
@@ -212,7 +216,7 @@ export class ChromeBadge {
     }
     this.animationRunning = true;
     let start: number | undefined;
-    const step = (timestamp: number) => {
+    const step = (timestamp: number): void => {
       if (!this.animationRunning) {
         return;
       }
@@ -257,7 +261,7 @@ export class ChromeBadge {
    * Draw the badge such that it shows the
    * user that something happened (balance changed).
    */
-  showNotification() {
+  showNotification(): void {
     this.hasNotification = true;
     this.draw();
   }
@@ -265,12 +269,12 @@ export class ChromeBadge {
   /**
    * Draw the badge without the notification mark.
    */
-  clearNotification() {
+  clearNotification(): void {
     this.hasNotification = false;
     this.draw();
   }
 
-  startBusy() {
+  startBusy(): void {
     if (this.isBusy) {
       return;
     }
@@ -278,7 +282,7 @@ export class ChromeBadge {
     this.animate();
   }
 
-  stopBusy() {
+  stopBusy(): void {
     this.isBusy = false;
   }
 }
diff --git a/src/webex/compat.ts b/src/webex/compat.ts
index f1a68f33..1cbf34a2 100644
--- a/src/webex/compat.ts
+++ b/src/webex/compat.ts
@@ -30,6 +30,6 @@ export function isFirefox(): boolean {
 /**
  * Check if we are running under nodejs.
  */
-export function isNode() {
+export function isNode(): boolean {
   return typeof process !== "undefined" && process.release.name === "node";
 }
diff --git a/src/webex/i18n.tsx b/src/webex/i18n.tsx
index a156cf83..3f23267d 100644
--- a/src/webex/i18n.tsx
+++ b/src/webex/i18n.tsx
@@ -30,7 +30,7 @@ import * as React from "react";
 
 const jed = setupJed();
 
-let enableTracing = false;
+const enableTracing = false;
 
 /**
  * Set up jed library for internationalization,
@@ -57,7 +57,7 @@ function setupJed(): any {
 /**
  * Convert template strings to a msgid
  */
-function toI18nString(stringSeq: ReadonlyArray<string>) {
+function toI18nString(stringSeq: ReadonlyArray<string>): string {
   let s = "";
   for (let i = 0; i < stringSeq.length; i++) {
     s += stringSeq[i];
@@ -71,7 +71,7 @@ function toI18nString(stringSeq: ReadonlyArray<string>) {
 /**
  * Internationalize a string template with arbitrary serialized values.
  */
-export function str(stringSeq: TemplateStringsArray, ...values: any[]) {
+export function str(stringSeq: TemplateStringsArray, ...values: any[]): string 
{
   const s = toI18nString(stringSeq);
   const tr = jed
     .translate(s)
@@ -226,8 +226,8 @@ export class TranslatePlural extends React.Component<
         typeof childArray[i] === "string" &&
         typeof childArray[i + 1] === "string"
       ) {
-        childArray[i + i] =
-          ((childArray[i] as string) + childArray[i + 1]) as string;
+        childArray[i + i] = ((childArray[i] as string) +
+          childArray[i + 1]) as string;
         childArray.splice(i, 1);
       }
     }
@@ -267,8 +267,8 @@ export class TranslateSingular extends React.Component<
         typeof childArray[i] === "string" &&
         typeof childArray[i + 1] === "string"
       ) {
-        childArray[i + i] =
-          ((childArray[i] as string) + childArray[i + 1]) as string;
+        childArray[i + i] = ((childArray[i] as string) +
+          childArray[i + 1]) as string;
         childArray.splice(i, 1);
       }
     }
diff --git a/src/webex/messages.ts b/src/webex/messages.ts
index b695b4ab..19d125a8 100644
--- a/src/webex/messages.ts
+++ b/src/webex/messages.ts
@@ -23,7 +23,6 @@
 
 import { AmountJson } from "../util/amounts";
 import * as dbTypes from "../types/dbTypes";
-import * as talerTypes from "../types/talerTypes";
 import * as walletTypes from "../types/walletTypes";
 
 import { UpgradeResponse } from "./wxApi";
@@ -172,22 +171,3 @@ export interface MessageMap {
  */
 export type MessageType = keyof MessageMap;
 
-/**
- * Make a request whose details match the request type.
- */
-export function makeRequest<T extends MessageType>(
-  type: T,
-  details: MessageMap[T]["request"],
-) {
-  return { type, details };
-}
-
-/**
- * Make a response that matches the request type.
- */
-export function makeResponse<T extends MessageType>(
-  type: T,
-  response: MessageMap[T]["response"],
-) {
-  return response;
-}
diff --git a/src/webex/notify.ts b/src/webex/notify.ts
index 910a2099..9fb0529d 100644
--- a/src/webex/notify.ts
+++ b/src/webex/notify.ts
@@ -24,11 +24,11 @@
 /**
  * Imports.
  */
-import wxApi = require("./wxApi");
+import * as wxApi from "./wxApi";
 
-declare var cloneInto: any;
+declare let cloneInto: any;
 
-let logVerbose: boolean = false;
+let logVerbose = false;
 try {
   logVerbose = !!localStorage.getItem("taler-log-verbose");
 } catch (e) {
@@ -47,7 +47,7 @@ const handlers: Handler[] = [];
 
 let sheet: CSSStyleSheet | null;
 
-function initStyle() {
+function initStyle(): void {
   logVerbose && console.log("taking over styles");
   const name = "taler-presence-stylesheet";
   const content = "/* Taler stylesheet controlled by JS */";
@@ -78,7 +78,7 @@ function initStyle() {
   }
 }
 
-function setStyles(installed: boolean) {
+function setStyles(installed: boolean): void {
   if (!sheet || !sheet.cssRules) {
     return;
   }
@@ -93,7 +93,7 @@ function setStyles(installed: boolean) {
   }
 }
 
-function onceOnComplete(cb: () => void) {
+function onceOnComplete(cb: () => void): void {
   if (document.readyState === "complete") {
     cb();
   } else {
@@ -105,7 +105,7 @@ function onceOnComplete(cb: () => void) {
   }
 }
 
-function init() {
+function init(): void {
   onceOnComplete(() => {
     if (document.documentElement.getAttribute("data-taler-nojs")) {
       initStyle();
@@ -129,13 +129,13 @@ function init() {
 
 type HandlerFn = (detail: any, sendResponse: (msg: any) => void) => void;
 
-function registerHandlers() {
+function registerHandlers(): void {
   /**
    * Add a handler for a DOM event, which automatically
    * handles adding sequence numbers to responses.
    */
-  function addHandler(type: string, handler: HandlerFn) {
-    const handlerWrap = (e: Event) => {
+  function addHandler(type: string, handler: HandlerFn): void {
+    const handlerWrap = (e: Event): void => {
       if (!(e instanceof Event)) {
         console.log("unexpected event", e);
         throw Error(`invariant violated`);
@@ -154,7 +154,7 @@ function registerHandlers() {
         callId = e.detail.callId;
         detail = e.detail;
       }
-      const responder = (msg?: any) => {
+      const responder = (msg?: any): void => {
         const fullMsg = Object.assign({}, msg, { callId });
         let opts = { detail: fullMsg };
         if ("function" === typeof cloneInto) {
diff --git a/src/webex/pageEntryPoint.ts b/src/webex/pageEntryPoint.ts
new file mode 100644
index 00000000..dd9c1303
--- /dev/null
+++ b/src/webex/pageEntryPoint.ts
@@ -0,0 +1,64 @@
+/*
+ This file is part of GNU Taler
+ (C) 2020 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+ * Main entry point for extension pages.
+ *
+ * @author Florian Dold <address@hidden>
+ */
+
+import ReactDOM from "react-dom";
+import { createPopup } from "./pages/popup";
+import { createWithdrawPage } from "./pages/withdraw";
+import { createWelcomePage } from "./pages/welcome";
+
+function main(): void {
+  try {
+    let mainElement;
+    const m = location.pathname.match(/([^/]+)$/);
+    if (!m) {
+      throw Error("can't parse page URL");
+    }
+    const page = m[1];
+    switch (page) {
+      case "popup.html":
+        mainElement = createPopup();
+        break;
+      case "withdraw.html":
+        mainElement = createWithdrawPage();
+        break;
+      case "welcome.html":
+        mainElement = createWelcomePage();
+        break;
+      default:
+        throw Error(`page '${page}' not implemented`);
+    }
+    const container = document.getElementById("container");
+    if (!container) {
+      throw Error("container not found, can't mount page contents");
+    }
+    ReactDOM.render(mainElement, container);
+  } catch (e) {
+    console.error("got error", e);
+    document.body.innerText = `Fatal error: "${e.message}".  Please report 
this bug at https://bugs.gnunet.org/.`;
+  }
+}
+
+if (document.readyState === "loading") {
+  document.addEventListener("DOMContentLoaded", main);
+} else {
+  main();
+}
diff --git a/src/webex/pages/add-auditor.tsx b/src/webex/pages/add-auditor.tsx
index 5840f4d6..c28d15ca 100644
--- a/src/webex/pages/add-auditor.tsx
+++ b/src/webex/pages/add-auditor.tsx
@@ -23,7 +23,6 @@
 import { CurrencyRecord } from "../../types/dbTypes";
 import { getCurrencies, updateCurrency } from "../wxApi";
 import React, { useState } from "react";
-import { registerMountPage } from "../renderHtml";
 
 interface ConfirmAuditorProps {
   url: string;
@@ -32,10 +31,10 @@ interface ConfirmAuditorProps {
   expirationStamp: number;
 }
 
-function ConfirmAuditor(props: ConfirmAuditorProps) {
+function ConfirmAuditor(props: ConfirmAuditorProps): JSX.Element {
   const [addDone, setAddDone] = useState(false);
 
-  const add = async () => {
+  const add = async (): Promise<void> => {
     const currencies = await getCurrencies();
     let currency: CurrencyRecord | undefined;
 
@@ -79,7 +78,7 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
     setAddDone(true);
   };
 
-  const back = () => {
+  const back = (): void => {
     window.history.back();
   };
 
@@ -87,14 +86,12 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
     <div id="main">
       <p>
         Do you want to let <strong>{props.auditorPub}</strong> audit the
-        currency "{props.currency}"?
+        currency &quot;{props.currency}&quot;?
       </p>
       {addDone ? (
         <div>
           Auditor was added! You can also{" "}
-          <a href={chrome.extension.getURL("/src/webex/pages/auditors.html")}>
-            view and edit
-          </a>{" "}
+          <a href={chrome.extension.getURL("/auditors.html")}>view and 
edit</a>{" "}
           auditors.
         </div>
       ) : (
@@ -114,7 +111,7 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
   );
 }
 
-registerMountPage(() => {
+export function makeAddAuditorPage(): JSX.Element {
   const walletPageUrl = new URL(document.location.href);
   const url = walletPageUrl.searchParams.get("url");
   if (!url) {
@@ -135,4 +132,4 @@ registerMountPage(() => {
   const expirationStamp = Number.parseInt(auditorStampStr);
   const args = { url, currency, auditorPub, expirationStamp };
   return <ConfirmAuditor {...args} />;
-});
+}
diff --git a/src/webex/pages/auditors.tsx b/src/webex/pages/auditors.tsx
index e2bb29af..ac93afd3 100644
--- a/src/webex/pages/auditors.tsx
+++ b/src/webex/pages/auditors.tsx
@@ -29,7 +29,6 @@ import {
 import { getCurrencies, updateCurrency } from "../wxApi";
 
 import * as React from "react";
-import * as ReactDOM from "react-dom";
 
 interface CurrencyListState {
   currencies?: CurrencyRecord[];
@@ -49,13 +48,16 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
     this.state = {} as any;
   }
 
-  async update() {
+  async update(): Promise<void> {
     const currencies = await getCurrencies();
     console.log("currencies: ", currencies);
     this.setState({ currencies });
   }
 
-  async confirmRemoveAuditor(c: CurrencyRecord, a: AuditorRecord) {
+  async confirmRemoveAuditor(
+    c: CurrencyRecord,
+    a: AuditorRecord,
+  ): Promise<void> {
     if (
       window.confirm(
         `Do you really want to remove auditor ${a.baseUrl} for currency 
${c.name}?`,
@@ -66,7 +68,10 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
     }
   }
 
-  async confirmRemoveExchange(c: CurrencyRecord, e: ExchangeForCurrencyRecord) 
{
+  async confirmRemoveExchange(
+    c: CurrencyRecord,
+    e: ExchangeForCurrencyRecord,
+  ): Promise<void> {
     if (
       window.confirm(
         `Do you really want to remove exchange ${e.baseUrl} for currency 
${c.name}?`,
@@ -86,7 +91,7 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
         <p>Trusted Auditors:</p>
         <ul>
           {c.auditors.map((a) => (
-            <li>
+            <li key={a.baseUrl}>
               {a.baseUrl}{" "}
               <button
                 className="pure-button button-destructive"
@@ -114,7 +119,7 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
         <p>Trusted Exchanges:</p>
         <ul>
           {c.exchanges.map((e) => (
-            <li>
+            <li key={e.baseUrl}>
               {e.baseUrl}{" "}
               <button
                 className="pure-button button-destructive"
@@ -137,7 +142,7 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
     return (
       <div id="main">
         {currencies.map((c) => (
-          <div>
+          <div key={c.name}>
             <h1>Currency {c.name}</h1>
             <p>Displayed with {c.fractionalDigits} fractional digits.</p>
             <h2>Auditors</h2>
@@ -151,8 +156,6 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
   }
 }
 
-function main() {
-  ReactDOM.render(<CurrencyList />, document.getElementById("container")!);
+export function makeAuditorsPage(): JSX.Element {
+  return <CurrencyList />;
 }
-
-document.addEventListener("DOMContentLoaded", main);
diff --git a/src/webex/pages/benchmark.tsx b/src/webex/pages/benchmark.tsx
index 7de546bb..eb7193e0 100644
--- a/src/webex/pages/benchmark.tsx
+++ b/src/webex/pages/benchmark.tsx
@@ -27,8 +27,6 @@ import { BenchmarkResult } from "../../types/walletTypes";
 import * as wxApi from "../wxApi";
 
 import * as React from "react";
-import * as ReactDOM from "react-dom";
-import { registerMountPage } from "../renderHtml";
 
 interface BenchmarkRunnerState {
   repetitions: number;
@@ -36,7 +34,7 @@ interface BenchmarkRunnerState {
   running: boolean;
 }
 
-function BenchmarkDisplay(props: BenchmarkRunnerState) {
+function BenchmarkDisplay(props: BenchmarkRunnerState): JSX.Element {
   const result = props.result;
   if (!result) {
     if (props.running) {
@@ -57,7 +55,7 @@ function BenchmarkDisplay(props: BenchmarkRunnerState) {
           {Object.keys(result.time)
             .sort()
             .map((k) => (
-              <tr>
+              <tr key={k}>
                 <td>{k}</td>
                 <td>{result.time[k] / result.repetitions}</td>
               </tr>
@@ -77,13 +75,13 @@ class BenchmarkRunner extends React.Component<any, 
BenchmarkRunnerState> {
     };
   }
 
-  async run() {
+  async run(): Promise<void> {
     this.setState({ result: undefined, running: true });
-    let result = await wxApi.benchmarkCrypto(this.state.repetitions);
+    const result = await wxApi.benchmarkCrypto(this.state.repetitions);
     this.setState({ result, running: false });
   }
 
-  render() {
+  render(): JSX.Element {
     return (
       <div>
         <label>Repetitions:</label>
@@ -101,6 +99,6 @@ class BenchmarkRunner extends React.Component<any, 
BenchmarkRunnerState> {
   }
 }
 
-registerMountPage(() => {
+export function makeBenchmarkPage(): JSX.Element {
   return <BenchmarkRunner />;
-});
+}
diff --git a/src/webex/pages/pay.tsx b/src/webex/pages/pay.tsx
index 714e3b0a..61f28770 100644
--- a/src/webex/pages/pay.tsx
+++ b/src/webex/pages/pay.tsx
@@ -26,7 +26,7 @@ import * as i18n from "../i18n";
 
 import { PreparePayResult } from "../../types/walletTypes";
 
-import { renderAmount, ProgressButton, registerMountPage } from 
"../renderHtml";
+import { renderAmount, ProgressButton } from "../renderHtml";
 import * as wxApi from "../wxApi";
 
 import React, { useState, useEffect } from "react";
@@ -34,7 +34,7 @@ import React, { useState, useEffect } from "react";
 import * as Amounts from "../../util/amounts";
 import { codecForContractTerms, ContractTerms } from "../../types/talerTypes";
 
-function TalerPayDialog({ talerPayUri }: { talerPayUri: string }) {
+function TalerPayDialog({ talerPayUri }: { talerPayUri: string }): JSX.Element 
{
   const [payStatus, setPayStatus] = useState<PreparePayResult | undefined>();
   const [payErrMsg, setPayErrMsg] = useState<string | undefined>("");
   const [numTries, setNumTries] = useState(0);
@@ -42,12 +42,12 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
   let totalFees: Amounts.AmountJson | undefined = undefined;
 
   useEffect(() => {
-    const doFetch = async () => {
+    const doFetch = async (): Promise<void> => {
       const p = await wxApi.preparePay(talerPayUri);
       setPayStatus(p);
     };
     doFetch();
-  }, [numTries]);
+  }, [numTries, talerPayUri]);
 
   if (!payStatus) {
     return <span>Loading payment information ...</span>;
@@ -108,7 +108,7 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
     <strong>{renderAmount(Amounts.parseOrThrow(contractTerms.amount))}</strong>
   );
 
-  const doPayment = async () => {
+  const doPayment = async (): Promise<void> => {
     if (payStatus.status !== "payment-possible") {
       throw Error(`invalid state: ${payStatus.status}`);
     }
@@ -178,11 +178,11 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
   );
 }
 
-registerMountPage(() => {
+export function makePayPage(): JSX.Element {
   const url = new URL(document.location.href);
   const talerPayUri = url.searchParams.get("talerPayUri");
   if (!talerPayUri) {
     throw Error("invalid parameter");
   }
   return <TalerPayDialog talerPayUri={talerPayUri} />;
-});
+}
diff --git a/src/webex/pages/payback.tsx b/src/webex/pages/payback.tsx
index 96d43ff4..5d42f5f4 100644
--- a/src/webex/pages/payback.tsx
+++ b/src/webex/pages/payback.tsx
@@ -23,13 +23,8 @@
 /**
  * Imports.
  */
-import { ReserveRecord } from "../../types/dbTypes";
-import { renderAmount, registerMountPage } from "../renderHtml";
 import * as React from "react";
-import { useState } from "react";
 
-function Payback() {
+export function makePaybackPage(): JSX.Element {
   return <div>not implemented</div>;
 }
-
-registerMountPage(() => <Payback />);
diff --git a/src/webex/pages/popup.html b/src/webex/pages/popup.html
deleted file mode 100644
index 030641d6..00000000
--- a/src/webex/pages/popup.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8" />
-
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-    <link rel="stylesheet" type="text/css" href="popup.css" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/popup-bundle.js"></script>
-  </head>
-
-  <body>
-    <div id="container" style="margin: 0; padding: 0;"></div>
-  </body>
-</html>
diff --git a/src/webex/pages/popup.tsx b/src/webex/pages/popup.tsx
index 17880db5..cdb09d44 100644
--- a/src/webex/pages/popup.tsx
+++ b/src/webex/pages/popup.tsx
@@ -31,12 +31,7 @@ import * as Amounts from "../../util/amounts";
 
 import { WalletBalance, WalletBalanceEntry } from "../../types/walletTypes";
 
-import {
-  abbrev,
-  renderAmount,
-  PageLink,
-  registerMountPage,
-} from "../renderHtml";
+import { abbrev, renderAmount, PageLink } from "../renderHtml";
 import * as wxApi from "../wxApi";
 
 import React, { Fragment } from "react";
@@ -47,7 +42,7 @@ import { Timestamp } from "../../util/time";
 
 function onUpdateNotification(f: () => void): () => void {
   const port = chrome.runtime.connect({ name: "notifications" });
-  const listener = () => {
+  const listener = (): void => {
     f();
   };
   port.onMessage.addListener(listener);
@@ -76,7 +71,7 @@ class Router extends React.Component<any, any> {
 
   private static routeHandlers: any[] = [];
 
-  componentWillMount() {
+  componentWillMount(): void {
     console.log("router mounted");
     window.onhashchange = () => {
       this.setState({});
@@ -86,10 +81,6 @@ class Router extends React.Component<any, any> {
     };
   }
 
-  componentWillUnmount() {
-    console.log("router unmounted");
-  }
-
   render(): JSX.Element {
     const route = window.location.hash.substring(1);
     console.log("rendering route", route);
@@ -121,12 +112,12 @@ interface TabProps {
   children?: React.ReactNode;
 }
 
-function Tab(props: TabProps) {
+function Tab(props: TabProps): JSX.Element {
   let cssClass = "";
   if (props.target === Router.getRoute()) {
     cssClass = "active";
   }
-  const onClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
+  const onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {
     Router.setRoute(props.target);
     e.preventDefault();
   };
@@ -140,19 +131,19 @@ function Tab(props: TabProps) {
 class WalletNavBar extends React.Component<any, any> {
   private cancelSubscription: any;
 
-  componentWillMount() {
+  componentWillMount(): void {
     this.cancelSubscription = Router.onRoute(() => {
       this.setState({});
     });
   }
 
-  componentWillUnmount() {
+  componentWillUnmount(): void {
     if (this.cancelSubscription) {
       this.cancelSubscription();
     }
   }
 
-  render() {
+  render(): JSX.Element {
     console.log("rendering nav bar");
     return (
       <div className="nav" id="header">
@@ -164,20 +155,6 @@ class WalletNavBar extends React.Component<any, any> {
   }
 }
 
-function ExtensionLink(props: any) {
-  const onClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
-    chrome.tabs.create({
-      url: chrome.extension.getURL(props.target),
-    });
-    e.preventDefault();
-  };
-  return (
-    <a onClick={onClick} href={props.target}>
-      {props.children}
-    </a>
-  );
-}
-
 /**
  * Render an amount as a large number with a small currency symbol.
  */
@@ -191,7 +168,7 @@ function bigAmount(amount: AmountJson): JSX.Element {
   );
 }
 
-function EmptyBalanceView() {
+function EmptyBalanceView(): JSX.Element {
   return (
     <i18n.Translate wrap="p">
       You have no balance to show. Need some{" "}
@@ -206,12 +183,12 @@ class WalletBalanceView extends React.Component<any, any> 
{
   private canceler: (() => void) | undefined = undefined;
   private unmount = false;
 
-  componentWillMount() {
+  componentWillMount(): void {
     this.canceler = onUpdateNotification(() => this.updateBalance());
     this.updateBalance();
   }
 
-  componentWillUnmount() {
+  componentWillUnmount(): void {
     console.log("component WalletBalanceView will unmount");
     if (this.canceler) {
       this.canceler();
@@ -219,7 +196,7 @@ class WalletBalanceView extends React.Component<any, any> {
     this.unmount = true;
   }
 
-  async updateBalance() {
+  async updateBalance(): Promise<void> {
     let balance: WalletBalance;
     try {
       balance = await wxApi.getBalance();
@@ -326,11 +303,11 @@ class WalletBalanceView extends React.Component<any, any> 
{
   }
 }
 
-function Icon({ l }: { l: string }) {
+function Icon({ l }: { l: string }): JSX.Element {
   return <div className={"icon"}>{l}</div>;
 }
 
-function formatAndCapitalize(text: string) {
+function formatAndCapitalize(text: string): string {
   text = text.replace("-", " ");
   text = text.replace(/^./, text[0].toUpperCase());
   return text;
@@ -358,8 +335,8 @@ function HistoryItem({
   timestamp,
   icon,
   negative = false,
-}: HistoryItemProps) {
-  function formatDate(timestamp: number | "never") {
+}: HistoryItemProps): JSX.Element {
+  function formatDate(timestamp: number | "never"): string | null {
     if (timestamp !== "never") {
       const itemDate = moment(timestamp);
       if (itemDate.isBetween(moment().subtract(2, "days"), moment())) {
@@ -428,8 +405,8 @@ function amountDiff(
   total: string | Amounts.AmountJson,
   partial: string | Amounts.AmountJson,
 ): Amounts.AmountJson | string {
-  let a = typeof total === "string" ? Amounts.parse(total) : total;
-  let b = typeof partial === "string" ? Amounts.parse(partial) : partial;
+  const a = typeof total === "string" ? Amounts.parse(total) : total;
+  const b = typeof partial === "string" ? Amounts.parse(partial) : partial;
   if (a && b) {
     return Amounts.sub(a, b).amount;
   } else {
@@ -438,14 +415,14 @@ function amountDiff(
 }
 
 function parseSummary(summary: string) {
-  let parsed = summary.split(/: (.+)/);
+  const parsed = summary.split(/: (.+)/);
   return {
     merchant: parsed[0],
     item: parsed[1],
   };
 }
 
-function formatHistoryItem(historyItem: HistoryEvent) {
+function formatHistoryItem(historyItem: HistoryEvent): JSX.Element {
   switch (historyItem.type) {
     case "refreshed": {
       return (
@@ -638,7 +615,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
   }
 }
 
-const HistoryComponent = (props: any) => {
+const HistoryComponent = (props: any): JSX.Element => {
   const record = props.record;
   return formatHistoryItem(record);
 };
@@ -656,18 +633,18 @@ class WalletHistory extends React.Component<any, any> {
     "exchange-added",
   ];
 
-  componentWillMount() {
+  componentWillMount(): void {
     this.update();
     this.setState({ filter: true });
     onUpdateNotification(() => this.update());
   }
 
-  componentWillUnmount() {
+  componentWillUnmount(): void {
     console.log("history component unmounted");
     this.unmounted = true;
   }
 
-  update() {
+  update(): void {
     chrome.runtime.sendMessage({ type: "get-history" }, (resp) => {
       if (this.unmounted) {
         return;
@@ -690,7 +667,7 @@ class WalletHistory extends React.Component<any, any> {
     console.log("rendering history");
     const history: HistoryEvent[] = this.myHistory;
     if (this.gotError) {
-      return i18n.str`Error: could not retrieve event history`;
+      return <span>i18n.str`Error: could not retrieve event history`</span>;
     }
 
     if (!history) {
@@ -728,7 +705,7 @@ class WalletHistory extends React.Component<any, any> {
   }
 }
 
-function reload() {
+function reload(): void {
   try {
     chrome.runtime.reload();
     window.close();
@@ -737,7 +714,7 @@ function reload() {
   }
 }
 
-function confirmReset() {
+function confirmReset(): void {
   if (
     confirm(
       "Do you want to IRREVOCABLY DESTROY everything inside your" +
@@ -749,25 +726,14 @@ function confirmReset() {
   }
 }
 
-function WalletDebug(props: any) {
+function WalletDebug(props: any): JSX.Element {
   return (
     <div>
       <p>Debug tools:</p>
-      <button onClick={openExtensionPage("/src/webex/pages/popup.html")}>
-        wallet tab
-      </button>
-      <button onClick={openExtensionPage("/src/webex/pages/benchmark.html")}>
-        benchmark
-      </button>
-      <button onClick={openExtensionPage("/src/webex/pages/show-db.html")}>
-        show db
-      </button>
-      <button onClick={openExtensionPage("/src/webex/pages/tree.html")}>
-        show tree
-      </button>
-      <button onClick={openExtensionPage("/src/webex/pages/logs.html")}>
-        show logs
-      </button>
+      <button onClick={openExtensionPage("/popup.html")}>wallet tab</button>
+      <button onClick={openExtensionPage("/benchmark.html")}>benchmark</button>
+      <button onClick={openExtensionPage("/show-db.html")}>show db</button>
+      <button onClick={openExtensionPage("/tree.html")}>show tree</button>
       <br />
       <button onClick={confirmReset}>reset</button>
       <button onClick={reload}>reload chrome extension</button>
@@ -792,7 +758,7 @@ function openTab(page: string) {
   };
 }
 
-function WalletPopup() {
+function WalletPopup(): JSX.Element {
   return (
     <div>
       <WalletNavBar />
@@ -807,7 +773,7 @@ function WalletPopup() {
   );
 }
 
-registerMountPage(() => {
+export function createPopup(): JSX.Element {
   chrome.runtime.connect({ name: "popup" });
   return <WalletPopup />;
-});
+}
diff --git a/src/webex/pages/redirect.html b/src/webex/pages/redirect.html
deleted file mode 100644
index 67fddb52..00000000
--- a/src/webex/pages/redirect.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8" />
-
-    <script src="/src/webex/pages/redirect.js"></script>
-  </head>
-
-  <body>
-    Redirecting to extension page ...
-  </body>
-</html>
diff --git a/src/webex/pages/redirect.js b/src/webex/pages/redirect.js
deleted file mode 100644
index 547b225b..00000000
--- a/src/webex/pages/redirect.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * This is the entry point for redirects, and should be the only
- * web-accessible resource declared in the manifest.  This prevents
- * malicious websites from embedding wallet pages in them.
- *
- * We still need this redirect page since a webRequest can only directly
- * redirect to pages inside the extension that are a web-accessible resource.
- */
-
-const myUrl = new URL(window.location.href);
-const redirectUrl = myUrl.searchParams.get("url");
-if (!redirectUrl) {
-  console.error("missing redirect URL");
-} else {
-  window.location.replace(redirectUrl);
-}
diff --git a/src/webex/pages/refund.tsx b/src/webex/pages/refund.tsx
index 389d5e56..621a286b 100644
--- a/src/webex/pages/refund.tsx
+++ b/src/webex/pages/refund.tsx
@@ -21,13 +21,12 @@
  */
 
 import React, { useEffect, useState } from "react";
-import ReactDOM from "react-dom";
 
 import * as wxApi from "../wxApi";
 import { PurchaseDetails } from "../../types/walletTypes";
 import { AmountView } from "../renderHtml";
 
-function RefundStatusView(props: { talerRefundUri: string }) {
+function RefundStatusView(props: { talerRefundUri: string }): JSX.Element {
   const [applied, setApplied] = useState(false);
   const [purchaseDetails, setPurchaseDetails] = useState<
     PurchaseDetails | undefined
@@ -35,7 +34,7 @@ function RefundStatusView(props: { talerRefundUri: string }) {
   const [errMsg, setErrMsg] = useState<string | undefined>(undefined);
 
   useEffect(() => {
-    const doFetch = async () => {
+    const doFetch = async (): Promise<void> => {
       try {
         const hc = await wxApi.applyRefund(props.talerRefundUri);
         setApplied(true);
@@ -48,7 +47,7 @@ function RefundStatusView(props: { talerRefundUri: string }) {
       }
     };
     doFetch();
-  }, []);
+  }, [props.talerRefundUri]);
 
   console.log("rendering");
 
@@ -64,7 +63,7 @@ function RefundStatusView(props: { talerRefundUri: string }) {
     <>
       <h2>Refund Status</h2>
       <p>
-        The product <em>{purchaseDetails.contractTerms.summary!}</em> has
+        The product <em>{purchaseDetails.contractTerms.summary}</em> has
         received a total refund of{" "}
         <AmountView amount={purchaseDetails.totalRefundAmount} />.
       </p>
@@ -73,25 +72,18 @@ function RefundStatusView(props: { talerRefundUri: string 
}) {
   );
 }
 
-async function main() {
+export function createRefundPage(): JSX.Element {
   const url = new URL(document.location.href);
 
   const container = document.getElementById("container");
   if (!container) {
-    console.error("fatal: can't mount component, container missing");
-    return;
+    throw Error("fatal: can't mount component, container missing");
   }
 
   const talerRefundUri = url.searchParams.get("talerRefundUri");
   if (!talerRefundUri) {
-    console.error("taler refund URI requred");
-    return;
+    throw Error("taler refund URI requred");
   }
 
-  ReactDOM.render(
-    <RefundStatusView talerRefundUri={talerRefundUri} />,
-    container,
-  );
+  return <RefundStatusView talerRefundUri={talerRefundUri} />;
 }
-
-document.addEventListener("DOMContentLoaded", () => main());
diff --git a/src/webex/pages/reset-required.tsx 
b/src/webex/pages/reset-required.tsx
index 81f21f45..9e40e798 100644
--- a/src/webex/pages/reset-required.tsx
+++ b/src/webex/pages/reset-required.tsx
@@ -21,7 +21,6 @@
  */
 
 import * as React from "react";
-import * as ReactDOM from "react-dom";
 
 import * as wxApi from "../wxApi";
 
@@ -43,17 +42,17 @@ class ResetNotification extends React.Component<any, State> 
{
     this.state = { checked: false, resetRequired: true };
     setInterval(() => this.update(), 500);
   }
-  async update() {
+  async update(): Promise<void> {
     const res = await wxApi.checkUpgrade();
     this.setState({ resetRequired: res.dbResetRequired });
   }
-  render() {
+  render(): JSX.Element {
     if (this.state.resetRequired) {
       return (
         <div>
           <h1>Manual Reset Reqired</h1>
           <p>
-            The wallet's database in your browser is incompatible with the{" "}
+            The wallet&apos;s database in your browser is incompatible with 
the{" "}
             currently installed wallet. Please reset manually.
           </p>
           <p>
@@ -89,6 +88,6 @@ class ResetNotification extends React.Component<any, State> {
   }
 }
 
-document.addEventListener("DOMContentLoaded", () => {
-  ReactDOM.render(<ResetNotification />, 
document.getElementById("container")!);
-});
+export function createResetRequiredPage(): JSX.Element {
+  return <ResetNotification />;
+}
diff --git a/src/webex/pages/return-coins.html 
b/src/webex/pages/return-coins.html
deleted file mode 100644
index 54106f3e..00000000
--- a/src/webex/pages/return-coins.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="UTF-8" />
-    <title>Taler Wallet: Return Coins to Bank Account</title>
-
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
-    <link rel="icon" href="/img/icon.png" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/return-coins-bundle.js"></script>
-  </head>
-
-  <body>
-    <div id="container"></div>
-  </body>
-</html>
diff --git a/src/webex/pages/return-coins.tsx b/src/webex/pages/return-coins.tsx
index 3786697c..ccdb6db5 100644
--- a/src/webex/pages/return-coins.tsx
+++ b/src/webex/pages/return-coins.tsx
@@ -38,7 +38,6 @@ import { getBalance, getSenderWireInfos, returnCoins } from 
"../wxApi";
 import { renderAmount } from "../renderHtml";
 
 import * as React from "react";
-import * as ReactDOM from "react-dom";
 
 interface ReturnSelectionItemProps extends ReturnSelectionListProps {
   exchangeUrl: string;
@@ -129,7 +128,7 @@ class ReturnSelectionItem extends React.Component<
     );
   }
 
-  select() {
+  select(): void {
     let val: number;
     let selectedWire: number;
     try {
@@ -188,7 +187,7 @@ interface ReturnConfirmationProps {
 }
 
 class ReturnConfirmation extends React.Component<ReturnConfirmationProps, {}> {
-  render() {
+  render(): JSX.Element {
     return (
       <div>
         <p>
@@ -238,7 +237,7 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
     this.state = {} as any;
   }
 
-  async update() {
+  async update(): Promise<void> {
     const balance = await getBalance();
     const senderWireInfos = await getSenderWireInfos();
     console.log("got swi", senderWireInfos);
@@ -246,11 +245,11 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
     this.setState({ balance, senderWireInfos });
   }
 
-  selectDetail(d: SelectedDetail) {
+  selectDetail(d: SelectedDetail): void {
     this.setState({ selectedReturn: d });
   }
 
-  async confirm() {
+  async confirm(): Promise<void> {
     const selectedReturn = this.state.selectedReturn;
     if (!selectedReturn) {
       return;
@@ -263,14 +262,14 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
     });
   }
 
-  async cancel() {
+  async cancel(): Promise<void> {
     this.setState({
       selectedReturn: undefined,
       lastConfirmedDetail: undefined,
     });
   }
 
-  render() {
+  render(): JSX.Element {
     const balance = this.state.balance;
     const senderWireInfos = this.state.senderWireInfos;
     if (!balance || !senderWireInfos) {
@@ -291,8 +290,9 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
       <div id="main">
         <h1>Wire electronic cash back to own bank account</h1>
         <p>
-          You can send coins back into your own bank account. Note that you're
-          acting as a merchant when doing this, and thus the same fees apply.
+          You can send coins back into your own bank account. Note that
+          you&apos;re acting as a merchant when doing this, and thus the same
+          fees apply.
         </p>
         {this.state.lastConfirmedDetail ? (
           <p className="okaybox">
@@ -310,8 +310,6 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
   }
 }
 
-function main() {
-  ReactDOM.render(<ReturnCoins />, document.getElementById("container")!);
+export function createReturnCoinsPage(): JSX.Element {
+  return <ReturnCoins />;
 }
-
-document.addEventListener("DOMContentLoaded", main);
diff --git a/src/webex/pages/show-db.html b/src/webex/pages/show-db.html
deleted file mode 100644
index ae77e3fb..00000000
--- a/src/webex/pages/show-db.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="UTF-8" />
-    <title>Taler Wallet: Reserve Created</title>
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-    <link rel="icon" href="/img/icon.png" />
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/show-db-bundle.js"></script>
-  </head>
-  <body>
-    <h1>DB Dump</h1>
-    <input type="file" id="fileInput" style="display: none;" />
-    <button id="import">Import Dump</button>
-    <button id="download">Download Dump</button>
-    <pre id="dump"></pre>
-  </body>
-</html>
diff --git a/src/webex/pages/show-db.ts b/src/webex/pages/show-db.ts
deleted file mode 100644
index 16ea80d2..00000000
--- a/src/webex/pages/show-db.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- This file is part of TALER
- (C) 2015 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Wallet database dump for debugging.
- *
- * @author Florian Dold
- */
-
-function replacer(
-  match: string,
-  pIndent: string,
-  pKey: string,
-  pVal: string,
-  pEnd: string,
-) {
-  const key = "<span class=json-key>";
-  const val = "<span class=json-value>";
-  const str = "<span class=json-string>";
-  let r = pIndent || "";
-  if (pKey) {
-    r = r + key + '"' + pKey.replace(/[": ]/g, "") + '":</span> ';
-  }
-  if (pVal) {
-    r = r + (pVal[0] === '"' ? str : val) + pVal + "</span>";
-  }
-  return r + (pEnd || "");
-}
-
-function prettyPrint(obj: any) {
-  const jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/gm;
-  return JSON.stringify(obj, null as any, 3)
-    .replace(/&/g, "&amp;")
-    .replace(/\\"/g, "&quot;")
-    .replace(/</g, "&lt;")
-    .replace(/>/g, "&gt;")
-    .replace(jsonLine, replacer);
-}
-
-document.addEventListener("DOMContentLoaded", () => {
-  chrome.runtime.sendMessage({ type: "dump-db" }, (resp) => {
-    const el = document.getElementById("dump");
-    if (!el) {
-      throw Error();
-    }
-    el.innerHTML = prettyPrint(resp);
-
-    document.getElementById("download")!.addEventListener("click", (evt) => {
-      console.log("creating download");
-      const element = document.createElement("a");
-      element.setAttribute(
-        "href",
-        "data:text/plain;charset=utf-8," +
-          encodeURIComponent(JSON.stringify(resp)),
-      );
-      element.setAttribute("download", "wallet-dump.txt");
-      element.style.display = "none";
-      document.body.appendChild(element);
-      element.click();
-    });
-  });
-
-  const fileInput = document.getElementById("fileInput")! as HTMLInputElement;
-  fileInput.onchange = (evt) => {
-    if (!fileInput.files || fileInput.files.length !== 1) {
-      alert("please select exactly one file to import");
-      return;
-    }
-    const file = fileInput.files[0];
-    const fr = new FileReader();
-    fr.onload = (e: any) => {
-      console.log("got file");
-      const dump = JSON.parse(e.target.result);
-      console.log("parsed contents", dump);
-      chrome.runtime.sendMessage(
-        { type: "import-db", detail: { dump } },
-        (resp) => {
-          alert("loaded");
-        },
-      );
-    };
-    console.log("reading file", file);
-    fr.readAsText(file);
-  };
-
-  document.getElementById("import")!.addEventListener("click", (evt) => {
-    fileInput.click();
-    evt.preventDefault();
-  });
-});
diff --git a/src/webex/pages/tip.tsx b/src/webex/pages/tip.tsx
index 35e033c0..4a1d3743 100644
--- a/src/webex/pages/tip.tsx
+++ b/src/webex/pages/tip.tsx
@@ -22,38 +22,30 @@
  */
 
 import * as React from "react";
-import * as ReactDOM from "react-dom";
 
-import * as i18n from "../i18n";
+import { acceptTip, getTipStatus } from "../wxApi";
 
-import { acceptTip, getReserveCreationInfo, getTipStatus } from "../wxApi";
+import { renderAmount, ProgressButton } from "../renderHtml";
 
-import {
-  WithdrawDetailView,
-  renderAmount,
-  ProgressButton,
-} from "../renderHtml";
-
-import * as Amounts from "../../util/amounts";
 import { useState, useEffect } from "react";
 import { TipStatus } from "../../types/walletTypes";
 
-function TipDisplay(props: { talerTipUri: string }) {
+function TipDisplay(props: { talerTipUri: string }): JSX.Element {
   const [tipStatus, setTipStatus] = useState<TipStatus | undefined>(undefined);
   const [discarded, setDiscarded] = useState(false);
   const [loading, setLoading] = useState(false);
   const [finished, setFinished] = useState(false);
 
   useEffect(() => {
-    const doFetch = async () => {
+    const doFetch = async (): Promise<void> => {
       const ts = await getTipStatus(props.talerTipUri);
       setTipStatus(ts);
     };
     doFetch();
-  }, []);
+  }, [props.talerTipUri]);
 
   if (discarded) {
-    return <span>You've discarded the tip.</span>;
+    return <span>You&apos;ve discarded the tip.</span>;
   }
 
   if (finished) {
@@ -64,11 +56,11 @@ function TipDisplay(props: { talerTipUri: string }) {
     return <span>Loading ...</span>;
   }
 
-  const discard = () => {
+  const discard = (): void => {
     setDiscarded(true);
   };
 
-  const accept = async () => {
+  const accept = async (): Promise<void> => {
     setLoading(true);
     await acceptTip(tipStatus.tipId);
     setFinished(true);
@@ -100,26 +92,12 @@ function TipDisplay(props: { talerTipUri: string }) {
   );
 }
 
-async function main() {
-  try {
-    const url = new URL(document.location.href);
-    const talerTipUri = url.searchParams.get("talerTipUri");
-    if (typeof talerTipUri !== "string") {
-      throw Error("talerTipUri must be a string");
-    }
-
-    ReactDOM.render(
-      <TipDisplay talerTipUri={talerTipUri} />,
-      document.getElementById("container")!,
-    );
-  } catch (e) {
-    // TODO: provide more context information, maybe factor it out into a
-    // TODO:generic error reporting function or component.
-    document.body.innerText = i18n.str`Fatal error: "${e.message}".`;
-    console.error(`got error "${e.message}"`, e);
+export function createTipPage(): JSX.Element {
+  const url = new URL(document.location.href);
+  const talerTipUri = url.searchParams.get("talerTipUri");
+  if (typeof talerTipUri !== "string") {
+    throw Error("talerTipUri must be a string");
   }
-}
 
-document.addEventListener("DOMContentLoaded", () => {
-  main();
-});
+  return <TipDisplay talerTipUri={talerTipUri} />;
+}
diff --git a/src/webex/pages/welcome.tsx b/src/webex/pages/welcome.tsx
index 83f4f01d..eecbe2be 100644
--- a/src/webex/pages/welcome.tsx
+++ b/src/webex/pages/welcome.tsx
@@ -22,10 +22,10 @@
 
 import React, { useState, useEffect } from "react";
 import { getDiagnostics } from "../wxApi";
-import { registerMountPage, PageLink } from "../renderHtml";
+import { PageLink } from "../renderHtml";
 import { WalletDiagnostics } from "../../types/walletTypes";
 
-function Diagnostics() {
+function Diagnostics(): JSX.Element {
   const [timedOut, setTimedOut] = useState(false);
   const [diagnostics, setDiagnostics] = useState<WalletDiagnostics | 
undefined>(
     undefined,
@@ -39,7 +39,7 @@ function Diagnostics() {
         setTimedOut(true);
       }
     }, 1000);
-    const doFetch = async () => {
+    const doFetch = async (): Promise<void> => {
       const d = await getDiagnostics();
       console.log("got diagnostics", d);
       gotDiagnostics = true;
@@ -69,7 +69,7 @@ function Diagnostics() {
           <p>Problems detected:</p>
           <ol>
             {diagnostics.errors.map((errMsg) => (
-              <li>{errMsg}</li>
+              <li key={errMsg}>{errMsg}</li>
             ))}
           </ol>
           {diagnostics.firefoxIdbProblem ? (
@@ -95,7 +95,7 @@ function Diagnostics() {
   return <p>Running diagnostics ...</p>;
 }
 
-function Welcome() {
+function Welcome(): JSX.Element {
   return (
     <>
       <p>Thank you for installing the wallet.</p>
@@ -110,4 +110,6 @@ function Welcome() {
   );
 }
 
-registerMountPage(() => <Welcome />);
+export function createWelcomePage(): JSX.Element {
+  return <Welcome />;
+}
diff --git a/src/webex/pages/withdraw.html b/src/webex/pages/withdraw.html
deleted file mode 100644
index 861b219f..00000000
--- a/src/webex/pages/withdraw.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="UTF-8" />
-    <title>Taler Wallet: Withdraw</title>
-
-    <link rel="icon" href="/img/icon.png" />
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/withdraw-bundle.js"></script>
-  </head>
-
-  <body>
-    <section id="main">
-      <h1>GNU Taler Wallet</h1>
-      <div class="fade" id="exchange-selection"></div>
-    </section>
-  </body>
-</html>
diff --git a/src/webex/pages/withdraw.tsx b/src/webex/pages/withdraw.tsx
index 7a266531..efd0adc8 100644
--- a/src/webex/pages/withdraw.tsx
+++ b/src/webex/pages/withdraw.tsx
@@ -28,10 +28,11 @@ import { WithdrawDetails } from "../../types/walletTypes";
 import { WithdrawDetailView, renderAmount } from "../renderHtml";
 
 import React, { useState, useEffect } from "react";
-import * as ReactDOM from "react-dom";
 import { getWithdrawDetails, acceptWithdrawal } from "../wxApi";
 
-function NewExchangeSelection(props: { talerWithdrawUri: string }) {
+function NewExchangeSelection(props: {
+  talerWithdrawUri: string;
+}): JSX.Element {
   const [details, setDetails] = useState<WithdrawDetails | undefined>();
   const [selectedExchange, setSelectedExchange] = useState<
     string | undefined
@@ -43,7 +44,7 @@ function NewExchangeSelection(props: { talerWithdrawUri: 
string }) {
   const [errMsg, setErrMsg] = useState<string | undefined>("");
 
   useEffect(() => {
-    const fetchData = async () => {
+    const fetchData = async (): Promise<void> => {
       console.log("getting from", talerWithdrawUri);
       let d: WithdrawDetails | undefined = undefined;
       try {
@@ -64,7 +65,7 @@ function NewExchangeSelection(props: { talerWithdrawUri: 
string }) {
       setDetails(d);
     };
     fetchData();
-  }, [selectedExchange, errMsg, selecting]);
+  }, [selectedExchange, errMsg, selecting, talerWithdrawUri]);
 
   if (errMsg) {
     return (
@@ -145,9 +146,12 @@ function NewExchangeSelection(props: { talerWithdrawUri: 
string }) {
     );
   }
 
-  const accept = async () => {
+  const accept = async (): Promise<void> => {
+    if (!selectedExchange) {
+      throw Error("can't accept, no exchange selected");
+    }
     console.log("accepting exchange", selectedExchange);
-    const res = await acceptWithdrawal(talerWithdrawUri, selectedExchange!);
+    const res = await acceptWithdrawal(talerWithdrawUri, selectedExchange);
     console.log("accept withdrawal response", res);
     if (res.confirmTransferUrl) {
       document.location.href = res.confirmTransferUrl;
@@ -197,26 +201,11 @@ function NewExchangeSelection(props: { talerWithdrawUri: 
string }) {
   );
 }
 
-async function main() {
-  try {
-    const url = new URL(document.location.href);
-    const talerWithdrawUri = url.searchParams.get("talerWithdrawUri");
-    if (!talerWithdrawUri) {
-      throw Error("withdraw URI required");
-    }
-
-    ReactDOM.render(
-      <NewExchangeSelection talerWithdrawUri={talerWithdrawUri} />,
-      document.getElementById("exchange-selection")!,
-    );
-  } catch (e) {
-    // TODO: provide more context information, maybe factor it out into a
-    // TODO:generic error reporting function or component.
-    document.body.innerText = i18n.str`Fatal error: "${e.message}".`;
-    console.error("got error", e);
+export function createWithdrawPage(): JSX.Element {
+  const url = new URL(document.location.href);
+  const talerWithdrawUri = url.searchParams.get("talerWithdrawUri");
+  if (!talerWithdrawUri) {
+    throw Error("withdraw URI required");
   }
+  return <NewExchangeSelection talerWithdrawUri={talerWithdrawUri} />;
 }
-
-document.addEventListener("DOMContentLoaded", () => {
-  main();
-});
diff --git a/src/webex/renderHtml.tsx b/src/webex/renderHtml.tsx
index 08e7de60..b1363abf 100644
--- a/src/webex/renderHtml.tsx
+++ b/src/webex/renderHtml.tsx
@@ -27,17 +27,15 @@ import { AmountJson } from "../util/amounts";
 import * as Amounts from "../util/amounts";
 import { DenominationRecord } from "../types/dbTypes";
 import { ExchangeWithdrawDetails } from "../types/walletTypes";
-import * as moment from "moment";
 import * as i18n from "./i18n";
 import React from "react";
-import ReactDOM from "react-dom";
 import { stringifyTimestamp } from "../util/time";
 
 /**
  * Render amount as HTML, which non-breaking space between
  * decimal value and currency.
  */
-export function renderAmount(amount: AmountJson | string) {
+export function renderAmount(amount: AmountJson | string): JSX.Element {
   let a;
   if (typeof amount === "string") {
     a = Amounts.parse(amount);
@@ -55,14 +53,17 @@ export function renderAmount(amount: AmountJson | string) {
   );
 }
 
-export const AmountView = ({ amount }: { amount: AmountJson | string }) =>
-  renderAmount(amount);
+export const AmountView = ({
+  amount,
+}: {
+  amount: AmountJson | string;
+}): JSX.Element => renderAmount(amount);
 
 /**
  * Abbreviate a string to a given length, and show the full
  * string on hover as a tooltip.
  */
-export function abbrev(s: string, n: number = 5) {
+export function abbrev(s: string, n = 5): JSX.Element {
   let sAbbrev = s;
   if (s.length > n) {
     sAbbrev = s.slice(0, n) + "..";
@@ -95,12 +96,12 @@ export class Collapsible extends React.Component<
     super(props);
     this.state = { collapsed: props.initiallyCollapsed };
   }
-  render() {
-    const doOpen = (e: any) => {
+  render(): JSX.Element {
+    const doOpen = (e: any): void => {
       this.setState({ collapsed: false });
       e.preventDefault();
     };
-    const doClose = (e: any) => {
+    const doClose = (e: any): void => {
       this.setState({ collapsed: true });
       e.preventDefault();
     };
@@ -126,6 +127,37 @@ export class Collapsible extends React.Component<
   }
 }
 
+function WireFee(props: {
+  s: string;
+  rci: ExchangeWithdrawDetails;
+}): JSX.Element {
+  return (
+    <>
+      <thead>
+        <tr>
+          <th colSpan={3}>Wire Method {props.s}</th>
+        </tr>
+        <tr>
+          <th>Applies Until</th>
+          <th>Wire Fee</th>
+          <th>Closing Fee</th>
+        </tr>
+      </thead>
+      ,
+      <tbody>
+        {props.rci.wireFees.feesForType[props.s].map((f) => (
+          <tr key={f.sig}>
+            <td>{stringifyTimestamp(f.endStamp)}</td>
+            <td>{renderAmount(f.wireFee)}</td>
+            <td>{renderAmount(f.closingFee)}</td>
+          </tr>
+        ))}
+      </tbody>
+      ,
+    </>
+  );
+}
+
 function AuditorDetailsView(props: {
   rci: ExchangeWithdrawDetails | null;
 }): JSX.Element {
@@ -144,7 +176,7 @@ function AuditorDetailsView(props: {
   return (
     <div>
       {(rci.exchangeInfo.details?.auditors ?? []).map((a) => (
-        <div>
+        <div key={a.auditor_pub}>
           <h3>Auditor {a.auditor_url}</h3>
           <p>
             Public key: <ExpanderText text={a.auditor_pub} />
@@ -189,7 +221,7 @@ function FeeDetailsView(props: {
     countByPub[x.denomPub] = c;
   });
 
-  function row(denom: DenominationRecord) {
+  function row(denom: DenominationRecord): JSX.Element {
     return (
       <tr>
         <td>{countByPub[denom.denomPub] + "x"}</td>
@@ -201,30 +233,6 @@ function FeeDetailsView(props: {
     );
   }
 
-  function wireFee(s: string) {
-    return [
-      <thead>
-        <tr>
-          <th colSpan={3}>Wire Method {s}</th>
-        </tr>
-        <tr>
-          <th>Applies Until</th>
-          <th>Wire Fee</th>
-          <th>Closing Fee</th>
-        </tr>
-      </thead>,
-      <tbody>
-        {rci!.wireFees.feesForType[s].map((f) => (
-          <tr>
-            <td>{stringifyTimestamp(f.endStamp)}</td>
-            <td>{renderAmount(f.wireFee)}</td>
-            <td>{renderAmount(f.closingFee)}</td>
-          </tr>
-        ))}
-      </tbody>,
-    ];
-  }
-
   const withdrawFee = renderAmount(rci.withdrawFee);
   const overhead = renderAmount(rci.overhead);
 
@@ -264,7 +272,9 @@ function FeeDetailsView(props: {
       <h3>Wire Fees</h3>
       <div style={{ overflow: "auto" }}>
         <table className="pure-table">
-          {Object.keys(rci.wireFees.feesForType).map(wireFee)}
+          {Object.keys(rci.wireFees.feesForType).map((s) => (
+            <WireFee key={s} s={s} rci={rci} />
+          ))}
         </table>
       </div>
     </div>
@@ -297,7 +307,7 @@ interface ExpanderTextProps {
 /**
  * Show a heading with a toggle to show/hide the expandable content.
  */
-export function ExpanderText({ text }: ExpanderTextProps) {
+export function ExpanderText({ text }: ExpanderTextProps): JSX.Element {
   return <span>{text}</span>;
 }
 
@@ -311,7 +321,7 @@ export function ProgressButton(
       React.ButtonHTMLAttributes<HTMLButtonElement>,
       HTMLButtonElement
     >,
-) {
+): JSX.Element {
   return (
     <button
       className="pure-button pure-button-primary"
@@ -331,33 +341,17 @@ export function ProgressButton(
   );
 }
 
-export function registerMountPage(mainFn: () => React.ReactElement) {
-  async function main() {
-    try {
-      const mainElement = mainFn();
-      const container = document.getElementById("container");
-      if (!container) {
-        throw Error("container not found, can't mount page contents");
-      }
-      ReactDOM.render(mainElement, container);
-    } catch (e) {
-      document.body.innerText = `Fatal error: "${e.message}".  Please report 
this bug at https://bugs.gnunet.org/.`;
-      console.error("got error", e);
-    }
-  }
-
-  if (document.readyState === "loading") {
-    document.addEventListener("DOMContentLoaded", main);
-    return;
-  } else {
-    main();
-  }
-}
-
-export function PageLink(props: React.PropsWithChildren<{ pageName: string }>) 
{
-  const url = chrome.extension.getURL(`/src/webex/pages/${props.pageName}`);
+export function PageLink(
+  props: React.PropsWithChildren<{ pageName: string }>,
+): JSX.Element {
+  const url = chrome.extension.getURL(`/${props.pageName}`);
   return (
-    <a className="actionLink" href={url} target="_blank">
+    <a
+      className="actionLink"
+      href={url}
+      target="_blank"
+      rel="noopener noreferrer"
+    >
       {props.children}
     </a>
   );
diff --git a/src/webex/wxApi.ts b/src/webex/wxApi.ts
index a530b750..07b223c8 100644
--- a/src/webex/wxApi.ts
+++ b/src/webex/wxApi.ts
@@ -38,6 +38,9 @@ import {
   WalletBalance,
   PurchaseDetails,
   WalletDiagnostics,
+  WithdrawDetails,
+  PreparePayResult,
+  AcceptWithdrawalResponse,
 } from "../types/walletTypes";
 
 import { MessageMap, MessageType } from "./messages";
@@ -271,7 +274,7 @@ export function applyRefund(refundUrl: string): 
Promise<string> {
 /**
  * Abort a failed payment and try to get a refund.
  */
-export function abortFailedPayment(contractTermsHash: string) {
+export function abortFailedPayment(contractTermsHash: string): Promise<void> {
   return callBackend("abort-failed-payment", { contractTermsHash });
 }
 
@@ -288,7 +291,7 @@ export function benchmarkCrypto(repetitions: number): 
Promise<BenchmarkResult> {
 export function getWithdrawDetails(
   talerWithdrawUri: string,
   maybeSelectedExchange: string | undefined,
-) {
+): Promise<WithdrawDetails> {
   return callBackend("get-withdraw-details", {
     talerWithdrawUri,
     maybeSelectedExchange,
@@ -298,7 +301,7 @@ export function getWithdrawDetails(
 /**
  * Get details about a pay operation.
  */
-export function preparePay(talerPayUri: string) {
+export function preparePay(talerPayUri: string): Promise<PreparePayResult> {
   return callBackend("prepare-pay", { talerPayUri });
 }
 
@@ -308,7 +311,7 @@ export function preparePay(talerPayUri: string) {
 export function acceptWithdrawal(
   talerWithdrawUri: string,
   selectedExchange: string,
-) {
+): Promise<AcceptWithdrawalResponse> {
   return callBackend("accept-withdrawal", {
     talerWithdrawUri,
     selectedExchange,
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index 4c9a7655..8fbb1431 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -40,7 +40,6 @@ import { BrowserHttpLib } from "../util/http";
 import { OpenedPromise, openPromise } from "../util/promiseUtils";
 import { classifyTalerUri, TalerUriType } from "../util/taleruri";
 import { Wallet } from "../wallet";
-import { ChromeBadge } from "./chromeBadge";
 import { isFirefox } from "./compat";
 import { MessageType } from "./messages";
 import * as wxApi from "./wxApi";
@@ -49,6 +48,21 @@ import { Database } from "../util/query";
 
 const NeedsWallet = Symbol("NeedsWallet");
 
+/**
+ * Currently active wallet instance.  Might be unloaded and
+ * re-instantiated when the database is reset.
+ */
+let currentWallet: Wallet | undefined;
+
+let currentDatabase: IDBDatabase | undefined;
+
+/**
+ * Last version if an outdated DB, if applicable.
+ */
+let outdatedDbVersion: number | undefined;
+
+const walletInit: OpenedPromise<void> = openPromise<void>();
+
 async function handleMessage(
   sender: MessageSender,
   type: MessageType,
@@ -57,14 +71,12 @@ async function handleMessage(
   function assertNotFound(t: never): never {
     console.error(`Request type ${t as string} unknown`);
     console.error(`Request detail was ${detail}`);
-    return (
-      {
-        error: {
-          message: `request type ${t as string} unknown`,
-          requestType: type,
-        },
-      } as never
-    );
+    return {
+      error: {
+        message: `request type ${t as string} unknown`,
+        requestType: type,
+      },
+    } as never;
   }
   function needsWallet(): Wallet {
     if (!currentWallet) {
@@ -320,7 +332,7 @@ function getTab(tabId: number): Promise<chrome.tabs.Tab> {
   });
 }
 
-function setBadgeText(options: chrome.browserAction.BadgeTextDetails) {
+function setBadgeText(options: chrome.browserAction.BadgeTextDetails): void {
   // not supported by all browsers ...
   if (chrome && chrome.browserAction && chrome.browserAction.setBadgeText) {
     chrome.browserAction.setBadgeText(options);
@@ -331,9 +343,12 @@ function setBadgeText(options: 
chrome.browserAction.BadgeTextDetails) {
 
 function waitMs(timeoutMs: number): Promise<void> {
   return new Promise((resolve, reject) => {
-    chrome.extension
-      .getBackgroundPage()!
-      .setTimeout(() => resolve(), timeoutMs);
+    const bgPage = chrome.extension.getBackgroundPage();
+    if (!bgPage) {
+      reject("fatal: no background page");
+      return;
+    }
+    bgPage.setTimeout(() => resolve(), timeoutMs);
   });
 }
 
@@ -343,7 +358,7 @@ function makeSyncWalletRedirect(
   oldUrl: string,
   params?: { [name: string]: string | undefined },
 ): object {
-  const innerUrl = new URL(chrome.extension.getURL("/src/webex/pages/" + url));
+  const innerUrl = new URL(chrome.extension.getURL("/" + url));
   if (params) {
     for (const key in params) {
       const p = params[key];
@@ -352,48 +367,28 @@ function makeSyncWalletRedirect(
       }
     }
   }
-  const outerUrl = new URL(
-    chrome.extension.getURL("/src/webex/pages/redirect.html"),
-  );
-  outerUrl.searchParams.set("url", innerUrl.href);
   if (isFirefox()) {
     // Some platforms don't support the sync redirect (yet), so fall back to
     // async redirect after a timeout.
-    const doit = async () => {
+    const doit = async (): Promise<void> => {
       await waitMs(150);
       const tab = await getTab(tabId);
       if (tab.url === oldUrl) {
-        chrome.tabs.update(tabId, { url: outerUrl.href });
+        chrome.tabs.update(tabId, { url: innerUrl.href });
       }
     };
     doit();
   }
-  return { redirectUrl: outerUrl.href };
+  return { redirectUrl: innerUrl.href };
 }
 
-/**
- * Currently active wallet instance.  Might be unloaded and
- * re-instantiated when the database is reset.
- */
-let currentWallet: Wallet | undefined;
-
-let currentDatabase: IDBDatabase | undefined;
-
-/**
- * Last version if an outdated DB, if applicable.
- */
-let outdatedDbVersion: number | undefined;
-
-let walletInit: OpenedPromise<void> = openPromise<void>();
-
-async function reinitWallet() {
+async function reinitWallet(): Promise<void> {
   if (currentWallet) {
     currentWallet.stop();
     currentWallet = undefined;
   }
   currentDatabase = undefined;
   setBadgeText({ text: "" });
-  const badge = new ChromeBadge();
   try {
     currentDatabase = await openTalerDatabase(indexedDB, reinitWallet);
   } catch (e) {
@@ -448,7 +443,7 @@ try {
   chrome.runtime.onInstalled.addListener((details) => {
     console.log("onInstalled with reason", details.reason);
     if (details.reason === "install") {
-      const url = chrome.extension.getURL("/src/webex/pages/welcome.html");
+      const url = chrome.extension.getURL("/welcome.html");
       chrome.tabs.create({ active: true, url: url });
     }
   });
@@ -461,7 +456,7 @@ try {
  *
  * Sets up all event handlers and other machinery.
  */
-export async function wxMain() {
+export async function wxMain(): Promise<void> {
   // Explicitly unload the extension page as soon as an update is available,
   // so the update gets installed as soon as possible.
   chrome.runtime.onUpdateAvailable.addListener((details) => {
@@ -505,8 +500,13 @@ export async function wxMain() {
 
   chrome.tabs.onRemoved.addListener((tabId, changeInfo) => {
     const tt = tabTimers[tabId] || [];
+    const bgPage = chrome.extension.getBackgroundPage();
+    if (!bgPage) {
+      console.error("background page unavailable");
+      return;
+    }
     for (const t of tt) {
-      chrome.extension.getBackgroundPage()!.clearTimeout(t);
+      bgPage.clearTimeout(t);
     }
   });
   chrome.tabs.onUpdated.addListener((tabId, changeInfo) => {
@@ -515,12 +515,7 @@ export async function wxMain() {
     }
     const timers: number[] = [];
 
-    const addRun = (dt: number) => {
-      const id = chrome.extension.getBackgroundPage()!.setTimeout(run, dt);
-      timers.push(id);
-    };
-
-    const run = () => {
+    const run = (): void => {
       timers.shift();
       chrome.tabs.get(tabId, (tab) => {
         if (chrome.runtime.lastError) {
@@ -538,10 +533,20 @@ export async function wxMain() {
             document.dispatchEvent(new Event("taler-probe-result"));
           }
         `;
-        injectScript(tab.id!, { code, runAt: "document_start" }, uri.href);
+        injectScript(tab.id, { code, runAt: "document_start" }, uri.href);
       });
     };
 
+    const addRun = (dt: number): void => {
+      const bgPage = chrome.extension.getBackgroundPage();
+      if (!bgPage) {
+        console.error("no background page");
+        return;
+      }
+      const id = bgPage.setTimeout(run, dt);
+      timers.push(id);
+    };
+
     addRun(0);
     addRun(50);
     addRun(300);
@@ -571,7 +576,7 @@ export async function wxMain() {
       }
       if (details.statusCode === 402 || details.statusCode === 202) {
         console.log(`got 402/202 from ${details.url}`);
-        for (let header of details.responseHeaders || []) {
+        for (const header of details.responseHeaders || []) {
           if (header.name.toLowerCase() === "taler") {
             const talerUri = header.value || "";
             const uriType = classifyTalerUri(talerUri);
diff --git a/tsconfig.json b/tsconfig.json
index f87e16b1..a6fa12f9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,11 @@
 {
   "compileOnSave": true,
   "compilerOptions": {
-    "target": "es6",
+    "target": "ES6",
     "jsx": "react",
     "reactNamespace": "React",
-    "experimentalDecorators": true,
     "module": "commonjs",
+    "moduleResolution": "node",
     "sourceMap": true,
     "lib": [
       "es6",
@@ -21,103 +21,8 @@
     "allowJs": true,
     "checkJs": true,
     "incremental": true,
-    "esModuleInterop": true
+    "esModuleInterop": true,
+    "importHelpers": true
   },
-  "files": [
-    "src/android/index.ts",
-    "src/crypto/primitives/kdf.ts",
-    "src/crypto/primitives/nacl-fast.ts",
-    "src/crypto/primitives/sha256.ts",
-    "src/crypto/talerCrypto-test.ts",
-    "src/crypto/talerCrypto.ts",
-    "src/crypto/workers/browserWorkerEntry.ts",
-    "src/crypto/workers/cryptoApi.ts",
-    "src/crypto/workers/cryptoImplementation.ts",
-    "src/crypto/workers/cryptoWorker.ts",
-    "src/crypto/workers/nodeThreadWorker.ts",
-    "src/crypto/workers/synchronousWorker.ts",
-    "src/db.ts",
-    "src/headless/NodeHttpLib.ts",
-    "src/headless/bank.ts",
-    "src/headless/clk.ts",
-    "src/headless/helpers.ts",
-    "src/headless/integrationtest.ts",
-    "src/headless/merchant.ts",
-    "src/headless/taler-wallet-cli.ts",
-    "src/i18n/strings.ts",
-    "src/index.ts",
-    "src/operations/balance.ts",
-    "src/operations/errors.ts",
-    "src/operations/exchanges.ts",
-    "src/operations/history.ts",
-    "src/operations/pay.ts",
-    "src/operations/pending.ts",
-    "src/operations/recoup.ts",
-    "src/operations/refresh.ts",
-    "src/operations/refund.ts",
-    "src/operations/reserves.ts",
-    "src/operations/state.ts",
-    "src/operations/tip.ts",
-    "src/operations/versions.ts",
-    "src/operations/withdraw.ts",
-    "src/types/ReserveStatus.ts",
-    "src/types/ReserveTransaction.ts",
-    "src/types/dbTypes.ts",
-    "src/types/history.ts",
-    "src/types/notifications.ts",
-    "src/types/pending.ts",
-    "src/types/schemacore.ts",
-    "src/types/talerTypes.ts",
-    "src/types/types-test.ts",
-    "src/types/walletTypes.ts",
-    "src/util/RequestThrottler.ts",
-    "src/util/amounts.ts",
-    "src/util/assertUnreachable.ts",
-    "src/util/asyncMemo.ts",
-    "src/util/codec-test.ts",
-    "src/util/codec.ts",
-    "src/util/helpers-test.ts",
-    "src/util/helpers.ts",
-    "src/util/http.ts",
-    "src/util/libtoolVersion-test.ts",
-    "src/util/libtoolVersion.ts",
-    "src/util/logging.ts",
-    "src/util/payto-test.ts",
-    "src/util/payto.ts",
-    "src/util/promiseUtils.ts",
-    "src/util/query.ts",
-    "src/util/reserveHistoryUtil-test.ts",
-    "src/util/reserveHistoryUtil.ts",
-    "src/util/talerconfig.ts",
-    "src/util/taleruri-test.ts",
-    "src/util/taleruri.ts",
-    "src/util/time.ts",
-    "src/util/timer.ts",
-    "src/util/wire.ts",
-    "src/wallet-test.ts",
-    "src/wallet.ts",
-    "src/webex/background.ts",
-    "src/webex/chromeBadge.ts",
-    "src/webex/compat.ts",
-    "src/webex/i18n.tsx",
-    "src/webex/messages.ts",
-    "src/webex/notify.ts",
-    "src/webex/pages/add-auditor.tsx",
-    "src/webex/pages/auditors.tsx",
-    "src/webex/pages/benchmark.tsx",
-    "src/webex/pages/pay.tsx",
-    "src/webex/pages/payback.tsx",
-    "src/webex/pages/popup.tsx",
-    "src/webex/pages/redirect.js",
-    "src/webex/pages/refund.tsx",
-    "src/webex/pages/reset-required.tsx",
-    "src/webex/pages/return-coins.tsx",
-    "src/webex/pages/show-db.ts",
-    "src/webex/pages/tip.tsx",
-    "src/webex/pages/welcome.tsx",
-    "src/webex/pages/withdraw.tsx",
-    "src/webex/renderHtml.tsx",
-    "src/webex/wxApi.ts",
-    "src/webex/wxBackend.ts"
-  ]
-}
\ No newline at end of file
+  "include": ["src/**/*"]
+}
diff --git a/tslint.json b/tslint.json
deleted file mode 100644
index a56b56a9..00000000
--- a/tslint.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "defaultSeverity": "error",
-  "extends": [
-    "tslint:recommended"
-    ],
-    "jsRules": {},
-    "rules": {
-      "arrow-parens": false,
-      "max-line-length": {
-        "options": [120]
-      },
-      "space-before-function-paren": [true, {"named": "never", "anonymous": 
"always"}],
-      "no-console": [false],
-      "no-consecutive-blank-lines": [true, 2],
-      "forin": false,
-      "member-access": false,
-      "variable-name": false,
-      "interface-name": false,
-      "max-classes-per-file": false,
-      "ordered-imports": [true,
-        {
-          "import-sources-order": "lowercase-last",
-          "named-imports-order": "lowercase-last"
-        }
-      ],
-      "no-namespace": false,
-      "member-ordering": false,
-      "array-type": [true, "array-simple"],
-      "class-name": false,
-      "no-bitwise": false,
-      "file-header": [true, "GNU General Public License"],
-      "completed-docs": [true, {
-        "methods": {
-          "privacies": ["public"],
-          "locations": "all"
-        },
-        "properties": {
-          "privacies": ["public"],
-          "locations": ["all"]
-        },
-        "functions": {
-          "visibilities": ["exported"]
-        },
-        "interfaces": {
-          "visibilities": ["exported"]
-        },
-        "types": {
-          "visibilities": ["exported"]
-        },
-        "enums": {
-          "visibilities": ["exported"]
-        },
-        "classes": {
-          "visibilities": ["exported"]
-        },
-        "namespaces": {
-          "visibilities": ["exported"]
-        }
-      }],
-      "no-unused-variable": true
-    },
-    "rulesDirectory": []
-}
diff --git a/manifest.json b/webextension/manifest.json
similarity index 81%
rename from manifest.json
rename to webextension/manifest.json
index 8926e257..5bcb8c06 100644
--- a/manifest.json
+++ b/webextension/manifest.json
@@ -36,25 +36,21 @@
       "32": "img/icon.png"
     },
     "default_title": "Taler",
-    "default_popup": "src/webex/pages/popup.html"
+    "default_popup": "popup.html"
   },
 
   "content_scripts": [
     {
       "matches": ["*://*/*"],
       "js": [
-        "dist/contentScript-bundle.js"
+        "contentScript.js"
       ],
       "run_at": "document_start"
     }
   ],
 
-  "web_accessible_resources": [
-    "src/webex/pages/redirect.html"
-  ],
-
   "background": {
-    "page": "src/webex/background.html",
+    "page": "background.html",
     "persistent": true
   }
 }
diff --git a/webextension/pack.sh b/webextension/pack.sh
new file mode 100755
index 00000000..01abb01b
--- /dev/null
+++ b/webextension/pack.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+set -eu
+
+if [[ ! -e package.json ]]; then
+  echo "Please run this from the root of the repo.">&2
+  exit 1
+fi
+
+vers_manifest=$(jq -r '.version' webextension/manifest.json)
+
+rm -rf dist/wx
+mkdir -p dist/wx
+cp webextension/manifest.json dist/wx/
+cp -r webextension/static/* dist/wx/
+cp -r dist/webextension/* dist/wx/
+
+cd dist
+
+zip -r "taler-wallet-${vers_manifest}.zip" wx
diff --git a/src/webex/pages/add-auditor.html 
b/webextension/static/add-auditor.html
similarity index 73%
rename from src/webex/pages/add-auditor.html
rename to webextension/static/add-auditor.html
index 7f30b5fb..47a97c07 100644
--- a/src/webex/pages/add-auditor.html
+++ b/webextension/static/add-auditor.html
@@ -5,12 +5,11 @@
 
     <title>Taler Wallet: Add Auditor</title>
 
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
 
     <link rel="icon" href="/img/icon.png" />
 
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/add-auditor-bundle.js"></script>
+    <script src="/pageEntryPoint.js"></script>
 
     <style>
       .tree-item {
diff --git a/src/webex/pages/auditors.html b/webextension/static/auditors.html
similarity index 75%
rename from src/webex/pages/auditors.html
rename to webextension/static/auditors.html
index 7c207f75..15261290 100644
--- a/src/webex/pages/auditors.html
+++ b/webextension/static/auditors.html
@@ -4,12 +4,11 @@
     <meta charset="UTF-8" />
     <title>Taler Wallet: Auditors</title>
 
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
 
     <link rel="icon" href="/img/icon.png" />
 
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/auditors-bundle.js"></script>
+    <script src="/dist/webextension/pageEntryPoint.js"></script>
 
     <style>
       body {
diff --git a/src/webex/background.html b/webextension/static/background.html
similarity index 76%
rename from src/webex/background.html
rename to webextension/static/background.html
index 12a962c6..b89c0558 100644
--- a/src/webex/background.html
+++ b/webextension/static/background.html
@@ -2,7 +2,7 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <script src="../../dist/background-bundle.js"></script>
+    <script src="/background.js"></script>
     <title>(wallet bg page)</title>
   </head>
   <body>
diff --git a/src/webex/pages/benchmark.html b/webextension/static/benchmark.html
similarity index 60%
rename from src/webex/pages/benchmark.html
rename to webextension/static/benchmark.html
index d4216eca..a29fe072 100644
--- a/src/webex/pages/benchmark.html
+++ b/webextension/static/benchmark.html
@@ -3,10 +3,9 @@
   <head>
     <meta charset="UTF-8" />
     <title>Taler Wallet: Benchmarks</title>
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
     <link rel="icon" href="/img/icon.png" />
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/benchmark-bundle.js"></script>
+    <script src="/pageEntryPoint.js"></script>
   </head>
   <body>
     <section id="main">
diff --git a/img/icon.png b/webextension/static/img/icon.png
similarity index 100%
rename from img/icon.png
rename to webextension/static/img/icon.png
diff --git a/img/logo-2015-medium.png 
b/webextension/static/img/logo-2015-medium.png
similarity index 100%
rename from img/logo-2015-medium.png
rename to webextension/static/img/logo-2015-medium.png
diff --git a/img/logo.png b/webextension/static/img/logo.png
similarity index 100%
rename from img/logo.png
rename to webextension/static/img/logo.png
diff --git a/img/spinner-bars.svg b/webextension/static/img/spinner-bars.svg
similarity index 100%
rename from img/spinner-bars.svg
rename to webextension/static/img/spinner-bars.svg
diff --git a/src/webex/pages/pay.html b/webextension/static/pay.html
similarity index 85%
rename from src/webex/pages/pay.html
rename to webextension/static/pay.html
index 6afc9561..452c56df 100644
--- a/src/webex/pages/pay.html
+++ b/webextension/static/pay.html
@@ -4,13 +4,10 @@
     <meta charset="UTF-8" />
     <title>Taler Wallet: Confirm Contract</title>
 
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
     <link rel="icon" href="/img/icon.png" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/pay-bundle.js"></script>
+    <script src="/pageEntryPoint.js"></script>
 
     <style>
       button.accept {
diff --git a/src/webex/pages/payback.html b/webextension/static/payback.html
similarity index 74%
rename from src/webex/pages/payback.html
rename to webextension/static/payback.html
index 70694954..7ca9dc97 100644
--- a/src/webex/pages/payback.html
+++ b/webextension/static/payback.html
@@ -4,12 +4,10 @@
     <meta charset="UTF-8" />
     <title>Taler Wallet: Payback</title>
 
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
     <link rel="icon" href="/img/icon.png" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/payback-bundle.js"></script>
+    <script src="/pageEntryPoint.js"></script>
 
     <style>
       body {
diff --git a/webextension/static/popup.html b/webextension/static/popup.html
new file mode 100644
index 00000000..83f2f286
--- /dev/null
+++ b/webextension/static/popup.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8" />
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="/style/popup.css" />
+    <link rel="icon" href="/img/icon.png" />
+    <script src="/pageEntryPoint.js"></script>
+  </head>
+
+  <body>
+    <div id="container" style="margin: 0; padding: 0;"></div>
+  </body>
+</html>
diff --git a/src/webex/pages/refund.html b/webextension/static/refund.html
similarity index 62%
rename from src/webex/pages/refund.html
rename to webextension/static/refund.html
index c671bb19..3c1d78a2 100644
--- a/src/webex/pages/refund.html
+++ b/webextension/static/refund.html
@@ -4,12 +4,10 @@
     <meta charset="UTF-8" />
     <title>Taler Wallet: Refund Status</title>
 
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
     <link rel="icon" href="/img/icon.png" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/refund-bundle.js"></script>
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
   </head>
 
   <body>
diff --git a/src/webex/pages/reset-required.html 
b/webextension/static/reset-required.html
similarity index 59%
rename from src/webex/pages/reset-required.html
rename to webextension/static/reset-required.html
index 124d5f46..84943fbf 100644
--- a/src/webex/pages/reset-required.html
+++ b/webextension/static/reset-required.html
@@ -5,11 +5,9 @@
     <title>Taler Wallet: Select Taler Provider</title>
 
     <link rel="icon" href="/img/icon.png" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/reset-required-bundle.js"></script>
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
 
     <style>
       body {
diff --git a/webextension/static/return-coins.html 
b/webextension/static/return-coins.html
new file mode 100644
index 00000000..90703b44
--- /dev/null
+++ b/webextension/static/return-coins.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Return Coins to Bank Account</title>
+
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
+  </head>
+
+  <body>
+    <div id="container"></div>
+  </body>
+</html>
diff --git a/src/webex/pages/popup.css b/webextension/static/style/popup.css
similarity index 100%
rename from src/webex/pages/popup.css
rename to webextension/static/style/popup.css
diff --git a/src/webex/style/pure.css b/webextension/static/style/pure.css
similarity index 100%
rename from src/webex/style/pure.css
rename to webextension/static/style/pure.css
diff --git a/src/webex/style/wallet.css b/webextension/static/style/wallet.css
similarity index 100%
rename from src/webex/style/wallet.css
rename to webextension/static/style/wallet.css
diff --git a/src/webex/pages/tip.html b/webextension/static/tip.html
similarity index 55%
rename from src/webex/pages/tip.html
rename to webextension/static/tip.html
index 0625640e..00ed4d24 100644
--- a/src/webex/pages/tip.html
+++ b/webextension/static/tip.html
@@ -5,11 +5,9 @@
     <title>Taler Wallet: Received Tip</title>
 
     <link rel="icon" href="/img/icon.png" />
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/tip-bundle.js"></script>
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
   </head>
 
   <body>
diff --git a/src/webex/pages/welcome.html b/webextension/static/welcome.html
similarity index 56%
rename from src/webex/pages/welcome.html
rename to webextension/static/welcome.html
index 8f17891e..dc893211 100644
--- a/src/webex/pages/welcome.html
+++ b/webextension/static/welcome.html
@@ -5,11 +5,9 @@
     <title>Taler Wallet: Withdraw</title>
 
     <link rel="icon" href="/img/icon.png" />
-    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
-
-    <script src="/dist/page-common-bundle.js"></script>
-    <script src="/dist/welcome-bundle.js"></script>
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
   </head>
 
   <body>
diff --git a/webextension/static/withdraw.html 
b/webextension/static/withdraw.html
new file mode 100644
index 00000000..d2aab1b6
--- /dev/null
+++ b/webextension/static/withdraw.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Withdraw</title>
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="/style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="/style/wallet.css" />
+    <script src="/pageEntryPoint.js"></script>
+  </head>
+
+  <body>
+    <section id="main">
+      <h1>GNU Taler Wallet</h1>
+      <div class="fade" id="container"></div>
+    </section>
+  </body>
+</html>
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index 15e60c1e..00000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,111 +0,0 @@
-const path = require('path');
-const webpack = require('webpack');
-const merge = require('webpack-merge');
-const { CheckerPlugin } = require('awesome-typescript-loader')
-const TerserPlugin = require('terser-webpack-plugin');
-
-
-function externalsCb(context, request, callback) {
-  if (/.*taler-emscripten-lib.*/.test(request)) {
-    callback(null, "undefined");
-    return;
-  }
-  callback();
-}
-
-module.exports = function (env) {
-  env = env || {};
-  const base = {
-    output: {
-      filename: '[name]-bundle.js',
-      chunkFilename: "[name]-bundle.js",
-      path: path.resolve(__dirname, "dist"),
-    },
-    module: {
-      noParse: /taler-emscripten-lib/,
-      rules: [
-        {
-          test: /\.tsx?$/,
-          loader: 'awesome-typescript-loader',
-          exclude: 
/node_modules|taler-emscripten-lib|nodeEmscriptenLoader|synchronousWorker/,
-        }
-      ]
-    },
-    resolve: {
-      modules: [path.resolve(__dirname, "./"), "node_modules"],
-      extensions: [".tsx", ".ts", ".js"]
-    },
-    plugins: [
-      new CheckerPlugin(),
-    ],
-    devtool: "source-map",
-    externals: [
-      externalsCb,
-      "child_process",
-    ],
-    optimization: {
-      minimize: false,
-      minimizer: [
-        new TerserPlugin({
-          sourceMap: true,
-          terserOptions: {
-            keep_classnames: true,
-            keep_fnames: true,
-          }
-        }),
-      ],
-    }
-  }
-  const configWebWorker = {
-    entry: {"cryptoWorker": "./src/crypto/workers/browserWorkerEntry.ts"},
-    target: "webworker",
-    name: "webworker",
-  };
-
-  const configBackground = {
-    entry: {"background": "./src/webex/background.ts"},
-    name: "background",
-  };
-
-  const configContentScript = {
-    entry: {"contentScript": "./src/webex/notify.ts"},
-    name: "contentScript",
-  };
-
-  const configExtensionPages = {
-    entry: {
-      "add-auditor": "./src/webex/pages/add-auditor.tsx",
-      "auditors": "./src/webex/pages/auditors.tsx",
-      "benchmark": "./src/webex/pages/benchmark.tsx",
-      "pay": "./src/webex/pages/pay.tsx",
-      "withdraw": "./src/webex/pages/withdraw.tsx",
-      "welcome": "./src/webex/pages/welcome.tsx",
-      "payback": "./src/webex/pages/payback.tsx",
-      "popup": "./src/webex/pages/popup.tsx",
-      "reset-required": "./src/webex/pages/reset-required.tsx",
-      "return-coins": "./src/webex/pages/return-coins.tsx",
-      "refund": "./src/webex/pages/refund.tsx",
-      "show-db": "./src/webex/pages/show-db.ts",
-      "tip": "./src/webex/pages/tip.tsx",
-    },
-    name: "pages",
-    optimization: {
-      splitChunks: {
-        cacheGroups: {
-          commons: {
-            name: 'page-common',
-            chunks: 'all',
-            minChunks: 2,
-          },
-        },
-      },
-    },
-  };
-
-  return [
-    merge(base, configBackground),
-    merge(base, configWebWorker),
-    merge(base, configExtensionPages),
-    merge(base, configContentScript)
-  ];
-}
diff --git a/yarn.lock b/yarn.lock
index 7ae70a06..a877779b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -16,38 +16,133 @@
   dependencies:
     "@babel/highlight" "^7.0.0"
 
-"@babel/generator@^7.4.0", "@babel/generator@^7.7.2":
-  version "7.7.2"
-  resolved 
"https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af";
-  integrity 
sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==
+"@babel/code-frame@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e";
+  integrity 
sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+  dependencies:
+    "@babel/highlight" "^7.8.3"
+
+"@babel/core@^7.7.5":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e";
+  integrity 
sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.9.0"
+    "@babel/helper-module-transforms" "^7.9.0"
+    "@babel/helpers" "^7.9.0"
+    "@babel/parser" "^7.9.0"
+    "@babel/template" "^7.8.6"
+    "@babel/traverse" "^7.9.0"
+    "@babel/types" "^7.9.0"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.1"
+    json5 "^2.1.2"
+    lodash "^4.17.13"
+    resolve "^1.3.2"
+    semver "^5.4.1"
+    source-map "^0.5.0"
+
+"@babel/generator@^7.9.0":
+  version "7.9.4"
+  resolved 
"https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce";
+  integrity 
sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==
   dependencies:
-    "@babel/types" "^7.7.2"
+    "@babel/types" "^7.9.0"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
 
-"@babel/helper-function-name@^7.7.0":
-  version "7.7.0"
-  resolved 
"https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3";
-  integrity 
sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==
+"@babel/helper-function-name@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca";
+  integrity 
sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-get-function-arity@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5";
+  integrity 
sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-member-expression-to-functions@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c";
+  integrity 
sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-module-imports@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498";
+  integrity 
sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-module-transforms@^7.9.0":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5";
+  integrity 
sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.6"
+    "@babel/helper-simple-access" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/template" "^7.8.6"
+    "@babel/types" "^7.9.0"
+    lodash "^4.17.13"
+
+"@babel/helper-optimise-call-expression@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9";
+  integrity 
sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-replace-supers@^7.8.6":
+  version "7.8.6"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8";
+  integrity 
sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/traverse" "^7.8.6"
+    "@babel/types" "^7.8.6"
+
+"@babel/helper-simple-access@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae";
+  integrity 
sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.7.0"
-    "@babel/template" "^7.7.0"
-    "@babel/types" "^7.7.0"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-get-function-arity@^7.7.0":
-  version "7.7.0"
-  resolved 
"https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d";
-  integrity 
sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==
+"@babel/helper-split-export-declaration@^7.8.3":
+  version "7.8.3"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9";
+  integrity 
sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
   dependencies:
-    "@babel/types" "^7.7.0"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-validator-identifier@^7.9.0":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed";
+  integrity 
sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==
 
-"@babel/helper-split-export-declaration@^7.7.0":
-  version "7.7.0"
-  resolved 
"https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300";
-  integrity 
sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==
+"@babel/helpers@^7.9.0":
+  version "7.9.2"
+  resolved 
"https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f";
+  integrity 
sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
   dependencies:
-    "@babel/types" "^7.7.0"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.9.0"
+    "@babel/types" "^7.9.0"
 
 "@babel/highlight@^7.0.0":
   version "7.5.0"
@@ -58,41 +153,65 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2":
-  version "7.7.3"
-  resolved 
"https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043";
-  integrity 
sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==
-
-"@babel/template@^7.4.0", "@babel/template@^7.7.0":
-  version "7.7.0"
-  resolved 
"https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0";
-  integrity 
sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==
+"@babel/highlight@^7.8.3":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079";
+  integrity 
sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.7.0"
-    "@babel/types" "^7.7.0"
+    "@babel/helper-validator-identifier" "^7.9.0"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
 
-"@babel/traverse@^7.4.3":
-  version "7.7.2"
-  resolved 
"https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09";
-  integrity 
sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==
-  dependencies:
-    "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.7.2"
-    "@babel/helper-function-name" "^7.7.0"
-    "@babel/helper-split-export-declaration" "^7.7.0"
-    "@babel/parser" "^7.7.2"
-    "@babel/types" "^7.7.2"
+"@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
+  version "7.9.4"
+  resolved 
"https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8";
+  integrity 
sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
+
+"@babel/runtime-corejs3@^7.8.3":
+  version "7.9.2"
+  resolved 
"https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7";
+  integrity 
sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==
+  dependencies:
+    core-js-pure "^3.0.0"
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.4.5":
+  version "7.9.2"
+  resolved 
"https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06";
+  integrity 
sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
+  version "7.8.6"
+  resolved 
"https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b";
+  integrity 
sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/parser" "^7.8.6"
+    "@babel/types" "^7.8.6"
+
+"@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892";
+  integrity 
sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.9.0"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/parser" "^7.9.0"
+    "@babel/types" "^7.9.0"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.4.0", "@babel/types@^7.7.0", "@babel/types@^7.7.2":
-  version "7.7.2"
-  resolved 
"https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7";
-  integrity 
sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==
+"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0":
+  version "7.9.0"
+  resolved 
"https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5";
+  integrity 
sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==
   dependencies:
-    esutils "^2.0.2"
+    "@babel/helper-validator-identifier" "^7.9.0"
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
@@ -103,6 +222,21 @@
   dependencies:
     arrify "^1.0.1"
 
+"@istanbuljs/load-nyc-config@^1.0.0":
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b";
+  integrity 
sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==
+  dependencies:
+    camelcase "^5.3.1"
+    find-up "^4.1.0"
+    js-yaml "^3.13.1"
+    resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+  version "0.1.2"
+  resolved 
"https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd";
+  integrity 
sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
+
 "@nodelib/fs.scandir@2.1.3":
   version "2.1.3"
   resolved 
"https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b";
@@ -124,12 +258,27 @@
     "@nodelib/fs.scandir" "2.1.3"
     fastq "^1.6.0"
 
-"@rollup/plugin-json@^4.0.0":
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.0.0.tgz#4462e83c7ad5544bef4a601a6e8450daedc4b69b";
-  integrity 
sha512-Z65CtEVWv40+ri4CvmswyhtuUtki9yP5p0UJN/GyCKKyU4jRuDS9CG0ZuV7/XuS7zGkoajyE7E4XBEaC4GW62A==
+"@rollup/plugin-json@^4.0.2":
+  version "4.0.2"
+  resolved 
"https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.0.2.tgz#482185ee36ac7dd21c346e2dbcc22ffed0c6f2d6";
+  integrity 
sha512-t4zJMc98BdH42mBuzjhQA7dKh0t4vMJlUka6Fz0c+iO5IVnWaEMiYBy1uBj9ruHZzXBW23IPDGL9oCzBkQ9Udg==
   dependencies:
-    rollup-pluginutils "^2.5.0"
+    "@rollup/pluginutils" "^3.0.4"
+
+"@rollup/plugin-replace@^2.3.1":
+  version "2.3.1"
+  resolved 
"https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.1.tgz#16fb0563628f9e6c6ef9e05d48d3608916d466f5";
+  integrity 
sha512-qDcXj2VOa5+j0iudjb+LiwZHvBRRgWbHPhRmo1qde2KItTjuxDVQO21rp9/jOlzKR5YO0EsgRQoyox7fnL7y/A==
+  dependencies:
+    "@rollup/pluginutils" "^3.0.4"
+    magic-string "^0.25.5"
+
+"@rollup/pluginutils@^3.0.4":
+  version "3.0.8"
+  resolved 
"https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.8.tgz#4e94d128d94b90699e517ef045422960d18c8fde";
+  integrity 
sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==
+  dependencies:
+    estree-walker "^1.0.1"
 
 "@sindresorhus/is@^0.14.0":
   version "0.14.0"
@@ -143,22 +292,23 @@
   dependencies:
     defer-to-connect "^1.0.1"
 
-"@types/chrome@^0.0.91":
-  version "0.0.91"
-  resolved 
"https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.91.tgz#4b3996f55f344057e6a677c8366aa98080c6e380";
-  integrity 
sha512-vNvo9lJkp1AvViWrUwe1bxhoMwr5dRZWlgr1DTuaNkz97LsG56lDX1sceWeZir2gRACJ5vdHtoRdVAvm8C75Ug==
+"@types/chrome@^0.0.103":
+  version "0.0.103"
+  resolved 
"https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.103.tgz#604f3d94ab4465cc8cde302c4916f4955eb7e8b6";
+  integrity 
sha512-s8So1IG1fIu2dg2MRV3k6W5OjlVaJriNXIxIWDHi+Rdz5dLeuzPKcWzkVlcaVL4gONfn44JKC0RhW+P0UohLfg==
   dependencies:
     "@types/filesystem" "*"
+    "@types/har-format" "*"
 
 "@types/color-name@^1.1.1":
   version "1.1.1"
   resolved 
"https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0";
   integrity 
sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 
-"@types/estree@*":
-  version "0.0.40"
-  resolved 
"https://registry.yarnpkg.com/@types/estree/-/estree-0.0.40.tgz#0e6cb9b9bbd098031fa19e4b4e8131bc70e5de13";
-  integrity 
sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA==
+"@types/eslint-visitor-keys@^1.0.0":
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d";
+  integrity 
sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
 
 "@types/estree@0.0.39":
   version "0.0.39"
@@ -191,7 +341,17 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
-"@types/minimatch@*", "@types/minimatch@3.0.3":
+"@types/har-format@*":
+  version "1.2.4"
+  resolved 
"https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.4.tgz#3275842095abb60d14b47fa798cc9ff708dab6d4";
+  integrity 
sha512-iUxzm1meBm3stxUMzRqgOVHjj4Kgpgu5w9fm4X7kPRfSgVRzythsucEN7/jtOo8SQzm+HfcxWWzJS0mJDH/3DQ==
+
+"@types/json-schema@^7.0.3":
+  version "7.0.4"
+  resolved 
"https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339";
+  integrity 
sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+
+"@types/minimatch@*":
   version "3.0.3"
   resolved 
"https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d";
   integrity 
sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
@@ -216,17 +376,17 @@
   resolved 
"https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7";
   integrity 
sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
 
-"@types/react-dom@^16.0.0":
-  version "16.9.4"
-  resolved 
"https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df";
-  integrity 
sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw==
+"@types/react-dom@^16.9.6":
+  version "16.9.6"
+  resolved 
"https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.6.tgz#9e7f83d90566521cc2083be2277c6712dcaf754c";
+  integrity 
sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ==
   dependencies:
     "@types/react" "*"
 
-"@types/react@*", "@types/react@^16.4.0":
-  version "16.9.11"
-  resolved 
"https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120";
-  integrity 
sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ==
+"@types/react@*", "@types/react@^16.9.6":
+  version "16.9.32"
+  resolved 
"https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383";
+  integrity 
sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==
   dependencies:
     "@types/prop-types" "*"
     csstype "^2.2.0"
@@ -238,189 +398,91 @@
   dependencies:
     "@types/node" "*"
 
-"@webassemblyjs/ast@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359";
-  integrity 
sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==
-  dependencies:
-    "@webassemblyjs/helper-module-context" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/wast-parser" "1.8.5"
-
-"@webassemblyjs/floating-point-hex-parser@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721";
-  integrity 
sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==
-
-"@webassemblyjs/helper-api-error@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7";
-  integrity 
sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==
-
-"@webassemblyjs/helper-buffer@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204";
-  integrity 
sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==
-
-"@webassemblyjs/helper-code-frame@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e";
-  integrity 
sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==
-  dependencies:
-    "@webassemblyjs/wast-printer" "1.8.5"
-
-"@webassemblyjs/helper-fsm@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452";
-  integrity 
sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==
-
-"@webassemblyjs/helper-module-context@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245";
-  integrity 
sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    mamacro "^0.0.3"
-
-"@webassemblyjs/helper-wasm-bytecode@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61";
-  integrity 
sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==
-
-"@webassemblyjs/helper-wasm-section@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf";
-  integrity 
sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
-
-"@webassemblyjs/ieee754@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e";
-  integrity 
sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==
-  dependencies:
-    "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10";
-  integrity 
sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==
-  dependencies:
-    "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc";
-  integrity 
sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==
-
-"@webassemblyjs/wasm-edit@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a";
-  integrity 
sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/helper-wasm-section" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
-    "@webassemblyjs/wasm-opt" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
-    "@webassemblyjs/wast-printer" "1.8.5"
-
-"@webassemblyjs/wasm-gen@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc";
-  integrity 
sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/ieee754" "1.8.5"
-    "@webassemblyjs/leb128" "1.8.5"
-    "@webassemblyjs/utf8" "1.8.5"
-
-"@webassemblyjs/wasm-opt@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264";
-  integrity 
sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
-
-"@webassemblyjs/wasm-parser@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d";
-  integrity 
sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-api-error" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/ieee754" "1.8.5"
-    "@webassemblyjs/leb128" "1.8.5"
-    "@webassemblyjs/utf8" "1.8.5"
-
-"@webassemblyjs/wast-parser@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c";
-  integrity 
sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/floating-point-hex-parser" "1.8.5"
-    "@webassemblyjs/helper-api-error" "1.8.5"
-    "@webassemblyjs/helper-code-frame" "1.8.5"
-    "@webassemblyjs/helper-fsm" "1.8.5"
-    "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/wast-printer@1.8.5":
-  version "1.8.5"
-  resolved 
"https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc";
-  integrity 
sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/wast-parser" "1.8.5"
-    "@xtuc/long" "4.2.2"
-
-"@xtuc/ieee754@^1.2.0":
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790";
-  integrity 
sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
-  version "4.2.2"
-  resolved 
"https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d";
-  integrity 
sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
-abbrev@1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8";
-  integrity 
sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-accepts@~1.3.7:
-  version "1.3.7"
-  resolved 
"https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd";
-  integrity 
sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+"@typescript-eslint/eslint-plugin@^2.26.0":
+  version "2.26.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f";
+  integrity 
sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==
+  dependencies:
+    "@typescript-eslint/experimental-utils" "2.26.0"
+    functional-red-black-tree "^1.0.1"
+    regexpp "^3.0.0"
+    tsutils "^3.17.1"
+
+"@typescript-eslint/experimental-utils@2.26.0":
+  version "2.26.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d";
+  integrity 
sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==
+  dependencies:
+    "@types/json-schema" "^7.0.3"
+    "@typescript-eslint/typescript-estree" "2.26.0"
+    eslint-scope "^5.0.0"
+    eslint-utils "^2.0.0"
+
+"@typescript-eslint/experimental-utils@2.27.0":
+  version "2.27.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a";
+  integrity 
sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw==
+  dependencies:
+    "@types/json-schema" "^7.0.3"
+    "@typescript-eslint/typescript-estree" "2.27.0"
+    eslint-scope "^5.0.0"
+    eslint-utils "^2.0.0"
+
+"@typescript-eslint/parser@^2.24.0":
+  version "2.27.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287";
+  integrity 
sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg==
+  dependencies:
+    "@types/eslint-visitor-keys" "^1.0.0"
+    "@typescript-eslint/experimental-utils" "2.27.0"
+    "@typescript-eslint/typescript-estree" "2.27.0"
+    eslint-visitor-keys "^1.1.0"
+
+"@typescript-eslint/parser@^2.26.0":
+  version "2.26.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f";
+  integrity 
sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==
+  dependencies:
+    "@types/eslint-visitor-keys" "^1.0.0"
+    "@typescript-eslint/experimental-utils" "2.26.0"
+    "@typescript-eslint/typescript-estree" "2.26.0"
+    eslint-visitor-keys "^1.1.0"
+
+"@typescript-eslint/typescript-estree@2.26.0":
+  version "2.26.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56";
+  integrity 
sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==
   dependencies:
-    mime-types "~2.1.24"
-    negotiator "0.6.2"
+    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"
 
-acorn-walk@^6.1.1:
-  version "6.2.0"
-  resolved 
"https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c";
-  integrity 
sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+"@typescript-eslint/typescript-estree@2.27.0":
+  version "2.27.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8";
+  integrity 
sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg==
+  dependencies:
+    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"
 
-acorn@^6.0.7, acorn@^6.2.1:
-  version "6.3.0"
-  resolved 
"https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e";
-  integrity 
sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
+acorn-jsx@^5.2.0:
+  version "5.2.0"
+  resolved 
"https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe";
+  integrity 
sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
 
-acorn@^7.1.0:
-  version "7.1.0"
-  resolved 
"https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c";
-  integrity 
sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+acorn@^7.1.1:
+  version "7.1.1"
+  resolved 
"https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf";
+  integrity 
sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
 
 aggregate-error@^3.0.0:
   version "3.0.1"
@@ -430,22 +492,12 @@ aggregate-error@^3.0.0:
     clean-stack "^2.0.0"
     indent-string "^4.0.0"
 
-ajv-errors@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d";
-  integrity 
sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
-
-ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
-  version "3.4.1"
-  resolved 
"https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da";
-  integrity 
sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-
-ajv@^6.1.0, ajv@^6.10.2:
-  version "6.10.2"
-  resolved 
"https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52";
-  integrity 
sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+ajv@^6.10.0, ajv@^6.10.2:
+  version "6.12.0"
+  resolved 
"https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7";
+  integrity 
sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
   dependencies:
-    fast-deep-equal "^2.0.1"
+    fast-deep-equal "^3.1.1"
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
@@ -457,24 +509,12 @@ ansi-align@^3.0.0:
   dependencies:
     string-width "^3.0.0"
 
-ansi-colors@^1.0.1:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9";
-  integrity 
sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
-  dependencies:
-    ansi-wrap "^0.1.0"
-
-ansi-gray@^0.1.1:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251";
-  integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
+ansi-escapes@^4.2.1:
+  version "4.3.1"
+  resolved 
"https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61";
+  integrity 
sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
   dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-regex@^2.0.0:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
-  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+    type-fest "^0.11.0"
 
 ansi-regex@^3.0.0:
   version "3.0.0"
@@ -514,23 +554,10 @@ ansi-styles@^4.1.0:
     "@types/color-name" "^1.1.1"
     color-convert "^2.0.1"
 
-ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
-  version "0.1.0"
-  resolved 
"https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf";
-  integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
-
-any-promise@^1.1.0:
-  version "1.3.0"
-  resolved 
"https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f";
-  integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
-
-anymatch@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
-  integrity 
sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
-  dependencies:
-    micromatch "^3.1.4"
-    normalize-path "^2.1.1"
+ansi-styles@~1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178";
+  integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=
 
 anymatch@~3.1.1:
   version "3.1.1"
@@ -540,67 +567,18 @@ anymatch@~3.1.1:
     normalize-path "^3.0.0"
     picomatch "^2.0.4"
 
-append-buffer@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1";
-  integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
-  dependencies:
-    buffer-equal "^1.0.0"
-
-append-transform@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab";
-  integrity 
sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==
-  dependencies:
-    default-require-extensions "^2.0.0"
-
-aproba@^1.0.3, aproba@^1.1.1:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a";
-  integrity 
sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
-
-archiver-utils@^2.1.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2";
-  integrity 
sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
-  dependencies:
-    glob "^7.1.4"
-    graceful-fs "^4.2.0"
-    lazystream "^1.0.0"
-    lodash.defaults "^4.2.0"
-    lodash.difference "^4.5.0"
-    lodash.flatten "^4.4.0"
-    lodash.isplainobject "^4.0.6"
-    lodash.union "^4.6.0"
-    normalize-path "^3.0.0"
-    readable-stream "^2.0.0"
-
-archiver@^3.1.1:
-  version "3.1.1"
-  resolved 
"https://registry.yarnpkg.com/archiver/-/archiver-3.1.1.tgz#9db7819d4daf60aec10fe86b16cb9258ced66ea0";
-  integrity 
sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==
+append-transform@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12";
+  integrity 
sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
   dependencies:
-    archiver-utils "^2.1.0"
-    async "^2.6.3"
-    buffer-crc32 "^0.2.1"
-    glob "^7.1.4"
-    readable-stream "^3.4.0"
-    tar-stream "^2.1.0"
-    zip-stream "^2.1.2"
+    default-require-extensions "^3.0.0"
 
 archy@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40";
   integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
 
-are-we-there-yet@~1.1.2:
-  version "1.1.5"
-  resolved 
"https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21";
-  integrity 
sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
-  dependencies:
-    delegates "^1.0.0"
-    readable-stream "^2.0.6"
-
 argparse@^1.0.7:
   version "1.0.10"
   resolved 
"https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911";
@@ -608,88 +586,40 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
-arr-diff@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520";
-  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-
-arr-filter@^1.1.1:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee";
-  integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=
-  dependencies:
-    make-iterator "^1.0.0"
-
-arr-flatten@^1.0.1, arr-flatten@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1";
-  integrity 
sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
-arr-map@^2.0.0, arr-map@^2.0.2:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4";
-  integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ=
+aria-query@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc";
+  integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
   dependencies:
-    make-iterator "^1.0.0"
-
-arr-union@^3.1.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4";
-  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-
-array-each@^1.0.0, array-each@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f";
-  integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
+    ast-types-flow "0.0.7"
+    commander "^2.11.0"
 
 array-find-index@^1.0.1:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1";
   integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
 
-array-flatten@1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2";
-  integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-
-array-initial@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795";
-  integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U=
-  dependencies:
-    array-slice "^1.0.0"
-    is-number "^4.0.0"
-
-array-last@^1.1.1:
-  version "1.3.0"
-  resolved 
"https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336";
-  integrity 
sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==
-  dependencies:
-    is-number "^4.0.0"
-
-array-slice@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4";
-  integrity 
sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
-
-array-sort@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a";
-  integrity 
sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
+array-includes@^3.0.3, array-includes@^3.1.1:
+  version "3.1.1"
+  resolved 
"https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348";
+  integrity 
sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
   dependencies:
-    default-compare "^1.0.0"
-    get-value "^2.0.6"
-    kind-of "^5.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0"
+    is-string "^1.0.5"
 
 array-union@^2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d";
   integrity 
sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
 
-array-unique@^0.3.2:
-  version "0.3.2"
-  resolved 
"https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
-  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+array.prototype.flat@^1.2.1:
+  version "1.2.3"
+  resolved 
"https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b";
+  integrity 
sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
 
 arrgv@^1.0.2:
   version "1.0.2"
@@ -706,77 +636,21 @@ arrify@^2.0.1:
   resolved 
"https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa";
   integrity 
sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
 
-asap@~2.0.6:
-  version "2.0.6"
-  resolved 
"https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46";
-  integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-
-asn1.js@^4.0.0:
-  version "4.10.1"
-  resolved 
"https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
-  integrity 
sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
-  dependencies:
-    bn.js "^4.0.0"
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-
-assert@^1.1.1:
-  version "1.5.0"
-  resolved 
"https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb";
-  integrity 
sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
-  dependencies:
-    object-assign "^4.1.1"
-    util "0.10.3"
+ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
+  version "0.0.7"
+  resolved 
"https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad";
+  integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
 
-assign-symbols@^1.0.0:
+astral-regex@^1.0.0:
   version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
-  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+  resolved 
"https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9";
+  integrity 
sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
 
 astral-regex@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31";
   integrity 
sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
-async-done@^1.2.0, async-done@^1.2.2:
-  version "1.3.2"
-  resolved 
"https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2";
-  integrity 
sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.2"
-    process-nextick-args "^2.0.0"
-    stream-exhaust "^1.0.1"
-
-async-each@^1.0.1:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf";
-  integrity 
sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
-
-async-limiter@~1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd";
-  integrity 
sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
-
-async-settle@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b";
-  integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=
-  dependencies:
-    async-done "^1.2.2"
-
-async@^2.6.3:
-  version "2.6.3"
-  resolved 
"https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff";
-  integrity 
sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
-  dependencies:
-    lodash "^4.17.14"
-
-atob@^2.1.1:
-  version "2.1.2"
-  resolved 
"https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9";
-  integrity 
sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
 ava@^3.6.0:
   version "3.6.0"
   resolved 
"https://registry.yarnpkg.com/ava/-/ava-3.6.0.tgz#1fa57f8601a81d11b4771ba701428d9972659dfd";
@@ -835,20 +709,6 @@ ava@^3.6.0:
     write-file-atomic "^3.0.3"
     yargs "^15.3.1"
 
-awesome-typescript-loader@^5.2.1:
-  version "5.2.1"
-  resolved 
"https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz#a41daf7847515f4925cdbaa3075d61f289e913fc";
-  integrity 
sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==
-  dependencies:
-    chalk "^2.4.1"
-    enhanced-resolve "^4.0.0"
-    loader-utils "^1.1.0"
-    lodash "^4.17.5"
-    micromatch "^3.1.9"
-    mkdirp "^0.5.1"
-    source-map-support "^0.5.3"
-    webpack-log "^1.2.0"
-
 axios@^0.19.2:
   version "0.19.2"
   resolved 
"https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27";
@@ -856,119 +716,31 @@ axios@^0.19.2:
   dependencies:
     follow-redirects "1.5.10"
 
-bach@^1.0.0:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880";
-  integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=
-  dependencies:
-    arr-filter "^1.1.1"
-    arr-flatten "^1.0.1"
-    arr-map "^2.0.0"
-    array-each "^1.0.0"
-    array-initial "^1.0.0"
-    array-last "^1.1.1"
-    async-done "^1.2.2"
-    async-settle "^1.0.0"
-    now-and-later "^2.0.0"
-
-backbone@^1.4.0:
-  version "1.4.0"
-  resolved 
"https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12";
-  integrity 
sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==
-  dependencies:
-    underscore ">=1.8.3"
+axobject-query@^2.0.2:
+  version "2.1.2"
+  resolved 
"https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799";
+  integrity 
sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
 
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767";
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
-base64-js@^1.0.2:
-  version "1.3.1"
-  resolved 
"https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1";
-  integrity 
sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
-
-base@^0.11.1:
-  version "0.11.2"
-  resolved 
"https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f";
-  integrity 
sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
-  dependencies:
-    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"
-
-bfj@^6.1.1:
-  version "6.1.2"
-  resolved 
"https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f";
-  integrity 
sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
-  dependencies:
-    bluebird "^3.5.5"
-    check-types "^8.0.3"
-    hoopy "^0.1.4"
-    tryer "^1.0.1"
-
 big-integer@^1.6.48:
   version "1.6.48"
   resolved 
"https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e";
   integrity 
sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==
 
-big.js@^5.2.2:
-  version "5.2.2"
-  resolved 
"https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328";
-  integrity 
sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-binary-extensions@^1.0.0:
-  version "1.13.1"
-  resolved 
"https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65";
-  integrity 
sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
-
 binary-extensions@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c";
   integrity 
sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
 
-bl@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88";
-  integrity 
sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==
-  dependencies:
-    readable-stream "^3.0.1"
-
-bluebird@^3.5.5:
-  version "3.7.1"
-  resolved 
"https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de";
-  integrity 
sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==
-
 blueimp-md5@^2.10.0:
   version "2.12.0"
   resolved 
"https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.12.0.tgz#be7367938a889dec3ffbb71138617c117e9c130a";
   integrity 
sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==
 
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
-  version "4.11.8"
-  resolved 
"https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f";
-  integrity 
sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
-
-body-parser@1.19.0:
-  version "1.19.0"
-  resolved 
"https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a";
-  integrity 
sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
-  dependencies:
-    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"
-
 boxen@^4.2.0:
   version "4.2.0"
   resolved 
"https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64";
@@ -991,22 +763,6 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-braces@^2.3.1, braces@^2.3.2:
-  version "2.3.2"
-  resolved 
"https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729";
-  integrity 
sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
-  dependencies:
-    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"
-
 braces@^3.0.1, braces@~3.0.2:
   version "3.0.2"
   resolved 
"https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107";
@@ -1014,187 +770,16 @@ braces@^3.0.1, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-brorand@^1.0.1:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f";
-  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48";
-  integrity 
sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
-  dependencies:
-    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@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
-  integrity 
sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
-  dependencies:
-    browserify-aes "^1.0.4"
-    browserify-des "^1.0.0"
-    evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c";
-  integrity 
sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
-  dependencies:
-    cipher-base "^1.0.1"
-    des.js "^1.0.0"
-    inherits "^2.0.1"
-    safe-buffer "^5.1.2"
-
-browserify-rsa@^4.0.0:
-  version "4.0.1"
-  resolved 
"https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524";
-  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
-  dependencies:
-    bn.js "^4.1.0"
-    randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
-  version "4.0.4"
-  resolved 
"https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
-  integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
-  dependencies:
-    bn.js "^4.1.1"
-    browserify-rsa "^4.0.0"
-    create-hash "^1.1.0"
-    create-hmac "^1.1.2"
-    elliptic "^6.0.0"
-    inherits "^2.0.1"
-    parse-asn1 "^5.0.0"
-
-browserify-zlib@^0.2.0:
-  version "0.2.0"
-  resolved 
"https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
-  integrity 
sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
-  dependencies:
-    pako "~1.0.5"
-
-buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
-  version "0.2.13"
-  resolved 
"https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242";
-  integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-buffer-equal@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe";
-  integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
-
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved 
"https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef";
   integrity 
sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
-buffer-xor@^1.0.3:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
-  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
-
-buffer@^4.3.0:
-  version "4.9.2"
-  resolved 
"https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8";
-  integrity 
sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
-  dependencies:
-    base64-js "^1.0.2"
-    ieee754 "^1.1.4"
-    isarray "^1.0.0"
-
-buffer@^5.1.0:
-  version "5.4.3"
-  resolved 
"https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115";
-  integrity 
sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==
-  dependencies:
-    base64-js "^1.0.2"
-    ieee754 "^1.1.4"
-
-builtin-modules@^1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f";
-  integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
-
 builtin-modules@^3.1.0:
   version "3.1.0"
   resolved 
"https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484";
   integrity 
sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
 
-builtin-status-codes@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8";
-  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-
-bytes@3.1.0, bytes@^3.0.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6";
-  integrity 
sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-
-cacache@^12.0.2:
-  version "12.0.3"
-  resolved 
"https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390";
-  integrity 
sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==
-  dependencies:
-    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"
-
-cacache@^13.0.1:
-  version "13.0.1"
-  resolved 
"https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c";
-  integrity 
sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==
-  dependencies:
-    chownr "^1.1.2"
-    figgy-pudding "^3.5.1"
-    fs-minipass "^2.0.0"
-    glob "^7.1.4"
-    graceful-fs "^4.2.2"
-    infer-owner "^1.0.4"
-    lru-cache "^5.1.1"
-    minipass "^3.0.0"
-    minipass-collect "^1.0.2"
-    minipass-flush "^1.0.5"
-    minipass-pipeline "^1.2.2"
-    mkdirp "^0.5.1"
-    move-concurrently "^1.0.1"
-    p-map "^3.0.0"
-    promise-inflight "^1.0.1"
-    rimraf "^2.7.1"
-    ssri "^7.0.0"
-    unique-filename "^1.1.1"
-
-cache-base@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
-  integrity 
sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
-  dependencies:
-    collection-visit "^1.0.0"
-    component-emitter "^1.2.1"
-    get-value "^2.0.6"
-    has-value "^1.0.0"
-    isobject "^3.0.1"
-    set-value "^2.0.0"
-    to-object-path "^0.3.0"
-    union-value "^1.0.0"
-    unset-value "^1.0.0"
-
 cacheable-request@^6.0.0:
   version "6.1.0"
   resolved 
"https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912";
@@ -1208,27 +793,27 @@ cacheable-request@^6.0.0:
     normalize-url "^4.1.0"
     responselike "^1.0.2"
 
-caching-transform@^3.0.2:
-  version "3.0.2"
-  resolved 
"https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70";
-  integrity 
sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==
+caching-transform@^4.0.0:
+  version "4.0.0"
+  resolved 
"https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f";
+  integrity 
sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==
   dependencies:
-    hasha "^3.0.0"
-    make-dir "^2.0.0"
-    package-hash "^3.0.0"
-    write-file-atomic "^2.4.2"
+    hasha "^5.0.0"
+    make-dir "^3.0.0"
+    package-hash "^4.0.0"
+    write-file-atomic "^3.0.0"
 
-camelcase@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
-  integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved 
"https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73";
+  integrity 
sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
 camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved 
"https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320";
   integrity 
sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, 
chalk@^2.4.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2:
   version "2.4.2"
   resolved 
"https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424";
   integrity 
sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1253,29 +838,19 @@ chalk@^4.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-check-types@^8.0.3:
-  version "8.0.3"
-  resolved 
"https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552";
-  integrity 
sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
-
-chokidar@^2.0.0, chokidar@^2.0.2:
-  version "2.1.8"
-  resolved 
"https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917";
-  integrity 
sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
-  dependencies:
-    anymatch "^2.0.0"
-    async-each "^1.0.1"
-    braces "^2.3.2"
-    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"
-  optionalDependencies:
-    fsevents "^1.2.7"
+chalk@~0.4.0:
+  version "0.4.0"
+  resolved 
"https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f";
+  integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=
+  dependencies:
+    ansi-styles "~1.0.0"
+    has-color "~0.1.0"
+    strip-ansi "~0.1.0"
+
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved 
"https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e";
+  integrity 
sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
 chokidar@^3.3.1:
   version "3.3.1"
@@ -1292,18 +867,6 @@ chokidar@^3.3.1:
   optionalDependencies:
     fsevents "~2.1.2"
 
-chownr@^1.1.1, chownr@^1.1.2:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142";
-  integrity 
sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
-
-chrome-trace-event@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4";
-  integrity 
sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
-  dependencies:
-    tslib "^1.9.0"
-
 chunkd@^2.0.1:
   version "2.0.1"
   resolved 
"https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920";
@@ -1319,24 +882,6 @@ ci-parallel-vars@^1.0.0:
   resolved 
"https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3";
   integrity 
sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g==
 
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
-  version "1.0.4"
-  resolved 
"https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de";
-  integrity 
sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
-class-utils@^0.3.5:
-  version "0.3.6"
-  resolved 
"https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463";
-  integrity 
sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
-  dependencies:
-    arr-union "^3.1.0"
-    define-property "^0.2.5"
-    isobject "^3.0.0"
-    static-extend "^0.1.1"
-
 clean-stack@^2.0.0, clean-stack@^2.2.0:
   version "2.2.0"
   resolved 
"https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b";
@@ -1372,23 +917,10 @@ cli-truncate@^2.1.0:
     slice-ansi "^3.0.0"
     string-width "^4.2.0"
 
-cliui@^3.2.0:
-  version "3.2.0"
-  resolved 
"https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d";
-  integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-    wrap-ansi "^2.0.0"
-
-cliui@^5.0.0:
-  version "5.0.0"
-  resolved 
"https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5";
-  integrity 
sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
-  dependencies:
-    string-width "^3.1.0"
-    strip-ansi "^5.2.0"
-    wrap-ansi "^5.1.0"
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved 
"https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639";
+  integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
 
 cliui@^6.0.0:
   version "6.0.0"
@@ -1399,11 +931,6 @@ cliui@^6.0.0:
     strip-ansi "^6.0.0"
     wrap-ansi "^6.2.0"
 
-clone-buffer@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58";
-  integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
-
 clone-response@^1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b";
@@ -1411,30 +938,11 @@ clone-response@^1.0.2:
   dependencies:
     mimic-response "^1.0.0"
 
-clone-stats@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680";
-  integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
-
 clone@^1.0.2:
   version "1.0.4"
   resolved 
"https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e";
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
-clone@^2.1.1:
-  version "2.1.2"
-  resolved 
"https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f";
-  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
-cloneable-readable@^1.0.0:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec";
-  integrity 
sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
-  dependencies:
-    inherits "^2.0.1"
-    process-nextick-args "^2.0.0"
-    readable-stream "^2.3.5"
-
 code-excerpt@^2.1.1:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c";
@@ -1442,28 +950,6 @@ code-excerpt@^2.1.1:
   dependencies:
     convert-to-spaces "^1.0.1"
 
-code-point-at@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
-  integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
-collection-map@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c";
-  integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=
-  dependencies:
-    arr-map "^2.0.2"
-    for-own "^1.0.0"
-    make-iterator "^1.0.0"
-
-collection-visit@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0";
-  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
-  dependencies:
-    map-visit "^1.0.0"
-    object-visit "^1.0.0"
-
 color-convert@^1.9.0:
   version "1.9.3"
   resolved 
"https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8";
@@ -1488,12 +974,7 @@ color-name@~1.1.4:
   resolved 
"https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2";
   integrity 
sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
-color-support@^1.1.3:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2";
-  integrity 
sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-
-commander@^2.12.1, commander@^2.18.0, commander@^2.20.0, commander@~2.20.3:
+commander@^2.11.0, commander@^2.20.0, commander@~2.20.3:
   version "2.20.3"
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33";
   integrity 
sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1508,36 +989,11 @@ commondir@^1.0.1:
   resolved 
"https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b";
   integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
 
-component-emitter@^1.2.1:
-  version "1.3.0"
-  resolved 
"https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0";
-  integrity 
sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
-
-compress-commons@^2.1.1:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/compress-commons/-/compress-commons-2.1.1.tgz#9410d9a534cf8435e3fbbb7c6ce48de2dc2f0610";
-  integrity 
sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==
-  dependencies:
-    buffer-crc32 "^0.2.13"
-    crc32-stream "^3.0.1"
-    normalize-path "^3.0.0"
-    readable-stream "^2.3.6"
-
 concat-map@0.0.1:
   version "0.0.1"
   resolved 
"https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b";
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^1.5.0, concat-stream@^1.6.0:
-  version "1.6.2"
-  resolved 
"https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34";
-  integrity 
sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
-  dependencies:
-    buffer-from "^1.0.0"
-    inherits "^2.0.3"
-    readable-stream "^2.2.2"
-    typedarray "^0.0.6"
-
 concordance@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/concordance/-/concordance-4.0.0.tgz#5932fdee397d129bdbc3a1885fbe69839b1b7e15";
@@ -1567,34 +1023,17 @@ configstore@^5.0.1:
     write-file-atomic "^3.0.0"
     xdg-basedir "^4.0.0"
 
-console-browserify@^1.1.0:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336";
-  integrity 
sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
-
-console-control-strings@^1.0.0, console-control-strings@~1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e";
-  integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-
-constants-browserify@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75";
-  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-
-content-disposition@0.5.3:
-  version "0.5.3"
-  resolved 
"https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd";
-  integrity 
sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
-  dependencies:
-    safe-buffer "5.1.2"
+confusing-browser-globals@^1.0.9:
+  version "1.0.9"
+  resolved 
"https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd";
+  integrity 
sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
 
-content-type@~1.0.4:
-  version "1.0.4"
-  resolved 
"https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
-  integrity 
sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+contains-path@^0.1.0:
+  version "0.1.0"
+  resolved 
"https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a";
+  integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
 
-convert-source-map@^1.5.0, convert-source-map@^1.6.0, 
convert-source-map@^1.7.0:
+convert-source-map@^1.7.0:
   version "1.7.0"
   resolved 
"https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442";
   integrity 
sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
@@ -1606,104 +1045,12 @@ convert-to-spaces@^1.0.1:
   resolved 
"https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715";
   integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=
 
-cookie-signature@1.0.6:
-  version "1.0.6"
-  resolved 
"https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c";
-  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
-
-cookie@0.4.0:
-  version "0.4.0"
-  resolved 
"https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba";
-  integrity 
sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
-
-copy-concurrently@^1.0.0:
-  version "1.0.5"
-  resolved 
"https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0";
-  integrity 
sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
-  dependencies:
-    aproba "^1.1.1"
-    fs-write-stream-atomic "^1.0.8"
-    iferr "^0.1.5"
-    mkdirp "^0.5.1"
-    rimraf "^2.5.4"
-    run-queue "^1.0.0"
-
-copy-descriptor@^0.1.0:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d";
-  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-
-copy-props@^2.0.1:
-  version "2.0.4"
-  resolved 
"https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe";
-  integrity 
sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
-  dependencies:
-    each-props "^1.3.0"
-    is-plain-object "^2.0.1"
-
-core-util-is@~1.0.0:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7";
-  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cp-file@^6.2.0:
-  version "6.2.0"
-  resolved 
"https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d";
-  integrity 
sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==
-  dependencies:
-    graceful-fs "^4.1.2"
-    make-dir "^2.0.0"
-    nested-error-stacks "^2.0.0"
-    pify "^4.0.1"
-    safe-buffer "^5.0.1"
-
-crc32-stream@^3.0.1:
-  version "3.0.1"
-  resolved 
"https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85";
-  integrity 
sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==
-  dependencies:
-    crc "^3.4.4"
-    readable-stream "^3.4.0"
-
-crc@^3.4.4:
-  version "3.8.0"
-  resolved 
"https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6";
-  integrity 
sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
-  dependencies:
-    buffer "^5.1.0"
-
-create-ecdh@^4.0.0:
-  version "4.0.3"
-  resolved 
"https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff";
-  integrity 
sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
-  dependencies:
-    bn.js "^4.1.0"
-    elliptic "^6.0.0"
-
-create-hash@^1.1.0, create-hash@^1.1.2:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196";
-  integrity 
sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
-  dependencies:
-    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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
-  version "1.1.7"
-  resolved 
"https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff";
-  integrity 
sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
-  dependencies:
-    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"
+core-js-pure@^3.0.0:
+  version "3.6.4"
+  resolved 
"https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a";
+  integrity 
sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==
 
-cross-spawn@6.0.5, cross-spawn@^6.0.0:
+cross-spawn@^6.0.5:
   version "6.0.5"
   resolved 
"https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4";
   integrity 
sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -1714,30 +1061,14 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^4:
-  version "4.0.2"
-  resolved 
"https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41";
-  integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=
+cross-spawn@^7.0.0:
+  version "7.0.2"
+  resolved 
"https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6";
+  integrity 
sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
   dependencies:
-    lru-cache "^4.0.1"
-    which "^1.2.9"
-
-crypto-browserify@^3.11.0:
-  version "3.12.0"
-  resolved 
"https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec";
-  integrity 
sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
-  dependencies:
-    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"
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
 
 crypto-random-string@^2.0.0:
   version "2.0.0"
@@ -1756,18 +1087,10 @@ currently-unhandled@^0.4.1:
   dependencies:
     array-find-index "^1.0.1"
 
-cyclist@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9";
-  integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
-
-d@1, d@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a";
-  integrity 
sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
-  dependencies:
-    es5-ext "^0.10.50"
-    type "^1.0.1"
+damerau-levenshtein@^1.0.4:
+  version "1.0.6"
+  resolved 
"https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791";
+  integrity 
sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==
 
 date-time@^2.1.0:
   version "2.1.0"
@@ -1776,13 +1099,6 @@ date-time@^2.1.0:
   dependencies:
     time-zone "^1.0.0"
 
-debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
-  version "2.6.9"
-  resolved 
"https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f";
-  integrity 
sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
-  dependencies:
-    ms "2.0.0"
-
 debug@=3.1.0:
   version "3.1.0"
   resolved 
"https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261";
@@ -1790,30 +1106,25 @@ debug@=3.1.0:
   dependencies:
     ms "2.0.0"
 
-debug@^3.2.6:
-  version "3.2.6"
-  resolved 
"https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b";
-  integrity 
sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+debug@^2.6.9:
+  version "2.6.9"
+  resolved 
"https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f";
+  integrity 
sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
   dependencies:
-    ms "^2.1.1"
+    ms "2.0.0"
 
-debug@^4.1.0, debug@^4.1.1:
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
   version "4.1.1"
   resolved 
"https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791";
   integrity 
sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
   dependencies:
     ms "^2.1.1"
 
-decamelize@^1.1.1, decamelize@^1.2.0:
+decamelize@^1.2.0:
   version "1.2.0"
   resolved 
"https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290";
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
-decode-uri-component@^0.2.0:
-  version "0.2.0"
-  resolved 
"https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545";
-  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
-
 decompress-response@^3.3.0:
   version "3.3.0"
   resolved 
"https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3";
@@ -1826,24 +1137,17 @@ deep-extend@^0.6.0:
   resolved 
"https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
   integrity 
sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
 
-default-compare@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f";
-  integrity 
sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
-  dependencies:
-    kind-of "^5.0.2"
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved 
"https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34";
+  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-default-require-extensions@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7";
-  integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=
+default-require-extensions@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96";
+  integrity 
sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==
   dependencies:
-    strip-bom "^3.0.0"
-
-default-resolution@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684";
-  integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=
+    strip-bom "^4.0.0"
 
 defaults@^1.0.3:
   version "1.0.3"
@@ -1857,35 +1161,13 @@ defer-to-connect@^1.0.1:
   resolved 
"https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.0.tgz#b41bd7efa8508cef13f8456975f7a278c72833fd";
   integrity 
sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ==
 
-define-properties@^1.1.2:
+define-properties@^1.1.2, define-properties@^1.1.3:
   version "1.1.3"
   resolved 
"https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1";
   integrity 
sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
   dependencies:
     object-keys "^1.0.12"
 
-define-property@^0.2.5:
-  version "0.2.5"
-  resolved 
"https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
-  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
-  dependencies:
-    is-descriptor "^0.1.0"
-
-define-property@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
-  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
-  dependencies:
-    is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d";
-  integrity 
sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
-  dependencies:
-    is-descriptor "^1.0.2"
-    isobject "^3.0.1"
-
 del@^5.1.0:
   version "5.1.0"
   resolved 
"https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7";
@@ -1900,53 +1182,6 @@ del@^5.1.0:
     rimraf "^3.0.0"
     slash "^3.0.0"
 
-delegates@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a";
-  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
-
-depd@~1.1.2:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9";
-  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
-
-des.js@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843";
-  integrity 
sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
-  dependencies:
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-
-destroy@~1.0.4:
-  version "1.0.4"
-  resolved 
"https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80";
-  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-
-detect-file@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
-  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
-detect-libc@^1.0.2:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
-  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-
-diff@^4.0.1:
-  version "4.0.1"
-  resolved 
"https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff";
-  integrity 
sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==
-
-diffie-hellman@^5.0.0:
-  version "5.0.3"
-  resolved 
"https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875";
-  integrity 
sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
-  dependencies:
-    bn.js "^4.1.0"
-    miller-rabin "^4.0.0"
-    randombytes "^2.0.0"
-
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved 
"https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f";
@@ -1954,10 +1189,27 @@ dir-glob@^3.0.1:
   dependencies:
     path-type "^4.0.0"
 
-domain-browser@^1.1.1:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda";
-  integrity 
sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+doctrine@1.5.0:
+  version "1.5.0"
+  resolved 
"https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa";
+  integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d";
+  integrity 
sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+  dependencies:
+    esutils "^2.0.2"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961";
+  integrity 
sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
 
 dot-prop@^5.2.0:
   version "5.2.0"
@@ -1971,58 +1223,12 @@ duplexer3@^0.1.4:
   resolved 
"https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2";
   integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
 
-duplexer@^0.1.1:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1";
-  integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
-
-duplexify@^3.4.2, duplexify@^3.6.0:
-  version "3.7.1"
-  resolved 
"https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309";
-  integrity 
sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
-  dependencies:
-    end-of-stream "^1.0.0"
-    inherits "^2.0.1"
-    readable-stream "^2.0.0"
-    stream-shift "^1.0.0"
-
-each-props@^1.3.0:
-  version "1.3.2"
-  resolved 
"https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333";
-  integrity 
sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
-  dependencies:
-    is-plain-object "^2.0.1"
-    object.defaults "^1.1.0"
-
-ee-first@1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d";
-  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-
-ejs@^2.6.1:
-  version "2.7.4"
-  resolved 
"https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba";
-  integrity 
sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
-
-elliptic@^6.0.0:
-  version "6.5.1"
-  resolved 
"https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b";
-  integrity 
sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==
-  dependencies:
-    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"
-
 emittery@^0.6.0:
   version "0.6.0"
   resolved 
"https://registry.yarnpkg.com/emittery/-/emittery-0.6.0.tgz#e85312468d77c3ed9a6adf43bb57d34849e0c95a";
   integrity 
sha512-6EMRGr9KzYWp8DzHFZsKVZBsMO6QhAeHMeHND8rhyBNCHKMLpgW9tZv40bwN3rAIKRS5CxcK8oLRKUJSB9h7yQ==
 
-emoji-regex@^7.0.1:
+emoji-regex@^7.0.1, emoji-regex@^7.0.2:
   version "7.0.3"
   resolved 
"https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156";
   integrity 
sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
@@ -2032,60 +1238,25 @@ emoji-regex@^8.0.0:
   resolved 
"https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37";
   integrity 
sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 
-emojis-list@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389";
-  integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
-
-encodeurl@~1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
-  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-
-encoding@^0.1.12:
+encoding@^0.1.11:
   version "0.1.12"
   resolved 
"https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb";
   integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
   dependencies:
     iconv-lite "~0.4.13"
 
-end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.1.0:
   version "1.4.4"
   resolved 
"https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0";
   integrity 
sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
   dependencies:
     once "^1.4.0"
 
-enhanced-resolve@4.1.0:
-  version "4.1.0"
-  resolved 
"https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f";
-  integrity 
sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
-  dependencies:
-    graceful-fs "^4.1.2"
-    memory-fs "^0.4.0"
-    tapable "^1.0.0"
-
-enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
-  version "4.1.1"
-  resolved 
"https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66";
-  integrity 
sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
-  dependencies:
-    graceful-fs "^4.1.2"
-    memory-fs "^0.5.0"
-    tapable "^1.0.0"
-
 equal-length@^1.0.0:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c";
   integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w=
 
-errno@^0.1.3, errno@~0.1.7:
-  version "0.1.7"
-  resolved 
"https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618";
-  integrity 
sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
-  dependencies:
-    prr "~1.0.1"
-
 error-ex@^1.2.0, error-ex@^1.3.1:
   version "1.3.2"
   resolved 
"https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
@@ -2093,57 +1264,42 @@ error-ex@^1.2.0, error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50:
-  version "0.10.52"
-  resolved 
"https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.52.tgz#bb21777e919a04263736ded120a9d665f10ea63f";
-  integrity 
sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==
+es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
+  version "1.17.5"
+  resolved 
"https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9";
+  integrity 
sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
+  dependencies:
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+    is-callable "^1.1.5"
+    is-regex "^1.0.5"
+    object-inspect "^1.7.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.0"
+    string.prototype.trimleft "^2.1.1"
+    string.prototype.trimright "^2.1.1"
+
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved 
"https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a";
+  integrity 
sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
   dependencies:
-    es6-iterator "~2.0.3"
-    es6-symbol "~3.1.2"
-    next-tick "~1.0.0"
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
 
 es6-error@^4.0.1:
   version "4.1.1"
   resolved 
"https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d";
   integrity 
sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
 
-es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3:
-  version "2.0.3"
-  resolved 
"https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
-  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
-  dependencies:
-    d "1"
-    es5-ext "^0.10.35"
-    es6-symbol "^3.1.1"
-
-es6-symbol@^3.1.1, es6-symbol@~3.1.2:
-  version "3.1.3"
-  resolved 
"https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18";
-  integrity 
sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
-  dependencies:
-    d "^1.0.1"
-    ext "^1.1.2"
-
-es6-weak-map@^2.0.1:
-  version "2.0.3"
-  resolved 
"https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53";
-  integrity 
sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
-  dependencies:
-    d "1"
-    es5-ext "^0.10.46"
-    es6-iterator "^2.0.3"
-    es6-symbol "^3.1.1"
-
 escape-goat@^2.0.0:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675";
   integrity 
sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
 
-escape-html@~1.0.3:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988";
-  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
-
 escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved 
"https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
@@ -2154,19 +1310,196 @@ escape-string-regexp@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344";
   integrity 
sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
 
-eslint-scope@^4.0.3:
-  version "4.0.3"
-  resolved 
"https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848";
-  integrity 
sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+eslint-config-airbnb-base@^14.1.0:
+  version "14.1.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz#2ba4592dd6843258221d9bff2b6831bd77c874e4";
+  integrity 
sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==
+  dependencies:
+    confusing-browser-globals "^1.0.9"
+    object.assign "^4.1.0"
+    object.entries "^1.1.1"
+
+eslint-config-airbnb-typescript@^7.2.0:
+  version "7.2.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-7.2.0.tgz#afa7cea5657c9f70c0b96d52bf7d470e9827b66a";
+  integrity 
sha512-W7IZUIJpBZIzU3p65KoyJPl2vGSy6FS3R+K91Cp3NLK/0m1oyvCFeBHI2QlWdqxkJ4FvwnLvsoRTutwpKNIT+A==
+  dependencies:
+    "@typescript-eslint/parser" "^2.24.0"
+    eslint-config-airbnb "^18.1.0"
+    eslint-config-airbnb-base "^14.1.0"
+
+eslint-config-airbnb@^18.1.0:
+  version "18.1.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.1.0.tgz#724d7e93dadd2169492ff5363c5aaa779e01257d";
+  integrity 
sha512-kZFuQC/MPnH7KJp6v95xsLBf63G/w7YqdPfQ0MUanxQ7zcKUNG8j+sSY860g3NwCBOa62apw16J6pRN+AOgXzw==
+  dependencies:
+    eslint-config-airbnb-base "^14.1.0"
+    object.assign "^4.1.0"
+    object.entries "^1.1.1"
+
+eslint-import-resolver-node@^0.3.2:
+  version "0.3.3"
+  resolved 
"https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404";
+  integrity 
sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
+  dependencies:
+    debug "^2.6.9"
+    resolve "^1.13.1"
+
+eslint-module-utils@^2.4.1:
+  version "2.6.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6";
+  integrity 
sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+  dependencies:
+    debug "^2.6.9"
+    pkg-dir "^2.0.0"
+
+eslint-plugin-import@^2.20.2:
+  version "2.20.2"
+  resolved 
"https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d";
+  integrity 
sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==
+  dependencies:
+    array-includes "^3.0.3"
+    array.prototype.flat "^1.2.1"
+    contains-path "^0.1.0"
+    debug "^2.6.9"
+    doctrine "1.5.0"
+    eslint-import-resolver-node "^0.3.2"
+    eslint-module-utils "^2.4.1"
+    has "^1.0.3"
+    minimatch "^3.0.4"
+    object.values "^1.1.0"
+    read-pkg-up "^2.0.0"
+    resolve "^1.12.0"
+
+eslint-plugin-jsx-a11y@^6.2.3:
+  version "6.2.3"
+  resolved 
"https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa";
+  integrity 
sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==
+  dependencies:
+    "@babel/runtime" "^7.4.5"
+    aria-query "^3.0.0"
+    array-includes "^3.0.3"
+    ast-types-flow "^0.0.7"
+    axobject-query "^2.0.2"
+    damerau-levenshtein "^1.0.4"
+    emoji-regex "^7.0.2"
+    has "^1.0.3"
+    jsx-ast-utils "^2.2.1"
+
+eslint-plugin-react-hooks@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz#9e80c71846eb68dd29c3b21d832728aa66e5bd35";
+  integrity 
sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==
+
+eslint-plugin-react@^7.19.0:
+  version "7.19.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666";
+  integrity 
sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
+  dependencies:
+    array-includes "^3.1.1"
+    doctrine "^2.1.0"
+    has "^1.0.3"
+    jsx-ast-utils "^2.2.3"
+    object.entries "^1.1.1"
+    object.fromentries "^2.0.2"
+    object.values "^1.1.1"
+    prop-types "^15.7.2"
+    resolve "^1.15.1"
+    semver "^6.3.0"
+    string.prototype.matchall "^4.0.2"
+    xregexp "^4.3.0"
+
+eslint-scope@^5.0.0:
+  version "5.0.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9";
+  integrity 
sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
   dependencies:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
+eslint-utils@^1.4.3:
+  version "1.4.3"
+  resolved 
"https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f";
+  integrity 
sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-utils@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd";
+  integrity 
sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.1.0:
+  version "1.1.0"
+  resolved 
"https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2";
+  integrity 
sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
+
+eslint@^6.8.0:
+  version "6.8.0"
+  resolved 
"https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb";
+  integrity 
sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+  dependencies:
+    "@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"
+
+espree@^6.1.2:
+  version "6.2.1"
+  resolved 
"https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a";
+  integrity 
sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+  dependencies:
+    acorn "^7.1.1"
+    acorn-jsx "^5.2.0"
+    eslint-visitor-keys "^1.1.0"
+
 esprima@^4.0.0:
   version "4.0.1"
   resolved 
"https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
   integrity 
sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
+esquery@^1.0.1:
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe";
+  integrity 
sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==
+  dependencies:
+    estraverse "^5.0.0"
+
 esrecurse@^4.1.0:
   version "4.2.1"
   resolved 
"https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
@@ -2179,158 +1512,39 @@ estraverse@^4.1.0, estraverse@^4.1.1:
   resolved 
"https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d";
   integrity 
sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
+estraverse@^5.0.0:
+  version "5.0.0"
+  resolved 
"https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22";
+  integrity 
sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==
+
 estree-walker@^0.6.1:
   version "0.6.1"
   resolved 
"https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362";
   integrity 
sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
 
+estree-walker@^1.0.1:
+  version "1.0.1"
+  resolved 
"https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700";
+  integrity 
sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
 esutils@^2.0.2:
   version "2.0.3"
   resolved 
"https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64";
   integrity 
sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
-etag@~1.8.1:
-  version "1.8.1"
-  resolved 
"https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887";
-  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-
-events@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88";
-  integrity 
sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02";
-  integrity 
sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
-  dependencies:
-    md5.js "^1.3.4"
-    safe-buffer "^5.1.1"
-
-execa@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8";
-  integrity 
sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
-  dependencies:
-    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"
-
-expand-brackets@^2.1.4:
-  version "2.1.4"
-  resolved 
"https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622";
-  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
-  dependencies:
-    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"
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502";
-  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
-  dependencies:
-    homedir-polyfill "^1.0.1"
-
-express@^4.16.3:
-  version "4.17.1"
-  resolved 
"https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134";
-  integrity 
sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
-  dependencies:
-    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"
-
-ext@^1.1.2:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/ext/-/ext-1.2.0.tgz#8dd8d2dd21bcced3045be09621fa0cbf73908ba4";
-  integrity 
sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==
-  dependencies:
-    type "^2.0.0"
-
-extend-shallow@^2.0.1:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
-  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
-  dependencies:
-    is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
-  version "3.0.2"
-  resolved 
"https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8";
-  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+external-editor@^3.0.3:
+  version "3.1.0"
+  resolved 
"https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495";
+  integrity 
sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
   dependencies:
-    assign-symbols "^1.0.0"
-    is-extendable "^1.0.1"
-
-extend@^3.0.0:
-  version "3.0.2"
-  resolved 
"https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa";
-  integrity 
sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
+    tmp "^0.0.33"
 
-extglob@^2.0.4:
-  version "2.0.4"
-  resolved 
"https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543";
-  integrity 
sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
-  dependencies:
-    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"
-
-fancy-log@^1.3.2:
-  version "1.3.3"
-  resolved 
"https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7";
-  integrity 
sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
-  dependencies:
-    ansi-gray "^0.1.1"
-    color-support "^1.1.3"
-    parse-node-version "^1.0.0"
-    time-stamp "^1.0.0"
-
-fast-deep-equal@^2.0.1:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
-  integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
+fast-deep-equal@^3.1.1:
+  version "3.1.1"
+  resolved 
"https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4";
+  integrity 
sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
 
 fast-diff@^1.1.2:
   version "1.2.0"
@@ -2361,9 +1575,14 @@ fast-glob@^3.1.1:
     picomatch "^2.2.1"
 
 fast-json-stable-stringify@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2";
-  integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633";
+  integrity 
sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+  version "2.0.6"
+  resolved 
"https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917";
+  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
 fastq@^1.6.0:
   version "1.6.0"
@@ -2372,32 +1591,19 @@ fastq@^1.6.0:
   dependencies:
     reusify "^1.0.0"
 
-figgy-pudding@^3.5.1:
-  version "3.5.1"
-  resolved 
"https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790";
-  integrity 
sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-
-figures@^3.2.0:
+figures@^3.0.0, figures@^3.2.0:
   version "3.2.0"
   resolved 
"https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af";
   integrity 
sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
   dependencies:
     escape-string-regexp "^1.0.5"
 
-filesize@^3.6.1:
-  version "3.6.1"
-  resolved 
"https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317";
-  integrity 
sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
-
-fill-range@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7";
-  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+file-entry-cache@^5.0.1:
+  version "5.0.1"
+  resolved 
"https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c";
+  integrity 
sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
   dependencies:
-    extend-shallow "^2.0.1"
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-    to-regex-range "^2.1.0"
+    flat-cache "^2.0.1"
 
 fill-range@^7.0.1:
   version "7.0.1"
@@ -2406,44 +1612,21 @@ fill-range@^7.0.1:
   dependencies:
     to-regex-range "^5.0.1"
 
-finalhandler@~1.1.2:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d";
-  integrity 
sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
-  dependencies:
-    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"
-
-find-cache-dir@^2.1.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7";
-  integrity 
sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
-  dependencies:
-    commondir "^1.0.1"
-    make-dir "^2.0.0"
-    pkg-dir "^3.0.0"
-
-find-cache-dir@^3.0.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.1.0.tgz#9935894999debef4cf9f677fdf646d002c4cdecb";
-  integrity 
sha512-zw+EFiNBNPgI2NTrKkDd1xd7q0cs6wr/iWnr/oUkI0yF9K9GqQ+riIt4aiyFaaqpaWbxPrJXHI+QvmNUQbX+0Q==
+find-cache-dir@^3.2.0:
+  version "3.3.1"
+  resolved 
"https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880";
+  integrity 
sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
   dependencies:
     commondir "^1.0.1"
-    make-dir "^3.0.0"
+    make-dir "^3.0.2"
     pkg-dir "^4.1.0"
 
-find-up@^1.0.0:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
-  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7";
+  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
   dependencies:
-    path-exists "^2.0.0"
-    pinkie-promise "^2.0.0"
+    locate-path "^2.0.0"
 
 find-up@^3.0.0:
   version "3.0.0"
@@ -2460,49 +1643,19 @@ find-up@^4.0.0, find-up@^4.1.0:
     locate-path "^5.0.0"
     path-exists "^4.0.0"
 
-findup-sync@3.0.0, findup-sync@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1";
-  integrity 
sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
-  dependencies:
-    detect-file "^1.0.0"
-    is-glob "^4.0.0"
-    micromatch "^3.0.4"
-    resolve-dir "^1.0.1"
-
-findup-sync@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc";
-  integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
-  dependencies:
-    detect-file "^1.0.0"
-    is-glob "^3.1.0"
-    micromatch "^3.0.4"
-    resolve-dir "^1.0.1"
-
-fined@^1.0.1:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b";
-  integrity 
sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
+flat-cache@^2.0.1:
+  version "2.0.1"
+  resolved 
"https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0";
+  integrity 
sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
   dependencies:
-    expand-tilde "^2.0.2"
-    is-plain-object "^2.0.3"
-    object.defaults "^1.1.0"
-    object.pick "^1.2.0"
-    parse-filepath "^1.0.1"
-
-flagged-respawn@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41";
-  integrity 
sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
+    flatted "^2.0.0"
+    rimraf "2.6.3"
+    write "1.0.3"
 
-flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8";
-  integrity 
sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
-  dependencies:
-    inherits "^2.0.3"
-    readable-stream "^2.3.6"
+flatted@^2.0.0:
+  version "2.0.2"
+  resolved 
"https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138";
+  integrity 
sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
 
 follow-redirects@1.5.10:
   version "1.5.10"
@@ -2511,55 +1664,18 @@ follow-redirects@1.5.10:
   dependencies:
     debug "=3.1.0"
 
-for-in@^1.0.1, for-in@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80";
-  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-
-for-own@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b";
-  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
-  dependencies:
-    for-in "^1.0.1"
-
-foreground-child@^1.5.6:
-  version "1.5.6"
-  resolved 
"https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9";
-  integrity sha1-T9ca0t/elnibmApcCilZN8svXOk=
-  dependencies:
-    cross-spawn "^4"
-    signal-exit "^3.0.0"
-
-forwarded@~0.1.2:
-  version "0.1.2"
-  resolved 
"https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84";
-  integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
-
-fragment-cache@^0.2.1:
-  version "0.2.1"
-  resolved 
"https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19";
-  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
-  dependencies:
-    map-cache "^0.2.2"
-
-fresh@0.5.2:
-  version "0.5.2"
-  resolved 
"https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7";
-  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-
-from2@^2.1.0:
-  version "2.3.0"
-  resolved 
"https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
-  integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+foreground-child@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53";
+  integrity 
sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
   dependencies:
-    inherits "^2.0.1"
-    readable-stream "^2.0.0"
+    cross-spawn "^7.0.0"
+    signal-exit "^3.0.2"
 
-fs-constants@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad";
-  integrity 
sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+fromentries@^1.2.0:
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897";
+  integrity 
sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==
 
 fs-extra@^8.1.0:
   version "8.1.0"
@@ -2570,51 +1686,11 @@ fs-extra@^8.1.0:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-minipass@^1.2.5:
-  version "1.2.7"
-  resolved 
"https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7";
-  integrity 
sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
-  dependencies:
-    minipass "^2.6.0"
-
-fs-minipass@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1";
-  integrity 
sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==
-  dependencies:
-    minipass "^3.0.0"
-
-fs-mkdirp-stream@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb";
-  integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
-  dependencies:
-    graceful-fs "^4.1.11"
-    through2 "^2.0.3"
-
-fs-write-stream-atomic@^1.0.8:
-  version "1.0.10"
-  resolved 
"https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9";
-  integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
-  dependencies:
-    graceful-fs "^4.1.2"
-    iferr "^0.1.5"
-    imurmurhash "^0.1.4"
-    readable-stream "1 || 2"
-
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f";
   integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fsevents@^1.2.7:
-  version "1.2.9"
-  resolved 
"https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f";
-  integrity 
sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
-  dependencies:
-    nan "^2.12.1"
-    node-pre-gyp "^0.12.0"
-
 fsevents@~2.1.2:
   version "2.1.2"
   resolved 
"https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805";
@@ -2625,31 +1701,22 @@ function-bind@^1.1.1:
   resolved 
"https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
   integrity 
sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
-gauge@~2.7.3:
-  version "2.7.4"
-  resolved 
"https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7";
-  integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
-  dependencies:
-    aproba "^1.0.3"
-    console-control-strings "^1.0.0"
-    has-unicode "^2.0.0"
-    object-assign "^4.1.0"
-    signal-exit "^3.0.0"
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-    wide-align "^1.1.0"
-
-get-caller-file@^1.0.1:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
-  integrity 
sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved 
"https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+gensync@^1.0.0-beta.1:
+  version "1.0.0-beta.1"
+  resolved 
"https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269";
+  integrity 
sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
 
 get-caller-file@^2.0.1:
   version "2.0.5"
   resolved 
"https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e";
   integrity 
sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
-get-stream@^4.0.0, get-stream@^4.1.0:
+get-stream@^4.1.0:
   version "4.1.0"
   resolved 
"https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5";
   integrity 
sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
@@ -2663,41 +1730,19 @@ get-stream@^5.1.0:
   dependencies:
     pump "^3.0.0"
 
-get-value@^2.0.3, get-value@^2.0.6:
-  version "2.0.6"
-  resolved 
"https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
-  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
-
-gettext-parser@2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-2.0.0.tgz#c28bb31e61f76f14665dfafbb5c0518cdc1270ed";
-  integrity 
sha512-FDs/7XjNw58ToQwJFO7avZZbPecSYgw8PBYhd0An+4JtZSrSzKhEvTsVV2uqdO7VziWTOGSgLGD5YRPdsCjF7Q==
-  dependencies:
-    encoding "^0.1.12"
-    safe-buffer "^5.1.2"
-
-gettext-parser@^1.4.0:
-  version "1.4.0"
-  resolved 
"https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-1.4.0.tgz#f8baf34a292f03d5e42f02df099d301f167a7ace";
-  integrity 
sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==
-  dependencies:
-    encoding "^0.1.12"
-    safe-buffer "^5.1.1"
-
-gettext-to-messageformat@^0.3.0:
-  version "0.3.1"
-  resolved 
"https://registry.yarnpkg.com/gettext-to-messageformat/-/gettext-to-messageformat-0.3.1.tgz#c303ff9e31a5c781b14629b13bddb27b9ffca1f8";
-  integrity 
sha512-UyqIL3Ul4NryU95Wome/qtlcuVIqgEWVIFw0zi7Lv14ACLXfaVDCbrjZ7o+3BZ7u+4NS1mP/2O1eXZoHCoas8g==
+gettext-parser@1.1.0:
+  version "1.1.0"
+  resolved 
"https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-1.1.0.tgz#2c5a6638d893934b9b55037d0ad82cb7004b2679";
+  integrity sha1-LFpmONiTk0ubVQN9CtgstwBLJnk=
   dependencies:
-    gettext-parser "^1.4.0"
+    encoding "^0.1.11"
 
-glob-parent@^3.1.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae";
-  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+glob-parent@^5.0.0:
+  version "5.1.1"
+  resolved 
"https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229";
+  integrity 
sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
   dependencies:
-    is-glob "^3.1.0"
-    path-dirname "^1.0.0"
+    is-glob "^4.0.1"
 
 glob-parent@^5.1.0, glob-parent@~5.1.0:
   version "5.1.0"
@@ -2706,35 +1751,7 @@ glob-parent@^5.1.0, glob-parent@~5.1.0:
   dependencies:
     is-glob "^4.0.1"
 
-glob-stream@^6.1.0:
-  version "6.1.0"
-  resolved 
"https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4";
-  integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
-  dependencies:
-    extend "^3.0.0"
-    glob "^7.1.1"
-    glob-parent "^3.1.0"
-    is-negated-glob "^1.0.0"
-    ordered-read-streams "^1.0.0"
-    pumpify "^1.3.5"
-    readable-stream "^2.1.5"
-    remove-trailing-separator "^1.0.1"
-    to-absolute-glob "^2.0.0"
-    unique-stream "^2.0.2"
-
-glob-watcher@^5.0.3:
-  version "5.0.3"
-  resolved 
"https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626";
-  integrity 
sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==
-  dependencies:
-    anymatch "^2.0.0"
-    async-done "^1.2.0"
-    chokidar "^2.0.0"
-    is-negated-glob "^1.0.0"
-    just-debounce "^1.0.0"
-    object.defaults "^1.1.0"
-
-glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4:
+glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
   version "7.1.6"
   resolved 
"https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6";
   integrity 
sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -2753,47 +1770,18 @@ global-dirs@^2.0.1:
   dependencies:
     ini "^1.3.5"
 
-global-modules@2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780";
-  integrity 
sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
-  dependencies:
-    global-prefix "^3.0.0"
-
-global-modules@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea";
-  integrity 
sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
-  dependencies:
-    global-prefix "^1.0.1"
-    is-windows "^1.0.1"
-    resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe";
-  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
-  dependencies:
-    expand-tilde "^2.0.2"
-    homedir-polyfill "^1.0.1"
-    ini "^1.3.4"
-    is-windows "^1.0.1"
-    which "^1.2.14"
-
-global-prefix@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97";
-  integrity 
sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
-  dependencies:
-    ini "^1.3.5"
-    kind-of "^6.0.2"
-    which "^1.3.1"
-
 globals@^11.1.0:
   version "11.12.0"
   resolved 
"https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e";
   integrity 
sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
+globals@^12.1.0:
+  version "12.4.0"
+  resolved 
"https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8";
+  integrity 
sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+  dependencies:
+    type-fest "^0.8.1"
+
 globby@^10.0.1:
   version "10.0.1"
   resolved 
"https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22";
@@ -2820,13 +1808,6 @@ globby@^11.0.0:
     merge2 "^1.3.0"
     slash "^3.0.0"
 
-glogg@^1.0.0:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f";
-  integrity 
sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==
-  dependencies:
-    sparkles "^1.0.0"
-
 got@^9.6.0:
   version "9.6.0"
   resolved 
"https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85";
@@ -2844,121 +1825,28 @@ got@^9.6.0:
     to-readable-stream "^1.0.0"
     url-parse-lax "^3.0.0"
 
-graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, 
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, 
graceful-fs@^4.2.0, graceful-fs@^4.2.2:
   version "4.2.3"
   resolved 
"https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423";
   integrity 
sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
 
-gulp-cli@^2.2.0:
-  version "2.2.0"
-  resolved 
"https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc";
-  integrity 
sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==
-  dependencies:
-    ansi-colors "^1.0.1"
-    archy "^1.0.0"
-    array-sort "^1.0.0"
-    color-support "^1.1.3"
-    concat-stream "^1.6.0"
-    copy-props "^2.0.1"
-    fancy-log "^1.3.2"
-    gulplog "^1.0.0"
-    interpret "^1.1.0"
-    isobject "^3.0.1"
-    liftoff "^3.1.0"
-    matchdep "^2.0.0"
-    mute-stdout "^1.0.0"
-    pretty-hrtime "^1.0.0"
-    replace-homedir "^1.0.0"
-    semver-greatest-satisfied-range "^1.1.0"
-    v8flags "^3.0.1"
-    yargs "^7.1.0"
-
-gulp-gzip@^1.2.0:
-  version "1.4.2"
-  resolved 
"https://registry.yarnpkg.com/gulp-gzip/-/gulp-gzip-1.4.2.tgz#0422a94014248655b5b1a9eea1c2abee1d4f4337";
-  integrity 
sha512-ZIxfkUwk2XmZPTT9pPHrHUQlZMyp9nPhg2sfoeN27mBGpi7OaHnOD+WCN41NXjfJQ69lV1nQ9LLm1hYxx4h3UQ==
-  dependencies:
-    ansi-colors "^1.0.1"
-    bytes "^3.0.0"
-    fancy-log "^1.3.2"
-    plugin-error "^1.0.0"
-    stream-to-array "^2.3.0"
-    through2 "^2.0.3"
-
-gulp-json-transform@^0.4.2:
-  version "0.4.7"
-  resolved 
"https://registry.yarnpkg.com/gulp-json-transform/-/gulp-json-transform-0.4.7.tgz#41c37524c976e41f3d46c06f985b01530a472e34";
-  integrity 
sha512-Wi0p5GpoLXbTDwaZnw6rgj3FMLW3PscaHaX1okxrTgPWeqnIiMo4aJz7VlG68JYkxPeAXJrPce8AGEfcT2IifA==
-  dependencies:
-    ansi-colors "^1.0.1"
-    fancy-log "^1.3.2"
-    plugin-error "^1.0.1"
-    promise "^8.0.1"
-    through2 "^2.0.3"
-    vinyl "^2.1.0"
-
-gulp-rename@^1.2.2:
-  version "1.4.0"
-  resolved 
"https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd";
-  integrity 
sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==
-
-gulp-tar@^3.0.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/gulp-tar/-/gulp-tar-3.1.0.tgz#2e474619b2820eddf5cf48cec8aac08eaee3bf20";
-  integrity 
sha512-+Y3ntrDIBBVoxqlAnb0STUdVNx+xceH6YIFXvYMA48avJiwa+a81bFbJ/loz47zSF8nflc15ON0YLX4YgMLAvw==
-  dependencies:
-    archiver "^3.1.1"
-    plugin-error "^1.0.1"
-    through2 "^3.0.1"
-    vinyl "^2.1.0"
-
-gulp-zip@^5.0.0:
-  version "5.0.1"
-  resolved 
"https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-5.0.1.tgz#0dba5094901b0d91bcc8b53b3f6ff797c0f2002d";
-  integrity 
sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==
-  dependencies:
-    get-stream "^5.1.0"
-    plugin-error "^1.0.1"
-    through2 "^3.0.1"
-    vinyl "^2.1.0"
-    yazl "^2.5.1"
-
-gulp@^4.0.0:
-  version "4.0.2"
-  resolved 
"https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa";
-  integrity 
sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==
-  dependencies:
-    glob-watcher "^5.0.3"
-    gulp-cli "^2.2.0"
-    undertaker "^1.2.1"
-    vinyl-fs "^3.0.0"
-
-gulplog@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5";
-  integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U=
-  dependencies:
-    glogg "^1.0.0"
-
-gzip-size@^5.0.0:
-  version "5.1.1"
-  resolved 
"https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274";
-  integrity 
sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
-  dependencies:
-    duplexer "^0.1.1"
-    pify "^4.0.1"
-
-handlebars@^4.1.2, handlebars@^4.5.1:
-  version "4.5.3"
-  resolved 
"https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482";
-  integrity 
sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==
+handlebars@^4.7.6:
+  version "4.7.6"
+  resolved 
"https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e";
+  integrity 
sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==
   dependencies:
+    minimist "^1.2.5"
     neo-async "^2.6.0"
-    optimist "^0.6.1"
     source-map "^0.6.1"
+    wordwrap "^1.0.0"
   optionalDependencies:
     uglify-js "^3.1.4"
 
+has-color@~0.1.0:
+  version "0.1.7"
+  resolved 
"https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f";
+  integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=
+
 has-flag@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd";
@@ -2969,139 +1857,52 @@ has-flag@^4.0.0:
   resolved 
"https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b";
   integrity 
sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
-has-symbols@^1.0.0:
+has-symbols@^1.0.0, has-symbols@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8";
   integrity 
sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
 
-has-unicode@^2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9";
-  integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
-
-has-value@^0.3.1:
-  version "0.3.1"
-  resolved 
"https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f";
-  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
-  dependencies:
-    get-value "^2.0.3"
-    has-values "^0.1.4"
-    isobject "^2.0.0"
-
-has-value@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177";
-  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
-  dependencies:
-    get-value "^2.0.6"
-    has-values "^1.0.0"
-    isobject "^3.0.0"
-
-has-values@^0.1.4:
-  version "0.1.4"
-  resolved 
"https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771";
-  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
-
-has-values@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f";
-  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
-  dependencies:
-    is-number "^3.0.0"
-    kind-of "^4.0.0"
-
 has-yarn@^2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77";
   integrity 
sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
 
-hash-base@^3.0.0:
-  version "3.0.4"
-  resolved 
"https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918";
-  integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
-  version "1.1.7"
-  resolved 
"https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42";
-  integrity 
sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
-  dependencies:
-    inherits "^2.0.3"
-    minimalistic-assert "^1.0.1"
-
-hasha@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39";
-  integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=
-  dependencies:
-    is-stream "^1.0.1"
-
-highlight.js@^9.16.2:
-  version "9.16.2"
-  resolved 
"https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e";
-  integrity 
sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw==
-
-hmac-drbg@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1";
-  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+has@^1.0.3:
+  version "1.0.3"
+  resolved 
"https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
+  integrity 
sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
   dependencies:
-    hash.js "^1.0.3"
-    minimalistic-assert "^1.0.0"
-    minimalistic-crypto-utils "^1.0.1"
+    function-bind "^1.1.1"
 
-homedir-polyfill@^1.0.1:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8";
-  integrity 
sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+hasha@^5.0.0:
+  version "5.2.0"
+  resolved 
"https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c";
+  integrity 
sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==
   dependencies:
-    parse-passwd "^1.0.0"
+    is-stream "^2.0.0"
+    type-fest "^0.8.0"
 
-hoopy@^0.1.4:
-  version "0.1.4"
-  resolved 
"https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d";
-  integrity 
sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+highlight.js@^9.18.1:
+  version "9.18.1"
+  resolved 
"https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c";
+  integrity 
sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==
 
 hosted-git-info@^2.1.4:
   version "2.8.5"
   resolved 
"https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c";
   integrity 
sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==
 
+html-escaper@^2.0.0:
+  version "2.0.2"
+  resolved 
"https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453";
+  integrity 
sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
 http-cache-semantics@^4.0.0:
   version "4.0.3"
   resolved 
"https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5";
   integrity 
sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==
 
-http-errors@1.7.2:
-  version "1.7.2"
-  resolved 
"https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f";
-  integrity 
sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.3"
-    setprototypeof "1.1.1"
-    statuses ">= 1.5.0 < 2"
-    toidentifier "1.0.0"
-
-http-errors@~1.7.2:
-  version "1.7.3"
-  resolved 
"https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06";
-  integrity 
sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.4"
-    setprototypeof "1.1.1"
-    statuses ">= 1.5.0 < 2"
-    toidentifier "1.0.0"
-
-https-browserify@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
-  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-
-iconv-lite@0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
+iconv-lite@^0.4.24, iconv-lite@~0.4.13:
   version "0.4.24"
   resolved 
"https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b";
   integrity 
sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3113,46 +1914,34 @@ idb-bridge@^0.0.15:
   resolved 
"https://registry.yarnpkg.com/idb-bridge/-/idb-bridge-0.0.15.tgz#3fddc91b9aab775fae273d02b272205c6090d270";
   integrity 
sha512-xuZM/i4vCm/NkqyrKNJDEuBaZK7M2kyj+1F4hDGqtEJZSmQMSV3v9A6Ie3fR12VXDKIbMr7uV22eWjIKwSosOA==
 
-ieee754@^1.1.4:
-  version "1.1.13"
-  resolved 
"https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84";
-  integrity 
sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
-
-iferr@^0.1.5:
-  version "0.1.5"
-  resolved 
"https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
-  integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-
 ignore-by-default@^1.0.0:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09";
   integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
 
-ignore-walk@^3.0.1:
-  version "3.0.3"
-  resolved 
"https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37";
-  integrity 
sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
-  dependencies:
-    minimatch "^3.0.4"
+ignore@^4.0.6:
+  version "4.0.6"
+  resolved 
"https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc";
+  integrity 
sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
 ignore@^5.1.1, ignore@^5.1.4:
   version "5.1.4"
   resolved 
"https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf";
   integrity 
sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
 
+import-fresh@^3.0.0:
+  version "3.2.1"
+  resolved 
"https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66";
+  integrity 
sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
 import-lazy@^2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43";
   integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
 
-import-local@2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d";
-  integrity 
sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
-  dependencies:
-    pkg-dir "^3.0.0"
-    resolve-cwd "^2.0.0"
-
 import-local@^3.0.2:
   version "3.0.2"
   resolved 
"https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6";
@@ -3176,11 +1965,6 @@ indent-string@^4.0.0:
   resolved 
"https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251";
   integrity 
sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
 
-infer-owner@^1.0.3, infer-owner@^1.0.4:
-  version "1.0.4"
-  resolved 
"https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467";
-  integrity 
sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
 inflight@^1.0.4:
   version "1.0.6"
   resolved 
"https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9";
@@ -3189,85 +1973,59 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, 
inherits@~2.0.3:
+inherits@2:
   version "2.0.4"
   resolved 
"https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c";
   integrity 
sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-inherits@2.0.1:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1";
-  integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
-
-inherits@2.0.3:
-  version "2.0.3"
-  resolved 
"https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de";
-  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-
-ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
+ini@^1.3.5, ini@~1.3.0:
   version "1.3.5"
   resolved 
"https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927";
   integrity 
sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 
-interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0:
+inquirer@^7.0.0:
+  version "7.1.0"
+  resolved 
"https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29";
+  integrity 
sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
+  dependencies:
+    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"
+
+internal-slot@^1.0.2:
+  version "1.0.2"
+  resolved 
"https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3";
+  integrity 
sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==
+  dependencies:
+    es-abstract "^1.17.0-next.1"
+    has "^1.0.3"
+    side-channel "^1.0.2"
+
+interpret@^1.0.0:
   version "1.2.0"
   resolved 
"https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296";
   integrity 
sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
 
-invert-kv@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
-  integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-
-invert-kv@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02";
-  integrity 
sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
-ipaddr.js@1.9.0:
-  version "1.9.0"
-  resolved 
"https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65";
-  integrity 
sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
-
 irregular-plurals@^3.2.0:
   version "3.2.0"
   resolved 
"https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822";
   integrity 
sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==
 
-is-absolute@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576";
-  integrity 
sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
-  dependencies:
-    is-relative "^1.0.0"
-    is-windows "^1.0.1"
-
-is-accessor-descriptor@^0.1.6:
-  version "0.1.6"
-  resolved 
"https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
-  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656";
-  integrity 
sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
-  dependencies:
-    kind-of "^6.0.0"
-
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved 
"https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d";
   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
-is-binary-path@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898";
-  integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
-  dependencies:
-    binary-extensions "^1.0.0"
-
 is-binary-path@~2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09";
@@ -3275,10 +2033,10 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved 
"https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
-  integrity 
sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+is-callable@^1.1.4, is-callable@^1.1.5:
+  version "1.1.5"
+  resolved 
"https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab";
+  integrity 
sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
 
 is-ci@^2.0.0:
   version "2.0.0"
@@ -3287,67 +2045,21 @@ is-ci@^2.0.0:
   dependencies:
     ci-info "^2.0.0"
 
-is-data-descriptor@^0.1.4:
-  version "0.1.4"
-  resolved 
"https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56";
-  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-data-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7";
-  integrity 
sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
-  dependencies:
-    kind-of "^6.0.0"
-
-is-descriptor@^0.1.0:
-  version "0.1.6"
-  resolved 
"https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca";
-  integrity 
sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
-  dependencies:
-    is-accessor-descriptor "^0.1.6"
-    is-data-descriptor "^0.1.4"
-    kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+is-date-object@^1.0.1:
   version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec";
-  integrity 
sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
-  dependencies:
-    is-accessor-descriptor "^1.0.0"
-    is-data-descriptor "^1.0.0"
-    kind-of "^6.0.2"
+  resolved 
"https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e";
+  integrity 
sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
 
 is-error@^2.2.2:
   version "2.2.2"
   resolved 
"https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843";
   integrity 
sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==
 
-is-extendable@^0.1.0, is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89";
-  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
-
-is-extendable@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4";
-  integrity 
sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
-  dependencies:
-    is-plain-object "^2.0.4"
-
-is-extglob@^2.1.0, is-extglob@^2.1.1:
+is-extglob@^2.1.1:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2";
   integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
 
-is-fullwidth-code-point@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb";
-  integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
-  dependencies:
-    number-is-nan "^1.0.0"
-
 is-fullwidth-code-point@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f";
@@ -3358,13 +2070,6 @@ is-fullwidth-code-point@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d";
   integrity 
sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
-is-glob@^3.1.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a";
-  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
-  dependencies:
-    is-extglob "^2.1.0"
-
 is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
   version "4.0.1"
   resolved 
"https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc";
@@ -3390,28 +2095,11 @@ is-module@^1.0.0:
   resolved 
"https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591";
   integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
 
-is-negated-glob@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2";
-  integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
-
 is-npm@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d";
   integrity 
sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
 
-is-number@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195";
-  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff";
-  integrity 
sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
-
 is-number@^7.0.0:
   version "7.0.0"
   resolved 
"https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b";
@@ -3432,13 +2120,6 @@ is-path-inside@^3.0.1:
   resolved 
"https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017";
   integrity 
sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
 
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
-  version "2.0.4"
-  resolved 
"https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677";
-  integrity 
sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
-  dependencies:
-    isobject "^3.0.1"
-
 is-plain-object@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928";
@@ -3458,56 +2139,46 @@ is-reference@^1.1.2:
   dependencies:
     "@types/estree" "0.0.39"
 
-is-relative@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d";
-  integrity 
sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
+is-regex@^1.0.5:
+  version "1.0.5"
+  resolved 
"https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae";
+  integrity 
sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
   dependencies:
-    is-unc-path "^1.0.0"
+    has "^1.0.3"
 
-is-stream@^1.0.1, is-stream@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
-  integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+is-stream@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3";
+  integrity 
sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
 
-is-typedarray@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a";
-  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+is-string@^1.0.5:
+  version "1.0.5"
+  resolved 
"https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6";
+  integrity 
sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
 
-is-unc-path@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d";
-  integrity 
sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
+is-symbol@^1.0.2:
+  version "1.0.3"
+  resolved 
"https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937";
+  integrity 
sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
   dependencies:
-    unc-path-regex "^0.1.2"
-
-is-utf8@^0.2.0, is-utf8@^0.2.1:
-  version "0.2.1"
-  resolved 
"https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72";
-  integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+    has-symbols "^1.0.1"
 
-is-valid-glob@^1.0.0:
+is-typedarray@^1.0.0:
   version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa";
-  integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
+  resolved 
"https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a";
+  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
-is-windows@^1.0.1, is-windows@^1.0.2:
+is-windows@^1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d";
   integrity 
sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
-is-wsl@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d";
-  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
-
 is-yarn-global@^0.3.0:
   version "0.3.0"
   resolved 
"https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232";
   integrity 
sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
 
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+isarray@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11";
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
@@ -3517,74 +2188,74 @@ isexe@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89";
-  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
-  dependencies:
-    isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
-  version "3.0.1"
-  resolved 
"https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
-  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
-
 isobject@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0";
   integrity 
sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
 
-istanbul-lib-coverage@^2.0.5:
-  version "2.0.5"
-  resolved 
"https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49";
-  integrity 
sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec";
+  integrity 
sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==
 
-istanbul-lib-hook@^2.0.7:
-  version "2.0.7"
-  resolved 
"https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133";
-  integrity 
sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==
+istanbul-lib-hook@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6";
+  integrity 
sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==
   dependencies:
-    append-transform "^1.0.0"
+    append-transform "^2.0.0"
 
-istanbul-lib-instrument@^3.3.0:
-  version "3.3.0"
-  resolved 
"https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630";
-  integrity 
sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==
-  dependencies:
-    "@babel/generator" "^7.4.0"
-    "@babel/parser" "^7.4.3"
-    "@babel/template" "^7.4.0"
-    "@babel/traverse" "^7.4.3"
-    "@babel/types" "^7.4.0"
-    istanbul-lib-coverage "^2.0.5"
-    semver "^6.0.0"
+istanbul-lib-instrument@^4.0.0:
+  version "4.0.1"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6";
+  integrity 
sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==
+  dependencies:
+    "@babel/core" "^7.7.5"
+    "@babel/parser" "^7.7.5"
+    "@babel/template" "^7.7.4"
+    "@babel/traverse" "^7.7.4"
+    "@istanbuljs/schema" "^0.1.2"
+    istanbul-lib-coverage "^3.0.0"
+    semver "^6.3.0"
 
-istanbul-lib-report@^2.0.8:
-  version "2.0.8"
-  resolved 
"https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33";
-  integrity 
sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==
+istanbul-lib-processinfo@^2.0.2:
+  version "2.0.2"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c";
+  integrity 
sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==
   dependencies:
-    istanbul-lib-coverage "^2.0.5"
-    make-dir "^2.1.0"
-    supports-color "^6.1.0"
+    archy "^1.0.0"
+    cross-spawn "^7.0.0"
+    istanbul-lib-coverage "^3.0.0-alpha.1"
+    make-dir "^3.0.0"
+    p-map "^3.0.0"
+    rimraf "^3.0.0"
+    uuid "^3.3.3"
 
-istanbul-lib-source-maps@^3.0.6:
-  version "3.0.6"
-  resolved 
"https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8";
-  integrity 
sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==
+istanbul-lib-report@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6";
+  integrity 
sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+  dependencies:
+    istanbul-lib-coverage "^3.0.0"
+    make-dir "^3.0.0"
+    supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+  version "4.0.0"
+  resolved 
"https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9";
+  integrity 
sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==
   dependencies:
     debug "^4.1.1"
-    istanbul-lib-coverage "^2.0.5"
-    make-dir "^2.1.0"
-    rimraf "^2.6.3"
+    istanbul-lib-coverage "^3.0.0"
     source-map "^0.6.1"
 
-istanbul-reports@^2.2.4:
-  version "2.2.6"
-  resolved 
"https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af";
-  integrity 
sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==
+istanbul-reports@^3.0.2:
+  version "3.0.2"
+  resolved 
"https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b";
+  integrity 
sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==
   dependencies:
-    handlebars "^4.1.2"
+    html-escaper "^2.0.0"
+    istanbul-lib-report "^3.0.0"
 
 jed@^1.1.1:
   version "1.1.1"
@@ -3599,11 +2270,6 @@ jest-worker@^24.9.0:
     merge-stream "^2.0.0"
     supports-color "^6.1.0"
 
-jquery@^3.4.1:
-  version "3.4.1"
-  resolved 
"https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2";
-  integrity 
sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
-
 js-string-escape@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef";
@@ -3632,7 +2298,7 @@ json-buffer@3.0.0:
   resolved 
"https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898";
   integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
 
-json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+json-parse-better-errors@^1.0.1:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9";
   integrity 
sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -3647,12 +2313,12 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved 
"https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651";
   integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
-json5@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe";
-  integrity 
sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+json5@^2.1.2:
+  version "2.1.3"
+  resolved 
"https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43";
+  integrity 
sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
   dependencies:
-    minimist "^1.2.0"
+    minimist "^1.2.5"
 
 jsonfile@^4.0.0:
   version "4.0.0"
@@ -3661,10 +2327,13 @@ jsonfile@^4.0.0:
   optionalDependencies:
     graceful-fs "^4.1.6"
 
-just-debounce@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea";
-  integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=
+jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
+  version "2.2.3"
+  resolved 
"https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f";
+  integrity 
sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
+  dependencies:
+    array-includes "^3.0.3"
+    object.assign "^4.1.0"
 
 keyv@^3.0.0:
   version "3.1.0"
@@ -3673,38 +2342,6 @@ keyv@^3.0.0:
   dependencies:
     json-buffer "3.0.0"
 
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
-  version "3.2.2"
-  resolved 
"https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64";
-  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57";
-  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^5.0.0, kind-of@^5.0.2:
-  version "5.1.0"
-  resolved 
"https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d";
-  integrity 
sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.0, kind-of@^6.0.2:
-  version "6.0.2"
-  resolved 
"https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
-  integrity 
sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
-
-last-run@^1.1.0:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b";
-  integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls=
-  dependencies:
-    default-resolution "^2.0.0"
-    es6-weak-map "^2.0.1"
-
 latest-version@^5.0.0:
   version "5.1.0"
   resolved 
"https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face";
@@ -3712,72 +2349,27 @@ latest-version@^5.0.0:
   dependencies:
     package-json "^6.3.0"
 
-lazystream@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4";
-  integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
-  dependencies:
-    readable-stream "^2.0.5"
-
-lcid@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835";
-  integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
-  dependencies:
-    invert-kv "^1.0.0"
-
-lcid@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf";
-  integrity 
sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
-  dependencies:
-    invert-kv "^2.0.0"
-
-lead@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42";
-  integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved 
"https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
   dependencies:
-    flush-write-stream "^1.0.2"
-
-liftoff@^3.1.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3";
-  integrity 
sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==
-  dependencies:
-    extend "^3.0.0"
-    findup-sync "^3.0.0"
-    fined "^1.0.1"
-    flagged-respawn "^1.0.0"
-    is-plain-object "^2.0.4"
-    object.map "^1.0.0"
-    rechoir "^0.6.2"
-    resolve "^1.1.7"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
 
 lines-and-columns@^1.1.6:
   version "1.1.6"
   resolved 
"https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00";
   integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
 
-load-json-file@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0";
-  integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8";
+  integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
   dependencies:
     graceful-fs "^4.1.2"
     parse-json "^2.2.0"
     pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    strip-bom "^2.0.0"
-
-load-json-file@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b";
-  integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
-  dependencies:
-    graceful-fs "^4.1.2"
-    parse-json "^4.0.0"
-    pify "^3.0.0"
     strip-bom "^3.0.0"
 
 load-json-file@^5.2.0:
@@ -3791,19 +2383,13 @@ load-json-file@^5.2.0:
     strip-bom "^3.0.0"
     type-fest "^0.3.0"
 
-loader-runner@^2.4.0:
-  version "2.4.0"
-  resolved 
"https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357";
-  integrity 
sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
-
-loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3:
-  version "1.2.3"
-  resolved 
"https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7";
-  integrity 
sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
+  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
   dependencies:
-    big.js "^5.2.2"
-    emojis-list "^2.0.0"
-    json5 "^1.0.1"
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
 
 locate-path@^3.0.0:
   version "3.0.0"
@@ -3825,21 +2411,6 @@ lodash.clonedeep@^4.5.0:
   resolved 
"https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef";
   integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
-lodash.defaults@^4.2.0:
-  version "4.2.0"
-  resolved 
"https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c";
-  integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
-
-lodash.difference@^4.5.0:
-  version "4.5.0"
-  resolved 
"https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c";
-  integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=
-
-lodash.flatten@^4.4.0:
-  version "4.4.0"
-  resolved 
"https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f";
-  integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
-
 lodash.flattendeep@^4.4.0:
   version "4.4.0"
   resolved 
"https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2";
@@ -3850,33 +2421,16 @@ lodash.islength@^4.0.1:
   resolved 
"https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577";
   integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc=
 
-lodash.isplainobject@^4.0.6:
-  version "4.0.6"
-  resolved 
"https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb";
-  integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
-
 lodash.merge@^4.6.1:
   version "4.6.2"
   resolved 
"https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a";
   integrity 
sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
-lodash.union@^4.6.0:
-  version "4.6.0"
-  resolved 
"https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88";
-  integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
-
-lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5:
+lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
   version "4.17.15"
   resolved 
"https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548";
   integrity 
sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 
-log-symbols@^2.1.0:
-  version "2.2.0"
-  resolved 
"https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a";
-  integrity 
sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
-  dependencies:
-    chalk "^2.0.1"
-
 log-symbols@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4";
@@ -3884,14 +2438,6 @@ log-symbols@^3.0.0:
   dependencies:
     chalk "^2.4.2"
 
-loglevelnext@^1.0.1:
-  version "1.0.5"
-  resolved 
"https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2";
-  integrity 
sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==
-  dependencies:
-    es6-symbol "^3.1.1"
-    object.assign "^4.1.0"
-
 loose-envify@^1.1.0, loose-envify@^1.4.0:
   version "1.4.0"
   resolved 
"https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf";
@@ -3909,21 +2455,6 @@ lowercase-keys@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479";
   integrity 
sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
 
-lru-cache@^4.0.1:
-  version "4.1.5"
-  resolved 
"https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
-  integrity 
sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
-  dependencies:
-    pseudomap "^1.0.2"
-    yallist "^2.1.2"
-
-lru-cache@^5.1.1:
-  version "5.1.1"
-  resolved 
"https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920";
-  integrity 
sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
-  dependencies:
-    yallist "^3.0.2"
-
 lunr@^2.3.8:
   version "2.3.8"
   resolved 
"https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072";
@@ -3936,13 +2467,12 @@ magic-string@^0.25.2:
   dependencies:
     sourcemap-codec "^1.4.4"
 
-make-dir@^2.0.0, make-dir@^2.1.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5";
-  integrity 
sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+magic-string@^0.25.5:
+  version "0.25.7"
+  resolved 
"https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051";
+  integrity 
sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
   dependencies:
-    pify "^4.0.1"
-    semver "^5.6.0"
+    sourcemap-codec "^1.4.4"
 
 make-dir@^3.0.0:
   version "3.0.0"
@@ -3951,56 +2481,17 @@ make-dir@^3.0.0:
   dependencies:
     semver "^6.0.0"
 
-make-iterator@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6";
-  integrity 
sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
-  dependencies:
-    kind-of "^6.0.2"
-
-mamacro@^0.0.3:
-  version "0.0.3"
-  resolved 
"https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4";
-  integrity 
sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
-
-map-age-cleaner@^0.1.1:
-  version "0.1.3"
-  resolved 
"https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a";
-  integrity 
sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
-  dependencies:
-    p-defer "^1.0.0"
-
-map-cache@^0.2.0, map-cache@^0.2.2:
-  version "0.2.2"
-  resolved 
"https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
-  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
-
-map-stream@^0.0.7:
-  version "0.0.7"
-  resolved 
"https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8";
-  integrity sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=
-
-map-visit@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
-  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+make-dir@^3.0.2:
+  version "3.0.2"
+  resolved 
"https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392";
+  integrity 
sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
   dependencies:
-    object-visit "^1.0.0"
-
-marked@^0.7.0:
-  version "0.7.0"
-  resolved 
"https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e";
-  integrity 
sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
+    semver "^6.0.0"
 
-matchdep@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e";
-  integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4=
-  dependencies:
-    findup-sync "^2.0.0"
-    micromatch "^3.0.4"
-    resolve "^1.4.0"
-    stack-trace "0.0.10"
+marked@0.8.2:
+  version "0.8.2"
+  resolved 
"https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355";
+  integrity 
sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==
 
 matcher@^2.1.0:
   version "2.1.0"
@@ -4028,57 +2519,6 @@ md5-o-matic@^0.1.1:
   resolved 
"https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3";
   integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=
 
-md5.js@^1.3.4:
-  version "1.3.5"
-  resolved 
"https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f";
-  integrity 
sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
-  dependencies:
-    hash-base "^3.0.0"
-    inherits "^2.0.1"
-    safe-buffer "^5.1.2"
-
-media-typer@0.3.0:
-  version "0.3.0"
-  resolved 
"https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748";
-  integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-
-mem@^4.0.0:
-  version "4.3.0"
-  resolved 
"https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178";
-  integrity 
sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
-  dependencies:
-    map-age-cleaner "^0.1.1"
-    mimic-fn "^2.0.0"
-    p-is-promise "^2.0.0"
-
-memory-fs@^0.4.0, memory-fs@^0.4.1:
-  version "0.4.1"
-  resolved 
"https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
-  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
-  dependencies:
-    errno "^0.1.3"
-    readable-stream "^2.0.1"
-
-memory-fs@^0.5.0:
-  version "0.5.0"
-  resolved 
"https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c";
-  integrity 
sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
-  dependencies:
-    errno "^0.1.3"
-    readable-stream "^2.0.1"
-
-merge-descriptors@1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
-  integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
-
-merge-source-map@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646";
-  integrity 
sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==
-  dependencies:
-    source-map "^0.6.1"
-
 merge-stream@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60";
@@ -4089,30 +2529,6 @@ merge2@^1.2.3, merge2@^1.3.0:
   resolved 
"https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81";
   integrity 
sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
 
-methods@~1.1.2:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee";
-  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.9:
-  version "3.1.10"
-  resolved 
"https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23";
-  integrity 
sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
-  dependencies:
-    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"
-
 micromatch@^4.0.2:
   version "4.0.2"
   resolved 
"https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259";
@@ -4121,32 +2537,7 @@ micromatch@^4.0.2:
     braces "^3.0.1"
     picomatch "^2.0.5"
 
-miller-rabin@^4.0.0:
-  version "4.0.1"
-  resolved 
"https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d";
-  integrity 
sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
-  dependencies:
-    bn.js "^4.0.0"
-    brorand "^1.0.1"
-
-mime-db@1.42.0:
-  version "1.42.0"
-  resolved 
"https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac";
-  integrity 
sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
-
-mime-types@~2.1.24:
-  version "2.1.25"
-  resolved 
"https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437";
-  integrity 
sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==
-  dependencies:
-    mime-db "1.42.0"
-
-mime@1.6.0:
-  version "1.6.0"
-  resolved 
"https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1";
-  integrity 
sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mimic-fn@^2.0.0, mimic-fn@^2.1.0:
+mimic-fn@^2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b";
   integrity 
sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
@@ -4156,16 +2547,6 @@ mimic-response@^1.0.0, mimic-response@^1.0.1:
   resolved 
"https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b";
   integrity 
sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
 
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
-  integrity 
sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
-  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-
 minimatch@^3.0.0, minimatch@^3.0.4:
   version "3.0.4"
   resolved 
"https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083";
@@ -4173,245 +2554,72 @@ minimatch@^3.0.0, minimatch@^3.0.4:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimist@0.0.8:
-  version "0.0.8"
-  resolved 
"https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d";
-  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
 minimist@^1.2.0:
   version "1.2.0"
   resolved 
"https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284";
   integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
 
-minimist@~0.0.1:
-  version "0.0.10"
-  resolved 
"https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf";
-  integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
-
-minipass-collect@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617";
-  integrity 
sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
-  dependencies:
-    minipass "^3.0.0"
-
-minipass-flush@^1.0.5:
-  version "1.0.5"
-  resolved 
"https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373";
-  integrity 
sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
-  dependencies:
-    minipass "^3.0.0"
-
-minipass-pipeline@^1.2.2:
-  version "1.2.2"
-  resolved 
"https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a";
-  integrity 
sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==
-  dependencies:
-    minipass "^3.0.0"
-
-minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
-  version "2.9.0"
-  resolved 
"https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6";
-  integrity 
sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
-  dependencies:
-    safe-buffer "^5.1.2"
-    yallist "^3.0.0"
-
-minipass@^3.0.0, minipass@^3.1.1:
-  version "3.1.1"
-  resolved 
"https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5";
-  integrity 
sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
-  dependencies:
-    yallist "^4.0.0"
-
-minizlib@^1.2.1:
-  version "1.3.3"
-  resolved 
"https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d";
-  integrity 
sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
-  dependencies:
-    minipass "^2.9.0"
-
-mississippi@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022";
-  integrity 
sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
-  dependencies:
-    concat-stream "^1.5.0"
-    duplexify "^3.4.2"
-    end-of-stream "^1.1.0"
-    flush-write-stream "^1.0.0"
-    from2 "^2.1.0"
-    parallel-transform "^1.1.0"
-    pump "^3.0.0"
-    pumpify "^1.3.3"
-    stream-each "^1.1.0"
-    through2 "^2.0.0"
-
-mixin-deep@^1.2.0:
-  version "1.3.2"
-  resolved 
"https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566";
-  integrity 
sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
-  dependencies:
-    for-in "^1.0.2"
-    is-extendable "^1.0.1"
+minimist@^1.2.5:
+  version "1.2.5"
+  resolved 
"https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602";
+  integrity 
sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 
-mkdirp@^0.5.0, mkdirp@^0.5.1:
-  version "0.5.1"
-  resolved 
"https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903";
-  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+mkdirp@^0.5.1:
+  version "0.5.5"
+  resolved 
"https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def";
+  integrity 
sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
   dependencies:
-    minimist "0.0.8"
+    minimist "^1.2.5"
 
 moment@^2.18.1:
   version "2.24.0"
   resolved 
"https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b";
   integrity 
sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
 
-move-concurrently@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92";
-  integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
-  dependencies:
-    aproba "^1.1.1"
-    copy-concurrently "^1.0.0"
-    fs-write-stream-atomic "^1.0.8"
-    mkdirp "^0.5.1"
-    rimraf "^2.5.4"
-    run-queue "^1.0.3"
-
 ms@2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8";
   integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
-ms@2.1.1:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a";
-  integrity 
sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
 ms@^2.1.1, ms@^2.1.2:
   version "2.1.2"
   resolved 
"https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009";
   integrity 
sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-mute-stdout@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331";
-  integrity 
sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==
-
 mute-stream@0.0.8:
   version "0.0.8"
   resolved 
"https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d";
   integrity 
sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
-nan@^2.12.1:
-  version "2.14.0"
-  resolved 
"https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c";
-  integrity 
sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
-
-nanomatch@^1.2.9:
-  version "1.2.13"
-  resolved 
"https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119";
-  integrity 
sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
-  dependencies:
-    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"
-
-needle@^2.2.1:
-  version "2.4.0"
-  resolved 
"https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c";
-  integrity 
sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
-  dependencies:
-    debug "^3.2.6"
-    iconv-lite "^0.4.4"
-    sax "^1.2.4"
-
-negotiator@0.6.2:
-  version "0.6.2"
-  resolved 
"https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb";
-  integrity 
sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved 
"https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
+  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
+neo-async@^2.6.0:
   version "2.6.1"
   resolved 
"https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c";
   integrity 
sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
 
-nested-error-stacks@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61";
-  integrity 
sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==
-
-next-tick@~1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c";
-  integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-
 nice-try@^1.0.4:
   version "1.0.5"
   resolved 
"https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366";
   integrity 
sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
-node-libs-browser@^2.2.1:
-  version "2.2.1"
-  resolved 
"https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425";
-  integrity 
sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
-  dependencies:
-    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"
-
-node-pre-gyp@^0.12.0:
-  version "0.12.0"
-  resolved 
"https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149";
-  integrity 
sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
-  dependencies:
-    detect-libc "^1.0.2"
-    mkdirp "^0.5.1"
-    needle "^2.2.1"
-    nopt "^4.0.1"
-    npm-packlist "^1.1.6"
-    npmlog "^4.0.2"
-    rc "^1.2.7"
-    rimraf "^2.6.1"
-    semver "^5.3.0"
-    tar "^4"
-
-nopt@^4.0.1:
-  version "4.0.1"
-  resolved 
"https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d";
-  integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
+node-preload@^0.2.1:
+  version "0.2.1"
+  resolved 
"https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301";
+  integrity 
sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==
+  dependencies:
+    process-on-spawn "^1.0.0"
+
+nomnom@1.8.1:
+  version "1.8.1"
+  resolved 
"https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7";
+  integrity sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=
   dependencies:
-    abbrev "1"
-    osenv "^0.1.4"
+    chalk "~0.4.0"
+    underscore "~1.6.0"
 
 normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
@@ -4423,13 +2631,6 @@ normalize-package-data@^2.3.2, 
normalize-package-data@^2.5.0:
     semver "2 || 3 || 4 || 5"
     validate-npm-package-license "^3.0.1"
 
-normalize-path@^2.1.1:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
-  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
-  dependencies:
-    remove-trailing-separator "^1.0.1"
-
 normalize-path@^3.0.0, normalize-path@~3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65";
@@ -4440,106 +2641,54 @@ normalize-url@^4.1.0:
   resolved 
"https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129";
   integrity 
sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
 
-now-and-later@^2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c";
-  integrity 
sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
-  dependencies:
-    once "^1.3.2"
-
-npm-bundled@^1.0.1:
-  version "1.0.6"
-  resolved 
"https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd";
-  integrity 
sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
-
-npm-packlist@^1.1.6:
-  version "1.4.6"
-  resolved 
"https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4";
-  integrity 
sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==
-  dependencies:
-    ignore-walk "^3.0.1"
-    npm-bundled "^1.0.1"
-
-npm-run-path@^2.0.0:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
-  integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
-  dependencies:
-    path-key "^2.0.0"
-
-npmlog@^4.0.2:
-  version "4.1.2"
-  resolved 
"https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b";
-  integrity 
sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+nyc@^15.0.1:
+  version "15.0.1"
+  resolved 
"https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d";
+  integrity 
sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==
   dependencies:
-    are-we-there-yet "~1.1.2"
-    console-control-strings "~1.1.0"
-    gauge "~2.7.3"
-    set-blocking "~2.0.0"
-
-number-is-nan@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d";
-  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
-nyc@^14.1.1:
-  version "14.1.1"
-  resolved 
"https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb";
-  integrity 
sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==
-  dependencies:
-    archy "^1.0.0"
-    caching-transform "^3.0.2"
-    convert-source-map "^1.6.0"
-    cp-file "^6.2.0"
-    find-cache-dir "^2.1.0"
-    find-up "^3.0.0"
-    foreground-child "^1.5.6"
-    glob "^7.1.3"
-    istanbul-lib-coverage "^2.0.5"
-    istanbul-lib-hook "^2.0.7"
-    istanbul-lib-instrument "^3.3.0"
-    istanbul-lib-report "^2.0.8"
-    istanbul-lib-source-maps "^3.0.6"
-    istanbul-reports "^2.2.4"
-    js-yaml "^3.13.1"
-    make-dir "^2.1.0"
-    merge-source-map "^1.1.0"
-    resolve-from "^4.0.0"
-    rimraf "^2.6.3"
+    "@istanbuljs/load-nyc-config" "^1.0.0"
+    "@istanbuljs/schema" "^0.1.2"
+    caching-transform "^4.0.0"
+    convert-source-map "^1.7.0"
+    decamelize "^1.2.0"
+    find-cache-dir "^3.2.0"
+    find-up "^4.1.0"
+    foreground-child "^2.0.0"
+    glob "^7.1.6"
+    istanbul-lib-coverage "^3.0.0"
+    istanbul-lib-hook "^3.0.0"
+    istanbul-lib-instrument "^4.0.0"
+    istanbul-lib-processinfo "^2.0.2"
+    istanbul-lib-report "^3.0.0"
+    istanbul-lib-source-maps "^4.0.0"
+    istanbul-reports "^3.0.2"
+    make-dir "^3.0.0"
+    node-preload "^0.2.1"
+    p-map "^3.0.0"
+    process-on-spawn "^1.0.0"
+    resolve-from "^5.0.0"
+    rimraf "^3.0.0"
     signal-exit "^3.0.2"
-    spawn-wrap "^1.4.2"
-    test-exclude "^5.2.3"
-    uuid "^3.3.2"
-    yargs "^13.2.2"
-    yargs-parser "^13.0.0"
+    spawn-wrap "^2.0.0"
+    test-exclude "^6.0.0"
+    yargs "^15.0.2"
 
-object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.1.1:
   version "4.1.1"
   resolved 
"https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863";
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
-object-copy@^0.1.0:
-  version "0.1.0"
-  resolved 
"https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c";
-  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
-  dependencies:
-    copy-descriptor "^0.1.0"
-    define-property "^0.2.5"
-    kind-of "^3.0.3"
+object-inspect@^1.7.0:
+  version "1.7.0"
+  resolved 
"https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67";
+  integrity 
sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
 
-object-keys@^1.0.11, object-keys@^1.0.12:
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
   version "1.1.1"
   resolved 
"https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e";
   integrity 
sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 
-object-visit@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb";
-  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
-  dependencies:
-    isobject "^3.0.0"
-
-object.assign@^4.0.4, object.assign@^4.1.0:
+object.assign@^4.1.0:
   version "4.1.0"
   resolved 
"https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da";
   integrity 
sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
@@ -4549,47 +2698,37 @@ object.assign@^4.0.4, object.assign@^4.1.0:
     has-symbols "^1.0.0"
     object-keys "^1.0.11"
 
-object.defaults@^1.0.0, object.defaults@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf";
-  integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
-  dependencies:
-    array-each "^1.0.1"
-    array-slice "^1.0.0"
-    for-own "^1.0.0"
-    isobject "^3.0.0"
-
-object.map@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37";
-  integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
-  dependencies:
-    for-own "^1.0.0"
-    make-iterator "^1.0.0"
-
-object.pick@^1.2.0, object.pick@^1.3.0:
-  version "1.3.0"
-  resolved 
"https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
-  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+object.entries@^1.1.1:
+  version "1.1.1"
+  resolved 
"https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b";
+  integrity 
sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
   dependencies:
-    isobject "^3.0.1"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
 
-object.reduce@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad";
-  integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=
+object.fromentries@^2.0.2:
+  version "2.0.2"
+  resolved 
"https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9";
+  integrity 
sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
   dependencies:
-    for-own "^1.0.0"
-    make-iterator "^1.0.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
 
-on-finished@~2.3.0:
-  version "2.3.0"
-  resolved 
"https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947";
-  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+object.values@^1.1.0, object.values@^1.1.1:
+  version "1.1.1"
+  resolved 
"https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e";
+  integrity 
sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
   dependencies:
-    ee-first "1.1.1"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
 
-once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
   version "1.4.0"
   resolved 
"https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1";
   integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -4603,18 +2742,17 @@ onetime@^5.1.0:
   dependencies:
     mimic-fn "^2.1.0"
 
-opener@^1.5.1:
-  version "1.5.1"
-  resolved 
"https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed";
-  integrity 
sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
-
-optimist@^0.6.1:
-  version "0.6.1"
-  resolved 
"https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686";
-  integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
+optionator@^0.8.3:
+  version "0.8.3"
+  resolved 
"https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495";
+  integrity 
sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
   dependencies:
-    minimist "~0.0.1"
-    wordwrap "~0.0.2"
+    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@^4.0.3:
   version "4.0.3"
@@ -4630,71 +2768,22 @@ ora@^4.0.3:
     strip-ansi "^6.0.0"
     wcwidth "^1.0.1"
 
-ordered-read-streams@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e";
-  integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
-  dependencies:
-    readable-stream "^2.0.1"
-
-os-browserify@^0.3.0:
-  version "0.3.0"
-  resolved 
"https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
-  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
-
-os-homedir@^1.0.0, os-homedir@^1.0.1:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3";
-  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-locale@^1.4.0:
-  version "1.4.0"
-  resolved 
"https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9";
-  integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
-  dependencies:
-    lcid "^1.0.0"
-
-os-locale@^3.1.0:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a";
-  integrity 
sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
-  dependencies:
-    execa "^1.0.0"
-    lcid "^2.0.0"
-    mem "^4.0.0"
-
-os-tmpdir@^1.0.0:
+os-tmpdir@~1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274";
   integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
 
-osenv@^0.1.4:
-  version "0.1.5"
-  resolved 
"https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410";
-  integrity 
sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.0"
-
 p-cancelable@^1.0.0:
   version "1.1.0"
   resolved 
"https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc";
   integrity 
sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
 
-p-defer@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c";
-  integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
-p-finally@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae";
-  integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
-
-p-is-promise@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e";
-  integrity 
sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved 
"https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
+  integrity 
sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+  dependencies:
+    p-try "^1.0.0"
 
 p-limit@^2.0.0, p-limit@^2.2.0:
   version "2.2.1"
@@ -4703,8 +2792,15 @@ p-limit@^2.0.0, p-limit@^2.2.0:
   dependencies:
     p-try "^2.0.0"
 
-p-locate@^3.0.0:
-  version "3.0.0"
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43";
+  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+  version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4";
   integrity 
sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
   dependencies:
@@ -4731,18 +2827,23 @@ p-map@^4.0.0:
   dependencies:
     aggregate-error "^3.0.0"
 
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
+  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
 p-try@^2.0.0:
   version "2.2.0"
   resolved 
"https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6";
   integrity 
sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
-package-hash@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e";
-  integrity 
sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==
+package-hash@^4.0.0:
+  version "4.0.0"
+  resolved 
"https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506";
+  integrity 
sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==
   dependencies:
     graceful-fs "^4.1.15"
-    hasha "^3.0.0"
+    hasha "^5.0.0"
     lodash.flattendeep "^4.4.0"
     release-zalgo "^1.0.0"
 
@@ -4756,40 +2857,12 @@ package-json@^6.3.0:
     registry-url "^5.0.0"
     semver "^6.2.0"
 
-pako@~1.0.5:
-  version "1.0.10"
-  resolved 
"https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732";
-  integrity 
sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
-
-parallel-transform@^1.1.0:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc";
-  integrity 
sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
-  dependencies:
-    cyclist "^1.0.1"
-    inherits "^2.0.3"
-    readable-stream "^2.1.5"
-
-parse-asn1@^5.0.0:
-  version "5.1.5"
-  resolved 
"https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e";
-  integrity 
sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
-  dependencies:
-    asn1.js "^4.0.0"
-    browserify-aes "^1.0.0"
-    create-hash "^1.1.0"
-    evp_bytestokey "^1.0.0"
-    pbkdf2 "^3.0.3"
-    safe-buffer "^5.1.1"
-
-parse-filepath@^1.0.1:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891";
-  integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved 
"https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2";
+  integrity 
sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
   dependencies:
-    is-absolute "^1.0.0"
-    map-cache "^0.2.0"
-    path-root "^0.1.1"
+    callsites "^3.0.0"
 
 parse-json@^2.2.0:
   version "2.2.0"
@@ -4821,43 +2894,6 @@ parse-ms@^2.1.0:
   resolved 
"https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d";
   integrity 
sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==
 
-parse-node-version@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b";
-  integrity 
sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
-
-parse-passwd@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6";
-  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
-
-parseurl@~1.3.3:
-  version "1.3.3"
-  resolved 
"https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4";
-  integrity 
sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
-
-pascalcase@^0.1.1:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14";
-  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
-
-path-browserify@0.0.1:
-  version "0.0.1"
-  resolved 
"https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a";
-  integrity 
sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
-
-path-dirname@^1.0.0:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0";
-  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
-
-path-exists@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
-  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
-  dependencies:
-    pinkie-promise "^2.0.0"
-
 path-exists@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
@@ -4873,65 +2909,33 @@ path-is-absolute@^1.0.0:
   resolved 
"https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-key@^2.0.0, path-key@^2.0.1:
+path-key@^2.0.1:
   version "2.0.1"
   resolved 
"https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40";
   integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved 
"https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375";
+  integrity 
sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
 path-parse@^1.0.6:
   version "1.0.6"
   resolved 
"https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c";
   integrity 
sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
 
-path-root-regex@^0.1.0:
-  version "0.1.2"
-  resolved 
"https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d";
-  integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
-
-path-root@^0.1.1:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7";
-  integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
-  dependencies:
-    path-root-regex "^0.1.0"
-
-path-to-regexp@0.1.7:
-  version "0.1.7"
-  resolved 
"https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c";
-  integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-
-path-type@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441";
-  integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73";
+  integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
   dependencies:
-    graceful-fs "^4.1.2"
     pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-path-type@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f";
-  integrity 
sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
-  dependencies:
-    pify "^3.0.0"
 
 path-type@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b";
   integrity 
sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
-pbkdf2@^3.0.3:
-  version "3.0.17"
-  resolved 
"https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6";
-  integrity 
sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
-  dependencies:
-    create-hash "^1.1.2"
-    create-hmac "^1.1.4"
-    ripemd160 "^2.0.1"
-    safe-buffer "^5.0.1"
-    sha.js "^2.4.8"
-
 picomatch@^2.0.4, picomatch@^2.0.5:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5";
@@ -4947,28 +2951,11 @@ pify@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c";
   integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 
-pify@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
-  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
 pify@^4.0.1:
   version "4.0.1"
   resolved 
"https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231";
   integrity 
sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
 
-pinkie-promise@^2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa";
-  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
-  dependencies:
-    pinkie "^2.0.0"
-
-pinkie@^2.0.0:
-  version "2.0.4"
-  resolved 
"https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870";
-  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
 pkg-conf@^3.1.0:
   version "3.1.0"
   resolved 
"https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae";
@@ -4977,12 +2964,12 @@ pkg-conf@^3.1.0:
     find-up "^3.0.0"
     load-json-file "^5.2.0"
 
-pkg-dir@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3";
-  integrity 
sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b";
+  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
   dependencies:
-    find-up "^3.0.0"
+    find-up "^2.1.0"
 
 pkg-dir@^4.1.0, pkg-dir@^4.2.0:
   version "4.2.0"
@@ -4991,16 +2978,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
   dependencies:
     find-up "^4.0.0"
 
-plugin-error@^1.0.0, plugin-error@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c";
-  integrity 
sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
-  dependencies:
-    ansi-colors "^1.0.1"
-    arr-diff "^4.0.0"
-    arr-union "^3.1.0"
-    extend-shallow "^3.0.2"
-
 plur@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84";
@@ -5008,14 +2985,13 @@ plur@^4.0.0:
   dependencies:
     irregular-plurals "^3.2.0"
 
-po2json@^1.0.0-alpha:
-  version "1.0.0-alpha"
-  resolved 
"https://registry.yarnpkg.com/po2json/-/po2json-1.0.0-alpha.tgz#75c2f9873b677eb4cdbd35f20d2d029da39c1ec5";
-  integrity 
sha512-DsP/L4JsMB/gTEpXm9B1I+S1W0z0wNXu4Ky47MUlfS3ruwUZT1nUm+FvWt+ZMehFTh1EcXAhx6oljw8Ly4qTaA==
+po2json@^0.4.5:
+  version "0.4.5"
+  resolved 
"https://registry.yarnpkg.com/po2json/-/po2json-0.4.5.tgz#47bb2952da32d58a1be2f256a598eebc0b745118";
+  integrity sha1-R7spUtoy1Yob4vJWpZjuvAt0URg=
   dependencies:
-    commander "^2.18.0"
-    gettext-parser "2.0.0"
-    gettext-to-messageformat "^0.3.0"
+    gettext-parser "1.1.0"
+    nomnom "1.8.1"
 
 pogen@^0.0.5:
   version "0.0.5"
@@ -5024,25 +3000,20 @@ pogen@^0.0.5:
   dependencies:
     "@types/node" "^11.12.0"
 
-posix-character-classes@^0.1.0:
-  version "0.1.1"
-  resolved 
"https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
-  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved 
"https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54";
+  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
 prepend-http@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897";
   integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
 
-prettier@^2.0.3:
-  version "2.0.3"
-  resolved 
"https://registry.yarnpkg.com/prettier/-/prettier-2.0.3.tgz#9a06f0e94a51420e78b6925568b5bec72afe41ea";
-  integrity 
sha512-5qpBDBHO9fpE0zruKiTZm8Gxmz7kknO+WlQR/ivV+RMwgDw/WjOgmxLDn66MPrxq/WZPx/EgEZzh87xJO5E6Fw==
-
-pretty-hrtime@^1.0.0:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1";
-  integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+prettier@^2.0.4:
+  version "2.0.4"
+  resolved 
"https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef";
+  integrity 
sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==
 
 pretty-ms@^6.0.1:
   version "6.0.1"
@@ -5051,34 +3022,19 @@ pretty-ms@^6.0.1:
   dependencies:
     parse-ms "^2.1.0"
 
-process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2";
-  integrity 
sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-process@^0.11.10:
-  version "0.11.10"
-  resolved 
"https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182";
-  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+process-on-spawn@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93";
+  integrity 
sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
+  dependencies:
+    fromentries "^1.2.0"
 
-progress@^2.0.3:
+progress@^2.0.0, progress@^2.0.3:
   version "2.0.3"
   resolved 
"https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8";
   integrity 
sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
-promise-inflight@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3";
-  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-
-promise@^8.0.1:
-  version "8.0.3"
-  resolved 
"https://registry.yarnpkg.com/promise/-/promise-8.0.3.tgz#f592e099c6cddc000d538ee7283bb190452b0bf6";
-  integrity 
sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==
-  dependencies:
-    asap "~2.0.6"
-
-prop-types@^15.6.2:
+prop-types@^15.6.2, prop-types@^15.7.2:
   version "15.7.2"
   resolved 
"https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5";
   integrity 
sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -5087,44 +3043,6 @@ prop-types@^15.6.2:
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
-proxy-addr@~2.0.5:
-  version "2.0.5"
-  resolved 
"https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34";
-  integrity 
sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
-  dependencies:
-    forwarded "~0.1.2"
-    ipaddr.js "1.9.0"
-
-prr@~1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476";
-  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-
-pseudomap@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3";
-  integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
-
-public-encrypt@^4.0.0:
-  version "4.0.3"
-  resolved 
"https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0";
-  integrity 
sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
-  dependencies:
-    bn.js "^4.1.0"
-    browserify-rsa "^4.0.0"
-    create-hash "^1.1.0"
-    parse-asn1 "^5.0.0"
-    randombytes "^2.0.1"
-    safe-buffer "^5.1.2"
-
-pump@^2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909";
-  integrity 
sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
 pump@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64";
@@ -5133,25 +3051,6 @@ pump@^3.0.0:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
-pumpify@^1.3.3, pumpify@^1.3.5:
-  version "1.5.1"
-  resolved 
"https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce";
-  integrity 
sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
-  dependencies:
-    duplexify "^3.6.0"
-    inherits "^2.0.3"
-    pump "^2.0.0"
-
-punycode@1.3.2:
-  version "1.3.2"
-  resolved 
"https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d";
-  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
-punycode@^1.2.4:
-  version "1.4.1"
-  resolved 
"https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
-  integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
 punycode@^2.1.0:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
@@ -5169,52 +3068,7 @@ qrcode-generator@^1.4.3:
   resolved 
"https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7";
   integrity 
sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==
 
-qs@6.7.0:
-  version "6.7.0"
-  resolved 
"https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc";
-  integrity 
sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-
-querystring-es3@^0.2.0:
-  version "0.2.1"
-  resolved 
"https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73";
-  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
-
-querystring@0.2.0:
-  version "0.2.0"
-  resolved 
"https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620";
-  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a";
-  integrity 
sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
-  dependencies:
-    safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
-  version "1.0.4"
-  resolved 
"https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458";
-  integrity 
sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
-  dependencies:
-    randombytes "^2.0.5"
-    safe-buffer "^5.1.0"
-
-range-parser@~1.2.1:
-  version "1.2.1"
-  resolved 
"https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031";
-  integrity 
sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-raw-body@2.4.0:
-  version "2.4.0"
-  resolved 
"https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332";
-  integrity 
sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
-  dependencies:
-    bytes "3.1.0"
-    http-errors "1.7.2"
-    iconv-lite "0.4.24"
-    unpipe "1.0.0"
-
-rc@^1.2.7, rc@^1.2.8:
+rc@^1.2.8:
   version "1.2.8"
   resolved 
"https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
   integrity 
sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -5224,63 +3078,46 @@ rc@^1.2.7, rc@^1.2.8:
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
-react-dom@^16.8.5:
-  version "16.12.0"
-  resolved 
"https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11";
-  integrity 
sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==
+react-dom@^16.13.1:
+  version "16.13.1"
+  resolved 
"https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f";
+  integrity 
sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
-    scheduler "^0.18.0"
+    scheduler "^0.19.1"
 
 react-is@^16.8.1:
   version "16.12.0"
   resolved 
"https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c";
   integrity 
sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
 
-react@^16.8.5:
-  version "16.12.0"
-  resolved 
"https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83";
-  integrity 
sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==
+react@^16.13.1:
+  version "16.13.1"
+  resolved 
"https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e";
+  integrity 
sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
 
-read-pkg-up@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02";
-  integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
-  dependencies:
-    find-up "^1.0.0"
-    read-pkg "^1.0.0"
-
-read-pkg-up@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978";
-  integrity 
sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==
-  dependencies:
-    find-up "^3.0.0"
-    read-pkg "^3.0.0"
-
-read-pkg@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
-  integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be";
+  integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
   dependencies:
-    load-json-file "^1.0.0"
-    normalize-package-data "^2.3.2"
-    path-type "^1.0.0"
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
 
-read-pkg@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389";
-  integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
+  integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
   dependencies:
-    load-json-file "^4.0.0"
+    load-json-file "^2.0.0"
     normalize-package-data "^2.3.2"
-    path-type "^3.0.0"
+    path-type "^2.0.0"
 
 read-pkg@^5.2.0:
   version "5.2.0"
@@ -5292,37 +3129,6 @@ read-pkg@^5.2.0:
     parse-json "^5.0.0"
     type-fest "^0.6.0"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, 
readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, 
readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, 
readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
-  version "2.3.6"
-  resolved 
"https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
-  integrity 
sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.3"
-    isarray "~1.0.0"
-    process-nextick-args "~2.0.0"
-    safe-buffer "~5.1.1"
-    string_decoder "~1.1.1"
-    util-deprecate "~1.0.1"
-
-"readable-stream@2 || 3", readable-stream@^3.0.1, readable-stream@^3.1.1, 
readable-stream@^3.4.0:
-  version "3.4.0"
-  resolved 
"https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc";
-  integrity 
sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
-  dependencies:
-    inherits "^2.0.3"
-    string_decoder "^1.1.1"
-    util-deprecate "^1.0.1"
-
-readdirp@^2.2.1:
-  version "2.2.1"
-  resolved 
"https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525";
-  integrity 
sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
-  dependencies:
-    graceful-fs "^4.1.11"
-    micromatch "^3.1.10"
-    readable-stream "^2.0.2"
-
 readdirp@~3.3.0:
   version "3.3.0"
   resolved 
"https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17";
@@ -5337,13 +3143,28 @@ rechoir@^0.6.2:
   dependencies:
     resolve "^1.1.6"
 
-regex-not@^1.0.0, regex-not@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
-  integrity 
sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+regenerator-runtime@^0.13.4:
+  version "0.13.5"
+  resolved 
"https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697";
+  integrity 
sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+
+regexp.prototype.flags@^1.3.0:
+  version "1.3.0"
+  resolved 
"https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75";
+  integrity 
sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
   dependencies:
-    extend-shallow "^3.0.2"
-    safe-regex "^1.1.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+
+regexpp@^2.0.1:
+  version "2.0.1"
+  resolved 
"https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f";
+  integrity 
sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
+regexpp@^3.0.0:
+  version "3.1.0"
+  resolved 
"https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2";
+  integrity 
sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
 
 registry-auth-token@^4.0.0:
   version "4.0.0"
@@ -5367,74 +3188,16 @@ release-zalgo@^1.0.0:
   dependencies:
     es6-error "^4.0.1"
 
-remove-bom-buffer@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53";
-  integrity 
sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
-  dependencies:
-    is-buffer "^1.1.5"
-    is-utf8 "^0.2.1"
-
-remove-bom-stream@^1.2.0:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523";
-  integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
-  dependencies:
-    remove-bom-buffer "^3.0.0"
-    safe-buffer "^5.1.0"
-    through2 "^2.0.3"
-
-remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef";
-  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-
-repeat-element@^1.1.2:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
-  integrity 
sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-
-repeat-string@^1.6.1:
-  version "1.6.1"
-  resolved 
"https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637";
-  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-
-replace-ext@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb";
-  integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
-
-replace-homedir@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c";
-  integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=
-  dependencies:
-    homedir-polyfill "^1.0.1"
-    is-absolute "^1.0.0"
-    remove-trailing-separator "^1.1.0"
-
 require-directory@^2.1.1:
   version "2.1.1"
   resolved 
"https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
   integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
 
-require-main-filename@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
-  integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
 require-main-filename@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b";
   integrity 
sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
-resolve-cwd@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a";
-  integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
-  dependencies:
-    resolve-from "^3.0.0"
-
 resolve-cwd@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d";
@@ -5442,19 +3205,6 @@ resolve-cwd@^3.0.0:
   dependencies:
     resolve-from "^5.0.0"
 
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43";
-  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
-  dependencies:
-    expand-tilde "^2.0.0"
-    global-modules "^1.0.0"
-
-resolve-from@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748";
-  integrity sha1-six699nWiBvItuZTM17rywoYh0g=
-
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6";
@@ -5465,19 +3215,7 @@ resolve-from@^5.0.0:
   resolved 
"https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69";
   integrity 
sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
 
-resolve-options@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131";
-  integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
-  dependencies:
-    value-or-function "^3.0.0"
-
-resolve-url@^0.2.1:
-  version "0.2.1"
-  resolved 
"https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a";
-  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-
-resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, 
resolve@^1.4.0:
+resolve@^1.1.6, resolve@^1.10.0:
   version "1.12.0"
   resolved 
"https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6";
   integrity 
sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
@@ -5491,6 +3229,13 @@ resolve@^1.11.0, resolve@^1.11.1:
   dependencies:
     path-parse "^1.0.6"
 
+resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2:
+  version "1.15.1"
+  resolved 
"https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8";
+  integrity 
sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
+  dependencies:
+    path-parse "^1.0.6"
+
 responselike@^1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7";
@@ -5506,20 +3251,15 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
-ret@~0.1.10:
-  version "0.1.15"
-  resolved 
"https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
-  integrity 
sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-
 reusify@^1.0.0:
   version "1.0.4"
   resolved 
"https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76";
   integrity 
sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
-  version "2.7.1"
-  resolved 
"https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec";
-  integrity 
sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+rimraf@2.6.3:
+  version "2.6.3"
+  resolved 
"https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab";
+  integrity 
sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
   dependencies:
     glob "^7.1.3"
 
@@ -5530,14 +3270,6 @@ rimraf@^3.0.0:
   dependencies:
     glob "^7.1.3"
 
-ripemd160@^2.0.0, ripemd160@^2.0.1:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c";
-  integrity 
sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
-  dependencies:
-    hash-base "^3.0.0"
-    inherits "^2.0.1"
-
 rollup-plugin-commonjs@^10.1.0:
   version "10.1.0"
   resolved 
"https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb";
@@ -5560,86 +3292,73 @@ rollup-plugin-node-resolve@^5.2.0:
     resolve "^1.11.1"
     rollup-pluginutils "^2.8.1"
 
-rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.8.1:
+rollup-plugin-terser@^5.3.0:
+  version "5.3.0"
+  resolved 
"https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz#9c0dd33d5771df9630cd027d6a2559187f65885e";
+  integrity 
sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==
+  dependencies:
+    "@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"
+
+rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2:
   version "2.8.2"
   resolved 
"https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e";
   integrity 
sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
   dependencies:
     estree-walker "^0.6.1"
 
-rollup@^1.27.8:
-  version "1.27.8"
-  resolved 
"https://registry.yarnpkg.com/rollup/-/rollup-1.27.8.tgz#94288a957af9f4c2380b73a17494d87705997d0f";
-  integrity 
sha512-EVoEV5rAWl+5clnGznt1KY8PeVkzVQh/R0d2s3gHEkN7gfoyC4JmvIVuCtPbYE8NM5Ep/g+nAmvKXBjzaqTsHA==
+rollup@^2.3.3:
+  version "2.3.3"
+  resolved 
"https://registry.yarnpkg.com/rollup/-/rollup-2.3.3.tgz#5982df700d7aae8907075ba68122bb57d98e9cd0";
+  integrity 
sha512-uJ9VNWk80mb4wDCSfd1AyHoSc9TrWbkZtnO6wbsMTp9muSWkT26Dvc99MX1yGCOTvUN1Skw/KpFzKdUDuZKTXA==
+  optionalDependencies:
+    fsevents "~2.1.2"
+
+run-async@^2.4.0:
+  version "2.4.0"
+  resolved 
"https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8";
+  integrity 
sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==
   dependencies:
-    "@types/estree" "*"
-    "@types/node" "*"
-    acorn "^7.1.0"
+    is-promise "^2.1.0"
 
 run-parallel@^1.1.9:
   version "1.1.9"
   resolved 
"https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679";
   integrity 
sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
 
-run-queue@^1.0.0, run-queue@^1.0.3:
-  version "1.0.3"
-  resolved 
"https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47";
-  integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+rxjs@^6.5.3:
+  version "6.5.5"
+  resolved 
"https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec";
+  integrity 
sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
   dependencies:
-    aproba "^1.1.1"
-
-safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
-  version "5.1.2"
-  resolved 
"https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d";
-  integrity 
sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+    tslib "^1.9.0"
 
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, 
safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1:
   version "5.2.0"
   resolved 
"https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519";
   integrity 
sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
 
-safe-regex@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e";
-  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
-  dependencies:
-    ret "~0.1.10"
+safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved 
"https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d";
+  integrity 
sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
 "safer-buffer@>= 2.1.2 < 3":
   version "2.1.2"
   resolved 
"https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a";
   integrity 
sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
-sax@^1.2.4:
-  version "1.2.4"
-  resolved 
"https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9";
-  integrity 
sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-scheduler@^0.18.0:
-  version "0.18.0"
-  resolved 
"https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4";
-  integrity 
sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==
+scheduler@^0.19.1:
+  version "0.19.1"
+  resolved 
"https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196";
+  integrity 
sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
 
-schema-utils@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770";
-  integrity 
sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
-  dependencies:
-    ajv "^6.1.0"
-    ajv-errors "^1.0.0"
-    ajv-keywords "^3.1.0"
-
-schema-utils@^2.5.0:
-  version "2.5.0"
-  resolved 
"https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.5.0.tgz#8f254f618d402cc80257486213c8970edfd7c22f";
-  integrity 
sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==
-  dependencies:
-    ajv "^6.10.2"
-    ajv-keywords "^3.4.1"
-
 semver-diff@^3.1.1:
   version "3.1.1"
   resolved 
"https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b";
@@ -5647,100 +3366,31 @@ semver-diff@^3.1.1:
   dependencies:
     semver "^6.3.0"
 
-semver-greatest-satisfied-range@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b";
-  integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els=
-  dependencies:
-    sver-compat "^1.5.0"
-
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, 
semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
   version "5.7.1"
   resolved 
"https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7";
   integrity 
sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
-semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
+semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
   version "6.3.0"
   resolved 
"https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d";
   integrity 
sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-send@0.17.1:
-  version "0.17.1"
-  resolved 
"https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8";
-  integrity 
sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
-  dependencies:
-    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"
-
 serialize-error@^2.1.0:
   version "2.1.0"
   resolved 
"https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a";
   integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=
 
-serialize-javascript@^1.7.0:
-  version "1.9.1"
-  resolved 
"https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb";
-  integrity 
sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
-
-serialize-javascript@^2.1.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.0.tgz#9310276819efd0eb128258bb341957f6eb2fc570";
-  integrity 
sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ==
-
-serve-static@1.14.1:
-  version "1.14.1"
-  resolved 
"https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9";
-  integrity 
sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
-  dependencies:
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    parseurl "~1.3.3"
-    send "0.17.1"
+serialize-javascript@^2.1.2:
+  version "2.1.2"
+  resolved 
"https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61";
+  integrity 
sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
 
-set-blocking@^2.0.0, set-blocking@~2.0.0:
+set-blocking@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7";
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
-set-value@^2.0.0, set-value@^2.0.1:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b";
-  integrity 
sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.3"
-    split-string "^3.0.1"
-
-setimmediate@^1.0.4:
-  version "1.0.5"
-  resolved 
"https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285";
-  integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
-
-setprototypeof@1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683";
-  integrity 
sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
-sha.js@^2.4.0, sha.js@^2.4.8:
-  version "2.4.11"
-  resolved 
"https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
-  integrity 
sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
-  dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
-
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved 
"https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea";
@@ -5748,11 +3398,23 @@ shebang-command@^1.2.0:
   dependencies:
     shebang-regex "^1.0.0"
 
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea";
+  integrity 
sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
 shebang-regex@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3";
   integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
 
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved 
"https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172";
+  integrity 
sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
 shelljs@^0.8.3:
   version "0.8.3"
   resolved 
"https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097";
@@ -5762,7 +3424,15 @@ shelljs@^0.8.3:
     interpret "^1.0.0"
     rechoir "^0.6.2"
 
-signal-exit@^3.0.0, signal-exit@^3.0.2:
+side-channel@^1.0.2:
+  version "1.0.2"
+  resolved 
"https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947";
+  integrity 
sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==
+  dependencies:
+    es-abstract "^1.17.0-next.1"
+    object-inspect "^1.7.0"
+
+signal-exit@^3.0.2:
   version "3.0.2"
   resolved 
"https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d";
   integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
@@ -5772,6 +3442,15 @@ slash@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634";
   integrity 
sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slice-ansi@^2.1.0:
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636";
+  integrity 
sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+  dependencies:
+    ansi-styles "^3.2.0"
+    astral-regex "^1.0.0"
+    is-fullwidth-code-point "^2.0.0"
+
 slice-ansi@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787";
@@ -5781,53 +3460,7 @@ slice-ansi@^3.0.0:
     astral-regex "^2.0.0"
     is-fullwidth-code-point "^3.0.0"
 
-snapdragon-node@^2.0.1:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b";
-  integrity 
sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
-  dependencies:
-    define-property "^1.0.0"
-    isobject "^3.0.0"
-    snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
-  version "3.0.1"
-  resolved 
"https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2";
-  integrity 
sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
-  dependencies:
-    kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
-  version "0.8.2"
-  resolved 
"https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d";
-  integrity 
sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
-  dependencies:
-    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"
-
-source-list-map@^2.0.0:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34";
-  integrity 
sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
-source-map-resolve@^0.5.0:
-  version "0.5.2"
-  resolved 
"https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259";
-  integrity 
sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
-  dependencies:
-    atob "^2.1.1"
-    decode-uri-component "^0.2.0"
-    resolve-url "^0.2.1"
-    source-map-url "^0.4.0"
-    urix "^0.1.0"
-
-source-map-support@^0.5.12, source-map-support@^0.5.16, 
source-map-support@^0.5.3, source-map-support@~0.5.12:
+source-map-support@^0.5.12, source-map-support@^0.5.16, 
source-map-support@~0.5.12:
   version "0.5.16"
   resolved 
"https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042";
   integrity 
sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
@@ -5835,12 +3468,7 @@ source-map-support@^0.5.12, source-map-support@^0.5.16, 
source-map-support@^0.5.
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map-url@^0.4.0:
-  version "0.4.0"
-  resolved 
"https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3";
-  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-
-source-map@^0.5.0, source-map@^0.5.6:
+source-map@^0.5.0:
   version "0.5.7"
   resolved 
"https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -5855,22 +3483,17 @@ sourcemap-codec@^1.4.4:
   resolved 
"https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9";
   integrity 
sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==
 
-sparkles@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c";
-  integrity 
sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
-
-spawn-wrap@^1.4.2:
-  version "1.4.3"
-  resolved 
"https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848";
-  integrity 
sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==
+spawn-wrap@^2.0.0:
+  version "2.0.0"
+  resolved 
"https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e";
+  integrity 
sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==
   dependencies:
-    foreground-child "^1.5.6"
-    mkdirp "^0.5.0"
-    os-homedir "^1.0.1"
-    rimraf "^2.6.2"
+    foreground-child "^2.0.0"
+    is-windows "^1.0.2"
+    make-dir "^3.0.0"
+    rimraf "^3.0.0"
     signal-exit "^3.0.2"
-    which "^1.3.0"
+    which "^2.0.1"
 
 spdx-correct@^3.0.0:
   version "3.1.0"
@@ -5898,38 +3521,11 @@ spdx-license-ids@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654";
   integrity 
sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
 
-split-string@^3.0.1, split-string@^3.0.2:
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2";
-  integrity 
sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
-  dependencies:
-    extend-shallow "^3.0.0"
-
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved 
"https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c";
   integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
 
-ssri@^6.0.1:
-  version "6.0.1"
-  resolved 
"https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8";
-  integrity 
sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
-  dependencies:
-    figgy-pudding "^3.5.1"
-
-ssri@^7.0.0:
-  version "7.1.0"
-  resolved 
"https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d";
-  integrity 
sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==
-  dependencies:
-    figgy-pudding "^3.5.1"
-    minipass "^3.1.1"
-
-stack-trace@0.0.10:
-  version "0.0.10"
-  resolved 
"https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
-  integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
-
 stack-utils@^2.0.1:
   version "2.0.1"
   resolved 
"https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.1.tgz#3df48345a3b92adc06038f0e95782df61beff742";
@@ -5937,81 +3533,7 @@ stack-utils@^2.0.1:
   dependencies:
     escape-string-regexp "^2.0.0"
 
-static-extend@^0.1.1:
-  version "0.1.2"
-  resolved 
"https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6";
-  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
-  dependencies:
-    define-property "^0.2.5"
-    object-copy "^0.1.0"
-
-"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
-  version "1.5.0"
-  resolved 
"https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c";
-  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-
-stream-browserify@^2.0.1:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b";
-  integrity 
sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
-  dependencies:
-    inherits "~2.0.1"
-    readable-stream "^2.0.2"
-
-stream-each@^1.1.0:
-  version "1.2.3"
-  resolved 
"https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae";
-  integrity 
sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
-  dependencies:
-    end-of-stream "^1.1.0"
-    stream-shift "^1.0.0"
-
-stream-exhaust@^1.0.1:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d";
-  integrity 
sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==
-
-stream-http@^2.7.2:
-  version "2.8.3"
-  resolved 
"https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc";
-  integrity 
sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
-  dependencies:
-    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@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952";
-  integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
-
-stream-to-array@^2.3.0:
-  version "2.3.0"
-  resolved 
"https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353";
-  integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=
-  dependencies:
-    any-promise "^1.1.0"
-
-string-width@^1.0.1, string-width@^1.0.2:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
-  integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
-  dependencies:
-    code-point-at "^1.0.0"
-    is-fullwidth-code-point "^1.0.0"
-    strip-ansi "^3.0.0"
-
-"string-width@^1.0.2 || 2":
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e";
-  integrity 
sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
-  dependencies:
-    is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^4.0.0"
-
-string-width@^3.0.0, string-width@^3.1.0:
+string-width@^3.0.0:
   version "3.1.0"
   resolved 
"https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961";
   integrity 
sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
@@ -6029,26 +3551,51 @@ string-width@^4.0.0, string-width@^4.1.0, 
string-width@^4.2.0:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.0"
 
-string_decoder@^1.0.0, string_decoder@^1.1.1:
-  version "1.3.0"
-  resolved 
"https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e";
-  integrity 
sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+string.prototype.matchall@^4.0.2:
+  version "4.0.2"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e";
+  integrity 
sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
   dependencies:
-    safe-buffer "~5.2.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0"
+    has-symbols "^1.0.1"
+    internal-slot "^1.0.2"
+    regexp.prototype.flags "^1.3.0"
+    side-channel "^1.0.2"
 
-string_decoder@~1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
-  integrity 
sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+string.prototype.trimend@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373";
+  integrity 
sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==
   dependencies:
-    safe-buffer "~5.1.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
-  version "3.0.1"
-  resolved 
"https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
-  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+string.prototype.trimleft@^2.1.1:
+  version "2.1.2"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc";
+  integrity 
sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+    string.prototype.trimstart "^1.0.0"
+
+string.prototype.trimright@^2.1.1:
+  version "2.1.2"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3";
+  integrity 
sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
   dependencies:
-    ansi-regex "^2.0.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+    string.prototype.trimend "^1.0.0"
+
+string.prototype.trimstart@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2";
+  integrity 
sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
 strip-ansi@^4.0.0:
   version "4.0.0"
@@ -6057,7 +3604,7 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   version "5.2.0"
   resolved 
"https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae";
   integrity 
sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -6071,22 +3618,25 @@ strip-ansi@^6.0.0:
   dependencies:
     ansi-regex "^5.0.0"
 
-strip-bom@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e";
-  integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
-  dependencies:
-    is-utf8 "^0.2.0"
+strip-ansi@~0.1.0:
+  version "0.1.1"
+  resolved 
"https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991";
+  integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=
 
 strip-bom@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
   integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
-strip-eof@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf";
-  integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+strip-bom@^4.0.0:
+  version "4.0.0"
+  resolved 
"https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878";
+  integrity 
sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-json-comments@^3.0.1:
+  version "3.1.0"
+  resolved 
"https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180";
+  integrity 
sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
 
 strip-json-comments@~2.0.1:
   version "2.0.1"
@@ -6109,13 +3659,6 @@ supertap@^1.0.0:
     serialize-error "^2.1.0"
     strip-ansi "^4.0.0"
 
-supports-color@6.1.0, supports-color@^6.1.0:
-  version "6.1.0"
-  resolved 
"https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3";
-  integrity 
sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
-  dependencies:
-    has-flag "^3.0.0"
-
 supports-color@^5.3.0:
   version "5.5.0"
   resolved 
"https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f";
@@ -6123,6 +3666,13 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@^6.1.0:
+  version "6.1.0"
+  resolved 
"https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3";
+  integrity 
sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+  dependencies:
+    has-flag "^3.0.0"
+
 supports-color@^7.1.0:
   version "7.1.0"
   resolved 
"https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1";
@@ -6130,42 +3680,15 @@ supports-color@^7.1.0:
   dependencies:
     has-flag "^4.0.0"
 
-sver-compat@^1.5.0:
-  version "1.5.0"
-  resolved 
"https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8";
-  integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=
+table@^5.2.3:
+  version "5.4.6"
+  resolved 
"https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e";
+  integrity 
sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
   dependencies:
-    es6-iterator "^2.0.1"
-    es6-symbol "^3.1.1"
-
-tapable@^1.0.0, tapable@^1.1.3:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2";
-  integrity 
sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
-
-tar-stream@^2.1.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3";
-  integrity 
sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==
-  dependencies:
-    bl "^3.0.0"
-    end-of-stream "^1.4.1"
-    fs-constants "^1.0.0"
-    inherits "^2.0.3"
-    readable-stream "^3.1.1"
-
-tar@^4:
-  version "4.4.13"
-  resolved 
"https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525";
-  integrity 
sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
-  dependencies:
-    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"
+    ajv "^6.10.2"
+    lodash "^4.17.14"
+    slice-ansi "^2.1.0"
+    string-width "^3.0.0"
 
 temp-dir@^2.0.0:
   version "2.0.0"
@@ -6177,132 +3700,56 @@ term-size@^2.1.0:
   resolved 
"https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753";
   integrity 
sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
 
-terser-webpack-plugin@^1.4.1:
-  version "1.4.1"
-  resolved 
"https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4";
-  integrity 
sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
-  dependencies:
-    cacache "^12.0.2"
-    find-cache-dir "^2.1.0"
-    is-wsl "^1.1.0"
-    schema-utils "^1.0.0"
-    serialize-javascript "^1.7.0"
-    source-map "^0.6.1"
-    terser "^4.1.2"
-    webpack-sources "^1.4.0"
-    worker-farm "^1.7.0"
-
-terser-webpack-plugin@^2.2.1:
-  version "2.2.1"
-  resolved 
"https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz#5569e6c7d8be79e5e43d6da23acc3b6ba77d22bd";
-  integrity 
sha512-jwdauV5Al7zopR6OAYvIIRcxXCSvLjZjr7uZE8l2tIWb/ryrGN48sJftqGf5k9z09tWhajx53ldp0XPI080YnA==
-  dependencies:
-    cacache "^13.0.1"
-    find-cache-dir "^3.0.0"
-    jest-worker "^24.9.0"
-    schema-utils "^2.5.0"
-    serialize-javascript "^2.1.0"
-    source-map "^0.6.1"
-    terser "^4.3.9"
-    webpack-sources "^1.4.3"
-
-terser@^4.1.2, terser@^4.3.9:
-  version "4.4.0"
-  resolved 
"https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3";
-  integrity 
sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==
+terser@^4.6.2:
+  version "4.6.10"
+  resolved 
"https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2";
+  integrity 
sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
     source-map-support "~0.5.12"
 
-test-exclude@^5.2.3:
-  version "5.2.3"
-  resolved 
"https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0";
-  integrity 
sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==
+test-exclude@^6.0.0:
+  version "6.0.0"
+  resolved 
"https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e";
+  integrity 
sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
   dependencies:
-    glob "^7.1.3"
+    "@istanbuljs/schema" "^0.1.2"
+    glob "^7.1.4"
     minimatch "^3.0.4"
-    read-pkg-up "^4.0.0"
-    require-main-filename "^2.0.0"
-
-through2-filter@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254";
-  integrity 
sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
-  dependencies:
-    through2 "~2.0.0"
-    xtend "~4.0.0"
-
-through2@3.0.1, through2@^3.0.1:
-  version "3.0.1"
-  resolved 
"https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a";
-  integrity 
sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
-  dependencies:
-    readable-stream "2 || 3"
 
-through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
-  version "2.0.5"
-  resolved 
"https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd";
-  integrity 
sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
-  dependencies:
-    readable-stream "~2.3.6"
-    xtend "~4.0.1"
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved 
"https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
-time-stamp@^1.0.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3";
-  integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
+through@^2.3.6:
+  version "2.3.8"
+  resolved 
"https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
+  integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
 time-zone@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d";
   integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=
 
-timers-browserify@^2.0.4:
-  version "2.0.11"
-  resolved 
"https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f";
-  integrity 
sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
-  dependencies:
-    setimmediate "^1.0.4"
-
-to-absolute-glob@^2.0.0:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b";
-  integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
+tmp@^0.0.33:
+  version "0.0.33"
+  resolved 
"https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9";
+  integrity 
sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
   dependencies:
-    is-absolute "^1.0.0"
-    is-negated-glob "^1.0.0"
-
-to-arraybuffer@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43";
-  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+    os-tmpdir "~1.0.2"
 
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e";
   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
-to-object-path@^0.3.0:
-  version "0.3.0"
-  resolved 
"https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af";
-  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
-  dependencies:
-    kind-of "^3.0.2"
-
 to-readable-stream@^1.0.0:
   version "1.0.0"
   resolved 
"https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771";
   integrity 
sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
 
-to-regex-range@^2.1.0:
-  version "2.1.1"
-  resolved 
"https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38";
-  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
-  dependencies:
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-
 to-regex-range@^5.0.1:
   version "5.0.1"
   resolved 
"https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4";
@@ -6310,73 +3757,34 @@ to-regex-range@^5.0.1:
   dependencies:
     is-number "^7.0.0"
 
-to-regex@^3.0.1, to-regex@^3.0.2:
-  version "3.0.2"
-  resolved 
"https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
-  integrity 
sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
-  dependencies:
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    regex-not "^1.0.2"
-    safe-regex "^1.1.0"
-
-to-through@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6";
-  integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
-  dependencies:
-    through2 "^2.0.3"
-
-toidentifier@1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553";
-  integrity 
sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-
 trim-off-newlines@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3";
   integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
 
-tryer@^1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8";
-  integrity 
sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0:
+  version "1.11.1"
+  resolved 
"https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35";
+  integrity 
sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
 
-tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
-  version "1.10.0"
-  resolved 
"https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a";
-  integrity 
sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
-
-tslint@^5.19.0:
-  version "5.20.1"
-  resolved 
"https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d";
-  integrity 
sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==
+tsutils@^3.17.1:
+  version "3.17.1"
+  resolved 
"https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759";
+  integrity 
sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    builtin-modules "^1.1.1"
-    chalk "^2.3.0"
-    commander "^2.12.1"
-    diff "^4.0.1"
-    glob "^7.1.1"
-    js-yaml "^3.13.1"
-    minimatch "^3.0.4"
-    mkdirp "^0.5.1"
-    resolve "^1.3.2"
-    semver "^5.3.0"
-    tslib "^1.8.0"
-    tsutils "^2.29.0"
+    tslib "^1.8.1"
 
-tsutils@^2.29.0:
-  version "2.29.0"
-  resolved 
"https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99";
-  integrity 
sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved 
"https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72";
+  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
   dependencies:
-    tslib "^1.8.1"
+    prelude-ls "~1.1.2"
 
-tty-browserify@0.0.0:
-  version "0.0.0"
-  resolved 
"https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6";
-  integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+type-fest@^0.11.0:
+  version "0.11.0"
+  resolved 
"https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1";
+  integrity 
sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
 
 type-fest@^0.3.0:
   version "0.3.1"
@@ -6388,29 +3796,11 @@ type-fest@^0.6.0:
   resolved 
"https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b";
   integrity 
sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
 
-type-fest@^0.8.1:
+type-fest@^0.8.0, type-fest@^0.8.1:
   version "0.8.1"
   resolved 
"https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d";
   integrity 
sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
 
-type-is@~1.6.17, type-is@~1.6.18:
-  version "1.6.18"
-  resolved 
"https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131";
-  integrity 
sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
-  dependencies:
-    media-typer "0.3.0"
-    mime-types "~2.1.24"
-
-type@^1.0.1:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0";
-  integrity 
sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
-
-type@^2.0.0:
-  version "2.0.0"
-  resolved 
"https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3";
-  integrity 
sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==
-
 typedarray-to-buffer@^3.1.5:
   version "3.1.5"
   resolved 
"https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080";
@@ -6418,49 +3808,35 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
-typedarray@^0.0.6:
-  version "0.0.6"
-  resolved 
"https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777";
-  integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-
-typedoc-default-themes@^0.6.1:
-  version "0.6.1"
-  resolved 
"https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.6.1.tgz#e2e471188983df995f4f9df49f713044fced6802";
-  integrity 
sha512-z5AWKqQDz7igl9WkUuafx8cEm4MPVQGMpbWE+3lwVOaq+U4UoLKBMnpFQWh/4fqQ3bGysXpOstMxy2OOzHezyw==
+typedoc-default-themes@^0.10.0:
+  version "0.10.0"
+  resolved 
"https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.10.0.tgz#f1a13a24c136967ebd0f127614c2955f9ebd5b26";
+  integrity 
sha512-FV3Fct86EXTuW8f6E7F4ntM/BrBD5u7E+b96MIfiDWh3S14V+b+nNO+XzL0pQTBzF7PT63qHuwhrEBUk8XuqKA==
   dependencies:
-    backbone "^1.4.0"
-    jquery "^3.4.1"
     lunr "^2.3.8"
-    underscore "^1.9.1"
 
-typedoc@^0.15.0:
-  version "0.15.2"
-  resolved 
"https://registry.yarnpkg.com/typedoc/-/typedoc-0.15.2.tgz#f0f79abd12e8b9785f96ce205e2dadf282c32cf4";
-  integrity 
sha512-K2nFEtyDQTVdXOzYtECw3TwuT3lM91Zc0dzGSLuor5R8qzZbwqBoCw7xYGVBow6+mEZAvKGznLFsl7FzG+wAgQ==
+typedoc@^0.17.4:
+  version "0.17.4"
+  resolved 
"https://registry.yarnpkg.com/typedoc/-/typedoc-0.17.4.tgz#1de11e2e5e741af20bcdd73b9525f8ad04b59863";
+  integrity 
sha512-4Lotef1l6lNU5Fulpux809WPlF9CkmcXfv5QFyanrjYlxMFxSdARRdsy8Jv1OU3z0vjR4JsvUQT0YpiPqztcOA==
   dependencies:
-    "@types/minimatch" "3.0.3"
     fs-extra "^8.1.0"
-    handlebars "^4.5.1"
-    highlight.js "^9.16.2"
+    handlebars "^4.7.6"
+    highlight.js "^9.18.1"
     lodash "^4.17.15"
-    marked "^0.7.0"
+    lunr "^2.3.8"
+    marked "0.8.2"
     minimatch "^3.0.0"
     progress "^2.0.3"
     shelljs "^0.8.3"
-    typedoc-default-themes "^0.6.1"
-    typescript "3.7.x"
-
-typescript@3.7.x:
-  version "3.7.2"
-  resolved 
"https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb";
-  integrity 
sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==
+    typedoc-default-themes "^0.10.0"
 
 typescript@^3.8.3:
   version "3.8.3"
   resolved 
"https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061";
   integrity 
sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
 
-uglify-js@^3.0.27, uglify-js@^3.1.4:
+uglify-js@^3.1.4:
   version "3.6.9"
   resolved 
"https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611";
   integrity 
sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==
@@ -6468,67 +3844,10 @@ uglify-js@^3.0.27, uglify-js@^3.1.4:
     commander "~2.20.3"
     source-map "~0.6.1"
 
-unc-path-regex@^0.1.2:
-  version "0.1.2"
-  resolved 
"https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa";
-  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
-
-underscore@>=1.8.3, underscore@^1.9.1:
-  version "1.9.1"
-  resolved 
"https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961";
-  integrity 
sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
-
-undertaker-registry@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50";
-  integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=
-
-undertaker@^1.2.1:
-  version "1.2.1"
-  resolved 
"https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b";
-  integrity 
sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==
-  dependencies:
-    arr-flatten "^1.0.1"
-    arr-map "^2.0.0"
-    bach "^1.0.0"
-    collection-map "^1.0.0"
-    es6-weak-map "^2.0.1"
-    last-run "^1.1.0"
-    object.defaults "^1.0.0"
-    object.reduce "^1.0.0"
-    undertaker-registry "^1.0.0"
-
-union-value@^1.0.0:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847";
-  integrity 
sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
-  dependencies:
-    arr-union "^3.1.0"
-    get-value "^2.0.6"
-    is-extendable "^0.1.1"
-    set-value "^2.0.1"
-
-unique-filename@^1.1.1:
-  version "1.1.1"
-  resolved 
"https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230";
-  integrity 
sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
-  dependencies:
-    unique-slug "^2.0.0"
-
-unique-slug@^2.0.0:
-  version "2.0.2"
-  resolved 
"https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c";
-  integrity 
sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
-  dependencies:
-    imurmurhash "^0.1.4"
-
-unique-stream@^2.0.2:
-  version "2.3.1"
-  resolved 
"https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac";
-  integrity 
sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
-  dependencies:
-    json-stable-stringify-without-jsonify "^1.0.1"
-    through2-filter "^3.0.0"
+underscore@~1.6.0:
+  version "1.6.0"
+  resolved 
"https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8";
+  integrity sha1-izixDKze9jM3uLJOT/htRa6lKag=
 
 unique-string@^2.0.0:
   version "2.0.0"
@@ -6542,24 +3861,6 @@ universalify@^0.1.0:
   resolved 
"https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66";
   integrity 
sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
 
-unpipe@1.0.0, unpipe@~1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec";
-  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
-
-unset-value@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
-  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
-  dependencies:
-    has-value "^0.3.1"
-    isobject "^3.0.0"
-
-upath@^1.1.1:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894";
-  integrity 
sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-
 update-notifier@^4.1.0:
   version "4.1.0"
   resolved 
"https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3";
@@ -6586,11 +3887,6 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
-urix@^0.1.0:
-  version "0.1.0"
-  resolved 
"https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72";
-  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
-
 url-parse-lax@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c";
@@ -6598,59 +3894,15 @@ url-parse-lax@^3.0.0:
   dependencies:
     prepend-http "^2.0.0"
 
-url@^0.11.0:
-  version "0.11.0"
-  resolved 
"https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
-  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
-  dependencies:
-    punycode "1.3.2"
-    querystring "0.2.0"
-
-use@^3.1.0:
-  version "3.1.1"
-  resolved 
"https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f";
-  integrity 
sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
-
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
-  version "1.0.2"
-  resolved 
"https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf";
-  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-util@0.10.3:
-  version "0.10.3"
-  resolved 
"https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9";
-  integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
-  dependencies:
-    inherits "2.0.1"
-
-util@^0.11.0:
-  version "0.11.1"
-  resolved 
"https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61";
-  integrity 
sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
-  dependencies:
-    inherits "2.0.3"
-
-utils-merge@1.0.1:
-  version "1.0.1"
-  resolved 
"https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713";
-  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
-
-uuid@^3.1.0, uuid@^3.3.2:
-  version "3.3.3"
-  resolved 
"https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866";
-  integrity 
sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
-
-v8-compile-cache@2.0.3:
-  version "2.0.3"
-  resolved 
"https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe";
-  integrity 
sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
+uuid@^3.3.3:
+  version "3.4.0"
+  resolved 
"https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee";
+  integrity 
sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-v8flags@^3.0.1:
-  version "3.1.3"
-  resolved 
"https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8";
-  integrity 
sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
-  dependencies:
-    homedir-polyfill "^1.0.1"
+v8-compile-cache@^2.0.3:
+  version "2.1.0"
+  resolved 
"https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e";
+  integrity 
sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
 
 validate-npm-package-license@^3.0.1:
   version "3.0.4"
@@ -6660,78 +3912,6 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
-value-or-function@^3.0.0:
-  version "3.0.0"
-  resolved 
"https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813";
-  integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
-
-vary@~1.1.2:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc";
-  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-
-vinyl-fs@^3.0.0, vinyl-fs@^3.0.3:
-  version "3.0.3"
-  resolved 
"https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7";
-  integrity 
sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
-  dependencies:
-    fs-mkdirp-stream "^1.0.0"
-    glob-stream "^6.1.0"
-    graceful-fs "^4.0.0"
-    is-valid-glob "^1.0.0"
-    lazystream "^1.0.0"
-    lead "^1.0.0"
-    object.assign "^4.0.4"
-    pumpify "^1.3.5"
-    readable-stream "^2.3.3"
-    remove-bom-buffer "^3.0.0"
-    remove-bom-stream "^1.2.0"
-    resolve-options "^1.1.0"
-    through2 "^2.0.0"
-    to-through "^2.0.0"
-    value-or-function "^3.0.0"
-    vinyl "^2.0.0"
-    vinyl-sourcemap "^1.1.0"
-
-vinyl-sourcemap@^1.1.0:
-  version "1.1.0"
-  resolved 
"https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16";
-  integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
-  dependencies:
-    append-buffer "^1.0.2"
-    convert-source-map "^1.5.0"
-    graceful-fs "^4.1.6"
-    normalize-path "^2.1.1"
-    now-and-later "^2.0.0"
-    remove-bom-buffer "^3.0.0"
-    vinyl "^2.0.0"
-
-vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0:
-  version "2.2.0"
-  resolved 
"https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86";
-  integrity 
sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
-  dependencies:
-    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"
-
-vm-browserify@^1.0.1:
-  version "1.1.2"
-  resolved 
"https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0";
-  integrity 
sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-
-watchpack@^1.6.0:
-  version "1.6.0"
-  resolved 
"https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00";
-  integrity 
sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
-  dependencies:
-    chokidar "^2.0.2"
-    graceful-fs "^4.1.2"
-    neo-async "^2.5.0"
-
 wcwidth@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
@@ -6739,124 +3919,29 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
-webpack-bundle-analyzer@^3.0.2:
-  version "3.6.0"
-  resolved 
"https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz#39b3a8f829ca044682bc6f9e011c95deb554aefd";
-  integrity 
sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==
-  dependencies:
-    acorn "^6.0.7"
-    acorn-walk "^6.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"
-
-webpack-cli@^3.1.0:
-  version "3.3.10"
-  resolved 
"https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13";
-  integrity 
sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==
-  dependencies:
-    chalk "2.4.2"
-    cross-spawn "6.0.5"
-    enhanced-resolve "4.1.0"
-    findup-sync "3.0.0"
-    global-modules "2.0.0"
-    import-local "2.0.0"
-    interpret "1.2.0"
-    loader-utils "1.2.3"
-    supports-color "6.1.0"
-    v8-compile-cache "2.0.3"
-    yargs "13.2.4"
-
-webpack-log@^1.2.0:
-  version "1.2.0"
-  resolved 
"https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d";
-  integrity 
sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==
-  dependencies:
-    chalk "^2.1.0"
-    log-symbols "^2.1.0"
-    loglevelnext "^1.0.1"
-    uuid "^3.1.0"
-
-webpack-merge@^4.2.2:
-  version "4.2.2"
-  resolved 
"https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d";
-  integrity 
sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
-  dependencies:
-    lodash "^4.17.15"
-
-webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
-  version "1.4.3"
-  resolved 
"https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933";
-  integrity 
sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
-  dependencies:
-    source-list-map "^2.0.0"
-    source-map "~0.6.1"
-
-webpack@^4.39.3:
-  version "4.41.2"
-  resolved 
"https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e";
-  integrity 
sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-module-context" "1.8.5"
-    "@webassemblyjs/wasm-edit" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
-    acorn "^6.2.1"
-    ajv "^6.10.2"
-    ajv-keywords "^3.4.1"
-    chrome-trace-event "^1.0.2"
-    enhanced-resolve "^4.1.0"
-    eslint-scope "^4.0.3"
-    json-parse-better-errors "^1.0.2"
-    loader-runner "^2.4.0"
-    loader-utils "^1.2.3"
-    memory-fs "^0.4.1"
-    micromatch "^3.1.10"
-    mkdirp "^0.5.1"
-    neo-async "^2.6.1"
-    node-libs-browser "^2.2.1"
-    schema-utils "^1.0.0"
-    tapable "^1.1.3"
-    terser-webpack-plugin "^1.4.1"
-    watchpack "^1.6.0"
-    webpack-sources "^1.4.1"
-
 well-known-symbols@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5";
   integrity 
sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==
 
-which-module@^1.0.0:
-  version "1.0.0"
-  resolved 
"https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f";
-  integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
-
 which-module@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
+which@^1.2.9:
   version "1.3.1"
   resolved 
"https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a";
   integrity 
sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
   dependencies:
     isexe "^2.0.0"
 
-wide-align@^1.1.0:
-  version "1.1.3"
-  resolved 
"https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457";
-  integrity 
sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+which@^2.0.1:
+  version "2.0.2"
+  resolved 
"https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1";
+  integrity 
sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
   dependencies:
-    string-width "^1.0.2 || 2"
+    isexe "^2.0.0"
 
 widest-line@^3.1.0:
   version "3.1.0"
@@ -6865,34 +3950,15 @@ widest-line@^3.1.0:
   dependencies:
     string-width "^4.0.0"
 
-wordwrap@~0.0.2:
-  version "0.0.3"
-  resolved 
"https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107";
-  integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
-
-worker-farm@^1.7.0:
-  version "1.7.0"
-  resolved 
"https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8";
-  integrity 
sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
-  dependencies:
-    errno "~0.1.7"
-
-wrap-ansi@^2.0.0:
-  version "2.1.0"
-  resolved 
"https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85";
-  integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
+word-wrap@~1.2.3:
+  version "1.2.3"
+  resolved 
"https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c";
+  integrity 
sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
 
-wrap-ansi@^5.1.0:
-  version "5.1.0"
-  resolved 
"https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09";
-  integrity 
sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
-  dependencies:
-    ansi-styles "^3.2.0"
-    string-width "^3.0.0"
-    strip-ansi "^5.0.0"
+wordwrap@^1.0.0:
+  version "1.0.0"
+  resolved 
"https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb";
+  integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
 
 wrap-ansi@^6.2.0:
   version "6.2.0"
@@ -6908,15 +3974,6 @@ wrappy@1:
   resolved 
"https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write-file-atomic@^2.4.2:
-  version "2.4.3"
-  resolved 
"https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481";
-  integrity 
sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
-  dependencies:
-    graceful-fs "^4.1.11"
-    imurmurhash "^0.1.4"
-    signal-exit "^3.0.2"
-
 write-file-atomic@^3.0.0:
   version "3.0.1"
   resolved 
"https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b";
@@ -6937,56 +3994,30 @@ write-file-atomic@^3.0.3:
     signal-exit "^3.0.2"
     typedarray-to-buffer "^3.1.5"
 
-ws@^6.0.0:
-  version "6.2.1"
-  resolved 
"https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb";
-  integrity 
sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+write@1.0.3:
+  version "1.0.3"
+  resolved 
"https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3";
+  integrity 
sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
   dependencies:
-    async-limiter "~1.0.0"
+    mkdirp "^0.5.1"
 
 xdg-basedir@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13";
   integrity 
sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 
-xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
-  version "4.0.2"
-  resolved 
"https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54";
-  integrity 
sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-
-y18n@^3.2.1:
-  version "3.2.1"
-  resolved 
"https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41";
-  integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
+xregexp@^4.3.0:
+  version "4.3.0"
+  resolved 
"https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50";
+  integrity 
sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
+  dependencies:
+    "@babel/runtime-corejs3" "^7.8.3"
 
 y18n@^4.0.0:
   version "4.0.0"
   resolved 
"https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b";
   integrity 
sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
 
-yallist@^2.1.2:
-  version "2.1.2"
-  resolved 
"https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52";
-  integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
-  version "3.1.1"
-  resolved 
"https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd";
-  integrity 
sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-
-yallist@^4.0.0:
-  version "4.0.0"
-  resolved 
"https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72";
-  integrity 
sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yargs-parser@^13.0.0, yargs-parser@^13.1.0, yargs-parser@^13.1.1:
-  version "13.1.1"
-  resolved 
"https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0";
-  integrity 
sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
-  dependencies:
-    camelcase "^5.0.0"
-    decamelize "^1.2.0"
-
 yargs-parser@^18.1.1:
   version "18.1.2"
   resolved 
"https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1";
@@ -6995,47 +4026,7 @@ yargs-parser@^18.1.1:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^5.0.0:
-  version "5.0.0"
-  resolved 
"https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
-  integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
-  dependencies:
-    camelcase "^3.0.0"
-
-yargs@13.2.4:
-  version "13.2.4"
-  resolved 
"https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83";
-  integrity 
sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
-  dependencies:
-    cliui "^5.0.0"
-    find-up "^3.0.0"
-    get-caller-file "^2.0.1"
-    os-locale "^3.1.0"
-    require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^3.0.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^13.1.0"
-
-yargs@^13.2.2:
-  version "13.3.0"
-  resolved 
"https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83";
-  integrity 
sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
-  dependencies:
-    cliui "^5.0.0"
-    find-up "^3.0.0"
-    get-caller-file "^2.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^3.0.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^13.1.1"
-
-yargs@^15.3.1:
+yargs@^15.0.2, yargs@^15.3.1:
   version "15.3.1"
   resolved 
"https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b";
   integrity 
sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
@@ -7051,38 +4042,3 @@ yargs@^15.3.1:
     which-module "^2.0.0"
     y18n "^4.0.0"
     yargs-parser "^18.1.1"
-
-yargs@^7.1.0:
-  version "7.1.0"
-  resolved 
"https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8";
-  integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
-  dependencies:
-    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 "^5.0.0"
-
-yazl@^2.5.1:
-  version "2.5.1"
-  resolved 
"https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35";
-  integrity 
sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
-  dependencies:
-    buffer-crc32 "~0.2.3"
-
-zip-stream@^2.1.2:
-  version "2.1.2"
-  resolved 
"https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.2.tgz#841efd23214b602ff49c497cba1a85d8b5fbc39c";
-  integrity 
sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==
-  dependencies:
-    archiver-utils "^2.1.0"
-    compress-commons "^2.1.1"
-    readable-stream "^3.4.0"

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]