diff --git a/.editorconfig b/.editorconfig
index 65705d954568..0f6dc9448dc5 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -3,4 +3,9 @@ root = true
 [*]
 indent_style = space
 trim_trailing_whitespace = true
+
+# The indent size used in the `package.json` file cannot be changed
+# https://github.com/npm/npm/pull/3180#issuecomment-16336516
+[{*.yml,*.yaml,package.json}]
+indent_style = space
 indent_size = 2
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index bf02bc67eabc..abcca10b1fa4 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -54,10 +54,6 @@ jobs:
         run: yarn lint
         if: success()
 
-      - name: Run code-server unit tests
-        run: yarn test:unit
-        if: success()
-
       - name: Upload coverage report to Codecov
         run: yarn coverage
         if: success()
@@ -408,6 +404,9 @@ jobs:
           rm -r node_modules/playwright
           yarn install --check-files
 
+      - name: Run end-to-end tests
+        run: yarn test:unit
+
       - name: Run end-to-end tests
         run: yarn test:e2e
 
diff --git a/.gitignore b/.gitignore
index 3cc6e31d7af3..8f02ff037e2b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ vendor/modules
 node-*
 /plugins
 /lib/coder-cloud-agent
+/lib/linkup
 .home
 coverage
 **/.DS_Store
diff --git a/.prettierrc.yaml b/.prettierrc.yaml
index a0634116d20d..bf4b4a7d239b 100644
--- a/.prettierrc.yaml
+++ b/.prettierrc.yaml
@@ -2,3 +2,16 @@ printWidth: 120
 semi: false
 trailingComma: all
 arrowParens: always
+singleQuote: false
+useTabs: false
+
+overrides:
+  # Attempt to keep VScode's existing code style intact.
+  - files: "vendor/modules/code-oss-dev/**/*.ts"
+    options:
+      # No limit defined upstream.
+      printWidth: 10000
+      semi: true
+      singleQuote: true
+      useTabs: true
+      arrowParens: avoid
diff --git a/ci/build/build-code-server.sh b/ci/build/build-code-server.sh
index c17725393435..b3b1967a65c8 100755
--- a/ci/build/build-code-server.sh
+++ b/ci/build/build-code-server.sh
@@ -15,23 +15,28 @@ main() {
     chmod +x out/node/entry.js
   fi
 
+  # for arch; we do not use OS from lib.sh and get our own.
+  # lib.sh normalizes macos to darwin - but cloud-agent's binaries do not
+  source ./ci/lib.sh
+  OS="$(uname | tr '[:upper:]' '[:lower:]')"
+
   if ! [ -f ./lib/coder-cloud-agent ]; then
     echo "Downloading the cloud agent..."
 
-    # for arch; we do not use OS from lib.sh and get our own.
-    # lib.sh normalizes macos to darwin - but cloud-agent's binaries do not
-    source ./ci/lib.sh
-    OS="$(uname | tr '[:upper:]' '[:lower:]')"
-
     set +e
     curl -fsSL "https://github.com/cdr/cloud-agent/releases/latest/download/cloud-agent-$OS-$ARCH" -o ./lib/coder-cloud-agent
     chmod +x ./lib/coder-cloud-agent
     set -e
   fi
 
-  yarn browserify out/browser/register.js -o out/browser/register.browserified.js
-  yarn browserify out/browser/pages/login.js -o out/browser/pages/login.browserified.js
-  yarn browserify out/browser/pages/vscode.js -o out/browser/pages/vscode.browserified.js
+  if ! [ -f ./lib/linkup ]; then
+    echo "Downloading Link agent..."
+
+    set +e
+    curl -fsSL "https://storage.googleapis.com/coder-link-releases/latest/linkup-$OS-$ARCH" -o ./lib/linkup
+    chmod +x ./lib/linkup
+    set -e
+  fi
 }
 
 main "$@"
diff --git a/ci/build/build-release.sh b/ci/build/build-release.sh
index ba3193513e8e..f7b7df2662dc 100755
--- a/ci/build/build-release.sh
+++ b/ci/build/build-release.sh
@@ -61,6 +61,7 @@ EOF
     rsync node_modules/ "$RELEASE_PATH/node_modules"
     mkdir -p "$RELEASE_PATH/lib"
     rsync ./lib/coder-cloud-agent "$RELEASE_PATH/lib"
+    rsync ./lib/linkup "$RELEASE_PATH/lib"
   fi
 }
 
@@ -80,8 +81,8 @@ bundle_vscode() {
   rsync "$VSCODE_SRC_PATH/extensions/postinstall.js" "$VSCODE_OUT_PATH/extensions"
 
   mkdir -p "$VSCODE_OUT_PATH/resources/"{linux,web}
-  rsync "$VSCODE_SRC_PATH/resources/linux/code.png" "$VSCODE_OUT_PATH/resources/linux/code.png"
-  rsync "$VSCODE_SRC_PATH/resources/web/callback.html" "$VSCODE_OUT_PATH/resources/web/callback.html"
+  rsync "$VSCODE_SRC_PATH/resources/linux/" "$VSCODE_OUT_PATH/resources/linux/"
+  rsync "$VSCODE_SRC_PATH/resources/web/" "$VSCODE_OUT_PATH/resources/web/"
 
   # Add the commit and date and enable telemetry. This just makes telemetry
   # available; telemetry can still be disabled by flag or setting.
diff --git a/ci/build/build-vscode.sh b/ci/build/build-vscode.sh
index ca35d4f3b064..91e83e7f0cdc 100755
--- a/ci/build/build-vscode.sh
+++ b/ci/build/build-vscode.sh
@@ -11,8 +11,10 @@ main() {
 
   cd vendor/modules/code-oss-dev
 
-  yarn gulp compile-build compile-extensions-build compile-extension-media
+  yarn gulp compile-build compile-extensions-build compile-extension-media compile-web
+
   yarn gulp optimize --gulpfile ./coder.js
+
   if [[ $MINIFY ]]; then
     yarn gulp minify --gulpfile ./coder.js
   fi
diff --git a/ci/build/npm-postinstall.sh b/ci/build/npm-postinstall.sh
index 76c558d1f823..38412ee7baff 100755
--- a/ci/build/npm-postinstall.sh
+++ b/ci/build/npm-postinstall.sh
@@ -63,6 +63,12 @@ main() {
     echo "Failed to download cloud agent; --link will not work"
   fi
 
+  if curl -fsSL "https://storage.googleapis.com/coder-link-releases/latest/linkup-$OS-$ARCH" -o ./lib/linkup; then
+    chmod +x ./lib/linkup
+  else
+    echo "Failed to download Link agent; the Link extension will not work"
+  fi
+
   if ! vscode_yarn; then
     echo "You may not have the required dependencies to build the native modules."
     echo "Please see https://github.com/cdr/code-server/blob/master/docs/npm.md"
diff --git a/ci/dev/watch.ts b/ci/dev/watch.ts
index a0c116ec28ed..6b783f4066b9 100644
--- a/ci/dev/watch.ts
+++ b/ci/dev/watch.ts
@@ -1,6 +1,4 @@
-import browserify from "browserify"
 import * as cp from "child_process"
-import * as fs from "fs"
 import * as path from "path"
 import { onLine } from "../../src/node/util"
 
@@ -8,7 +6,7 @@ async function main(): Promise<void> {
   try {
     const watcher = new Watcher()
     await watcher.watch()
-  } catch (error) {
+  } catch (error: any) {
     console.error(error.message)
     process.exit(1)
   }
@@ -38,6 +36,9 @@ class Watcher {
     }
 
     const vscode = cp.spawn("yarn", ["watch"], { cwd: this.vscodeSourcePath })
+
+    const vscodeWebExtensions = cp.spawn("yarn", ["watch-web"], { cwd: this.vscodeSourcePath })
+
     const tsc = cp.spawn("tsc", ["--watch", "--pretty", "--preserveWatchOutput"], { cwd: this.rootPath })
     const plugin = process.env.PLUGIN_DIR
       ? cp.spawn("yarn", ["build", "--watch"], { cwd: process.env.PLUGIN_DIR })
@@ -48,6 +49,10 @@ class Watcher {
       vscode.removeAllListeners()
       vscode.kill()
 
+      Watcher.log("killing vs code web extension watcher")
+      vscodeWebExtensions.removeAllListeners()
+      vscodeWebExtensions.kill()
+
       Watcher.log("killing tsc")
       tsc.removeAllListeners()
       tsc.kill()
@@ -75,10 +80,17 @@ class Watcher {
       Watcher.log("vs code watcher terminated unexpectedly")
       cleanup(code)
     })
+
+    vscodeWebExtensions.on("exit", (code) => {
+      Watcher.log("vs code extension watcher terminated unexpectedly")
+      cleanup(code)
+    })
+
     tsc.on("exit", (code) => {
       Watcher.log("tsc terminated unexpectedly")
       cleanup(code)
     })
+
     if (plugin) {
       plugin.on("exit", (code) => {
         Watcher.log("plugin terminated unexpectedly")
@@ -86,18 +98,14 @@ class Watcher {
       })
     }
 
+    vscodeWebExtensions.stderr.on("data", (d) => process.stderr.write(d))
     vscode.stderr.on("data", (d) => process.stderr.write(d))
     tsc.stderr.on("data", (d) => process.stderr.write(d))
+
     if (plugin) {
       plugin.stderr.on("data", (d) => process.stderr.write(d))
     }
 
-    const browserFiles = [
-      path.join(this.rootPath, "out/browser/register.js"),
-      path.join(this.rootPath, "out/browser/pages/login.js"),
-      path.join(this.rootPath, "out/browser/pages/vscode.js"),
-    ]
-
     let startingVscode = false
     let startedVscode = false
     onLine(vscode, (line, original) => {
@@ -120,7 +128,6 @@ class Watcher {
         console.log("[tsc]", original)
       }
       if (line.includes("Watching for file changes")) {
-        bundleBrowserCode(browserFiles)
         restartServer()
       }
     })
@@ -139,19 +146,4 @@ class Watcher {
   }
 }
 
-function bundleBrowserCode(inputFiles: string[]) {
-  console.log(`[browser] bundling...`)
-  inputFiles.forEach(async (path: string) => {
-    const outputPath = path.replace(".js", ".browserified.js")
-    browserify()
-      .add(path)
-      .bundle()
-      .on("error", function (error: Error) {
-        console.error(error.toString())
-      })
-      .pipe(fs.createWriteStream(outputPath))
-  })
-  console.log(`[browser] done bundling`)
-}
-
 main()
diff --git a/package.json b/package.json
index a236c6e756d0..1b0c1277bf02 100644
--- a/package.json
+++ b/package.json
@@ -35,8 +35,6 @@
   "main": "out/node/entry.js",
   "devDependencies": {
     "@schemastore/package": "^0.0.6",
-    "@types/body-parser": "^1.19.0",
-    "@types/browserify": "^12.0.36",
     "@types/compression": "^1.7.0",
     "@types/cookie-parser": "^1.4.2",
     "@types/express": "^4.17.8",
@@ -48,13 +46,11 @@
     "@types/safe-compare": "^1.1.0",
     "@types/semver": "^7.1.0",
     "@types/split2": "^3.2.0",
-    "@types/tar-fs": "^2.0.0",
-    "@types/tar-stream": "^2.1.0",
+    "@types/trusted-types": "^2.0.2",
     "@types/ws": "^8.0.0",
     "@typescript-eslint/eslint-plugin": "^4.7.0",
     "@typescript-eslint/parser": "^4.7.0",
     "audit-ci": "^4.0.0",
-    "browserify": "^17.0.0",
     "codecov": "^3.8.3",
     "doctoc": "^2.0.0",
     "eslint": "^7.7.0",
@@ -68,7 +64,7 @@
     "stylelint": "^13.0.0",
     "stylelint-config-recommended": "^5.0.0",
     "ts-node": "^10.0.0",
-    "typescript": "^4.1.3"
+    "typescript": "^4.4.0-dev.20210528"
   },
   "resolutions": {
     "ansi-regex": "^5.0.1",
@@ -85,7 +81,6 @@
   "dependencies": {
     "@coder/logger": "1.1.16",
     "argon2": "^0.28.0",
-    "body-parser": "^1.19.0",
     "compression": "^1.7.4",
     "cookie-parser": "^1.4.5",
     "env-paths": "^2.2.0",
@@ -103,7 +98,6 @@
     "safe-compare": "^1.1.4",
     "semver": "^7.1.3",
     "split2": "^3.2.2",
-    "tar-fs": "^2.0.0",
     "ws": "^8.0.0",
     "xdg-basedir": "^4.0.0",
     "yarn": "^1.22.4"
diff --git a/src/browser/media/manifest.json b/src/browser/media/manifest.json
deleted file mode 100644
index a16709e1ee90..000000000000
--- a/src/browser/media/manifest.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "name": "code-server",
-  "short_name": "code-server",
-  "start_url": "{{BASE}}",
-  "display": "fullscreen",
-  "background-color": "#fff",
-  "description": "Run editors on a remote server.",
-  "icons": [
-    {
-      "src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png",
-      "type": "image/png",
-      "sizes": "192x192"
-    },
-    {
-      "src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png",
-      "type": "image/png",
-      "sizes": "512x512"
-    }
-  ]
-}
diff --git a/src/browser/pages/error.html b/src/browser/pages/error.html
index 56e03e27a628..1ff716d40614 100644
--- a/src/browser/pages/error.html
+++ b/src/browser/pages/error.html
@@ -10,10 +10,11 @@
       http-equiv="Content-Security-Policy"
       content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
     />
+
     <title>{{ERROR_TITLE}} - code-server</title>
     <link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
     <link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
-    <link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
+    <link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
     <link rel="apple-touch-icon" sizes="192x192" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png" />
     <link rel="apple-touch-icon" sizes="512x512" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png" />
     <link href="{{CS_STATIC_BASE}}/src/browser/pages/global.css" rel="stylesheet" />
@@ -30,6 +31,5 @@ <h2 class="header">{{ERROR_HEADER}}</h2>
         </div>
       </div>
     </div>
-    <script data-cfasync="false" src="{{CS_STATIC_BASE}}/out/browser/register.browserified.js"></script>
   </body>
 </html>
diff --git a/src/browser/pages/login.html b/src/browser/pages/login.html
index 896927e3812c..f8837c8f30e3 100644
--- a/src/browser/pages/login.html
+++ b/src/browser/pages/login.html
@@ -13,7 +13,7 @@
     <title>code-server login</title>
     <link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
     <link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
-    <link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
+    <link rel="manifest" href="{{BASE}}/manifest.json" crossorigin="use-credentials" />
     <link rel="apple-touch-icon" sizes="192x192" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png" />
     <link rel="apple-touch-icon" sizes="512x512" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png" />
     <link href="{{CS_STATIC_BASE}}/src/browser/pages/global.css" rel="stylesheet" />
@@ -30,7 +30,6 @@ <h1 class="main">Welcome to code-server</h1>
         <div class="content">
           <form class="login-form" method="post">
             <input class="user" type="text" autocomplete="username" />
-            <input id="base" type="hidden" name="base" value="/" />
             <div class="field">
               <input
                 required
@@ -49,5 +48,4 @@ <h1 class="main">Welcome to code-server</h1>
       </div>
     </div>
   </body>
-  <script data-cfasync="false" src="{{CS_STATIC_BASE}}/out/browser/pages/login.browserified.js"></script>
 </html>
diff --git a/src/browser/pages/login.ts b/src/browser/pages/login.ts
deleted file mode 100644
index cd3fd0d16542..000000000000
--- a/src/browser/pages/login.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { getOptions } from "../../common/util"
-import "../register"
-
-const options = getOptions()
-const el = document.getElementById("base") as HTMLInputElement
-if (el) {
-  el.value = options.base
-}
diff --git a/src/browser/pages/vscode.html b/src/browser/pages/vscode.html
deleted file mode 100644
index a01223ceccd0..000000000000
--- a/src/browser/pages/vscode.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
-<!DOCTYPE html>
-<html>
-  <head>
-    <script>
-      performance.mark("code/didStartRenderer")
-    </script>
-
-    <meta charset="utf-8" />
-
-    <!-- Disable pinch zooming -->
-    <meta
-      name="viewport"
-      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"
-    />
-
-    <!-- Workbench Configuration -->
-    <meta id="vscode-workbench-web-configuration" data-settings="{{WORKBENCH_WEB_CONFIGURATION}}" />
-
-    <!-- Workarounds/Hacks (remote user data uri) -->
-    <meta id="vscode-remote-user-data-uri" data-settings="{{REMOTE_USER_DATA_URI}}" />
-    <meta id="vscode-remote-product-configuration" data-settings="{{PRODUCT_CONFIGURATION}}" />
-    <meta id="vscode-remote-nls-configuration" data-settings="{{NLS_CONFIGURATION}}" />
-
-    <!-- Workbench Icon/Manifest/CSS -->
-    <link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
-    <link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
-    <link rel="manifest" href="{{CS_STATIC_BASE}}/src/browser/media/manifest.json" crossorigin="use-credentials" />
-    <!-- PROD_ONLY
-    <link data-name="vs/workbench/workbench.web.api" rel="stylesheet" href="{{CS_STATIC_BASE}}/vendor/modules/code-oss-dev/out/vs/workbench/workbench.web.api.css">
-    END_PROD_ONLY -->
-    <link rel="apple-touch-icon" sizes="192x192" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png" />
-    <link rel="apple-touch-icon" sizes="512x512" href="{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png" />
-    <meta name="apple-mobile-web-app-capable" content="yes" />
-
-    <meta id="coder-options" data-settings="{{OPTIONS}}" />
-  </head>
-
-  <body aria-label=""></body>
-
-  <!-- Startup (do not modify order of script tags!) -->
-  <script data-cfasync="false" src="{{CS_STATIC_BASE}}/out/browser/pages/vscode.browserified.js"></script>
-  <script data-cfasync="false" src="{{CS_STATIC_BASE}}/vendor/modules/code-oss-dev/out/vs/loader.js"></script>
-  <script>
-    performance.mark("code/willLoadWorkbenchMain")
-  </script>
-  <!-- PROD_ONLY
-  <script data-cfasync="false" src="{{CS_STATIC_BASE}}/vendor/modules/code-oss-dev/out/vs/workbench/workbench.web.api.nls.js"></script>
-  <script data-cfasync="false" src="{{CS_STATIC_BASE}}/vendor/modules/code-oss-dev/out/vs/workbench/workbench.web.api.js"></script>
-  END_PROD_ONLY -->
-  <script>
-    require(["vs/code/browser/workbench/workbench"], function () {})
-  </script>
-</html>
diff --git a/src/browser/pages/vscode.ts b/src/browser/pages/vscode.ts
deleted file mode 100644
index ed5849648955..000000000000
--- a/src/browser/pages/vscode.ts
+++ /dev/null
@@ -1,253 +0,0 @@
-import { getOptions, Options } from "../../common/util"
-import "../register"
-
-// TODO@jsjoeio: Add proper types.
-type FixMeLater = any
-
-// NOTE@jsjoeio
-// This lives here ../../../lib/vscode/src/vs/base/common/platform.ts#L106
-export const nlsConfigElementId = "vscode-remote-nls-configuration"
-
-type NlsConfiguration = {
-  locale: string
-  availableLanguages: { [key: string]: string } | {}
-  _languagePackId?: string
-  _translationsConfigFile?: string
-  _cacheRoot?: string
-  _resolvedLanguagePackCoreLocation?: string
-  _corruptedFile?: string
-  _languagePackSupport?: boolean
-  loadBundle?: FixMeLater
-}
-
-/**
- * Helper function to create the path to the bundle
- * for getNlsConfiguration.
- */
-export function createBundlePath(_resolvedLanguagePackCoreLocation: string | undefined, bundle: string) {
-  // NOTE@jsjoeio - this comment was here before me
-  // Refers to operating systems that use a different path separator.
-  // Probably just Windows but we're not sure if "/" breaks on Windows
-  // so we'll leave it alone for now.
-  // FIXME: Only works if path separators are /.
-  return (_resolvedLanguagePackCoreLocation || "") + "/" + bundle.replace(/\//g, "!") + ".nls.json"
-}
-
-/**
- * A helper function to get the NLS Configuration settings.
- *
- * This is used by VSCode for localizations (i.e. changing
- * the display language).
- *
- * Make sure to wrap this in a try/catch block when you call it.
- **/
-export function getNlsConfiguration(_document: Document, base: string) {
-  const errorMsgPrefix = "[vscode]"
-  const nlsConfigElement = _document?.getElementById(nlsConfigElementId)
-  const dataSettings = nlsConfigElement?.getAttribute("data-settings")
-
-  if (!nlsConfigElement) {
-    throw new Error(
-      `${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}`,
-    )
-  }
-
-  if (!dataSettings) {
-    throw new Error(
-      `${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.`,
-    )
-  }
-
-  const nlsConfig = JSON.parse(dataSettings) as NlsConfiguration
-
-  if (nlsConfig._resolvedLanguagePackCoreLocation) {
-    // NOTE@jsjoeio
-    // Not sure why we use Object.create(null) instead of {}
-    // They are not the same
-    // See: https://stackoverflow.com/a/15518712/3015595
-    // We copied this from ../../../lib/vscode/src/bootstrap.js#L143
-    const bundles: {
-      [key: string]: string
-    } = Object.create(null)
-
-    type LoadBundleCallback = (_: undefined, result?: string) => void
-
-    nlsConfig.loadBundle = async (bundle: string, _language: string, cb: LoadBundleCallback): Promise<void> => {
-      const result = bundles[bundle]
-
-      if (result) {
-        return cb(undefined, result)
-      }
-
-      try {
-        const path = createBundlePath(nlsConfig._resolvedLanguagePackCoreLocation, bundle)
-        const response = await fetch(`${base}/vscode/resource/?path=${encodeURIComponent(path)}`)
-        const json = await response.json()
-        bundles[bundle] = json
-        return cb(undefined, json)
-      } catch (error) {
-        return cb(error)
-      }
-    }
-  }
-
-  return nlsConfig
-}
-
-type GetLoaderParams = {
-  nlsConfig: NlsConfiguration
-  options: Options
-  _window: Window
-}
-
-/**
- * Link to types in the loader source repo
- * https://github.com/microsoft/vscode-loader/blob/main/src/loader.d.ts#L280
- */
-type Loader = {
-  baseUrl: string
-  recordStats: boolean
-  // TODO@jsjoeio: There don't appear to be any types for trustedTypes yet.
-  trustedTypesPolicy: FixMeLater
-  paths: {
-    [key: string]: string
-  }
-  "vs/nls": NlsConfiguration
-}
-
-/**
- * A helper function which creates a script url if the value
- * is valid.
- *
- * Extracted into a function to make it easier to test
- */
-export function _createScriptURL(value: string, origin: string): string {
-  if (value.startsWith(origin)) {
-    return value
-  }
-  throw new Error(`Invalid script url: ${value}`)
-}
-
-/**
- * A helper function to get the require loader
- *
- * This used by VSCode/code-server
- * to load files.
- *
- * We extracted the logic into a function so that
- * it's easier to test.
- **/
-export function getConfigurationForLoader({ nlsConfig, options, _window }: GetLoaderParams) {
-  const loader: Loader = {
-    // Without the full URL VS Code will try to load file://.
-    baseUrl: `${window.location.origin}${options.csStaticBase}/vendor/modules/code-oss-dev/out`,
-    recordStats: true,
-    trustedTypesPolicy: (_window as FixMeLater).trustedTypes?.createPolicy("amdLoader", {
-      createScriptURL(value: string): string {
-        return _createScriptURL(value, window.location.origin)
-      },
-    }),
-    paths: {
-      "vscode-textmate": `../node_modules/vscode-textmate/release/main`,
-      "vscode-oniguruma": `../node_modules/vscode-oniguruma/release/main`,
-      xterm: `../node_modules/xterm/lib/xterm.js`,
-      "xterm-addon-search": `../node_modules/xterm-addon-search/lib/xterm-addon-search.js`,
-      "xterm-addon-unicode11": `../node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`,
-      "xterm-addon-webgl": `../node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`,
-      "tas-client-umd": `../node_modules/tas-client-umd/lib/tas-client-umd.js`,
-      "iconv-lite-umd": `../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`,
-      jschardet: `../node_modules/jschardet/dist/jschardet.min.js`,
-    },
-    "vs/nls": nlsConfig,
-  }
-
-  return loader
-}
-
-/**
- * Sets the body background color to match the theme.
- */
-export function setBodyBackgroundToThemeBackgroundColor(_document: Document, _localStorage: Storage) {
-  const errorMsgPrefix = "[vscode]"
-  const colorThemeData = _localStorage.getItem("colorThemeData")
-
-  if (!colorThemeData) {
-    throw new Error(
-      `${errorMsgPrefix} Could not set body background to theme background color. Could not find colorThemeData in localStorage.`,
-    )
-  }
-
-  let _colorThemeData
-  try {
-    // We wrap this JSON.parse logic in a try/catch
-    // because it can throw if the JSON is invalid.
-    // and instead of throwing a random error
-    // we can throw our own error, which will be more helpful
-    // to the end user.
-    _colorThemeData = JSON.parse(colorThemeData)
-  } catch {
-    throw new Error(
-      `${errorMsgPrefix} Could not set body background to theme background color. Could not parse colorThemeData from localStorage.`,
-    )
-  }
-
-  const hasColorMapProperty = Object.prototype.hasOwnProperty.call(_colorThemeData, "colorMap")
-  if (!hasColorMapProperty) {
-    throw new Error(
-      `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData is missing colorMap.`,
-    )
-  }
-
-  const editorBgColor = _colorThemeData.colorMap["editor.background"]
-
-  if (!editorBgColor) {
-    throw new Error(
-      `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData.colorMap["editor.background"] is undefined.`,
-    )
-  }
-
-  _document.body.style.background = editorBgColor
-
-  return null
-}
-
-/**
- * A helper function to encapsulate all the
- * logic used in this file.
- *
- * We purposely include all of this in a single function
- * so that it's easier to test.
- */
-export function main(_document: Document | undefined, _window: Window | undefined, _localStorage: Storage | undefined) {
-  if (!_document) {
-    throw new Error(`document is undefined.`)
-  }
-
-  if (!_window) {
-    throw new Error(`window is undefined.`)
-  }
-
-  if (!_localStorage) {
-    throw new Error(`localStorage is undefined.`)
-  }
-
-  const options = getOptions()
-  const nlsConfig = getNlsConfiguration(_document, options.base)
-
-  const loader = getConfigurationForLoader({
-    nlsConfig,
-    options,
-    _window,
-  })
-
-  ;(self.require as unknown as Loader) = loader
-
-  setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-}
-
-try {
-  main(document, window, localStorage)
-} catch (error) {
-  console.error("[vscode] failed to initialize VS Code")
-  console.error(error)
-}
diff --git a/src/browser/register.ts b/src/browser/register.ts
deleted file mode 100644
index 4774ad5fa467..000000000000
--- a/src/browser/register.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { logger } from "@coder/logger"
-import { getOptions, normalize, logError } from "../common/util"
-
-export async function registerServiceWorker(): Promise<void> {
-  const options = getOptions()
-  logger.level = options.logLevel
-
-  const path = normalize(`${options.csStaticBase}/out/browser/serviceWorker.js`)
-  try {
-    await navigator.serviceWorker.register(path, {
-      scope: options.base + "/",
-    })
-    logger.info(`[Service Worker] registered`)
-  } catch (error) {
-    logError(logger, `[Service Worker] registration`, error)
-  }
-}
-
-if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
-  registerServiceWorker()
-} else {
-  logger.error(`[Service Worker] navigator is undefined`)
-}
diff --git a/src/browser/serviceWorker.ts b/src/browser/serviceWorker.ts
deleted file mode 100644
index 25765a1a4a68..000000000000
--- a/src/browser/serviceWorker.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-
-self.addEventListener("install", () => {
-  console.log("[Service Worker] installed")
-})
-
-self.addEventListener("activate", (event: any) => {
-  event.waitUntil((self as any).clients.claim())
-  console.log("[Service Worker] activated")
-})
-
-self.addEventListener("fetch", () => {
-  // Without this event handler we won't be recognized as a PWA.
-})
diff --git a/src/common/emitter.ts b/src/common/emitter.ts
index 353ce851e825..ceb6dcfcd21b 100644
--- a/src/common/emitter.ts
+++ b/src/common/emitter.ts
@@ -46,7 +46,7 @@ export class Emitter<T> {
       this.listeners.map(async (cb) => {
         try {
           await cb(value, promise)
-        } catch (error) {
+        } catch (error: any) {
           logger.error(error.message)
         }
       }),
diff --git a/src/common/util.ts b/src/common/util.ts
index 4e4f23cfd818..20470ad4e189 100644
--- a/src/common/util.ts
+++ b/src/common/util.ts
@@ -1,19 +1,3 @@
-/*
- * This file exists in two locations:
- * - src/common/util.ts
- * - lib/vscode/src/vs/server/common/util.ts
- * The second is a symlink to the first.
- */
-
-/**
- * Base options included on every page.
- */
-export interface Options {
-  base: string
-  csStaticBase: string
-  logLevel: number
-}
-
 /**
  * Split a string up to the delimiter. If the delimiter doesn't exist the first
  * item will have all the text and the second item will be an empty string.
@@ -67,14 +51,14 @@ export const resolveBase = (base?: string): string => {
 }
 
 /**
- * Get options embedded in the HTML or query params.
+ * Get client-side configuration embedded in the HTML or query params.
  */
-export const getOptions = <T extends Options>(): T => {
-  let options: T
+export const getClientConfiguration = <T extends CodeServerLib.ClientConfiguration>(): T => {
+  let config: T
   try {
-    options = JSON.parse(document.getElementById("coder-options")!.getAttribute("data-settings")!)
+    config = JSON.parse(document.getElementById("coder-options")!.getAttribute("data-settings")!)
   } catch (error) {
-    options = {} as T
+    config = {} as T
   }
 
   // You can also pass options in stringified form to the options query
@@ -83,16 +67,16 @@ export const getOptions = <T extends Options>(): T => {
   const params = new URLSearchParams(location.search)
   const queryOpts = params.get("options")
   if (queryOpts) {
-    options = {
-      ...options,
+    config = {
+      ...config,
       ...JSON.parse(queryOpts),
     }
   }
 
-  options.base = resolveBase(options.base)
-  options.csStaticBase = resolveBase(options.csStaticBase)
+  config.base = resolveBase(config.base)
+  config.csStaticBase = resolveBase(config.csStaticBase)
 
-  return options
+  return config
 }
 
 /**
@@ -109,17 +93,6 @@ export const arrayify = <T>(value?: T | T[]): T[] => {
   return [value]
 }
 
-/**
- * Get the first string. If there's no string return undefined.
- */
-export const getFirstString = (value: string | string[] | object | undefined): string | undefined => {
-  if (Array.isArray(value)) {
-    return value[0]
-  }
-
-  return typeof value === "string" ? value : undefined
-}
-
 // TODO: Might make sense to add Error handling to the logger itself.
 export function logError(logger: { error: (msg: string) => void }, prefix: string, err: Error | string): void {
   if (err instanceof Error) {
diff --git a/src/node/app.ts b/src/node/app.ts
index a4e099c0f86d..b2bfc74f5060 100644
--- a/src/node/app.ts
+++ b/src/node/app.ts
@@ -9,6 +9,35 @@ import { DefaultedArgs } from "./cli"
 import { isNodeJSErrnoException } from "./util"
 import { handleUpgrade } from "./wsRouter"
 
+type ListenOptions = Pick<DefaultedArgs, "socket" | "port" | "host">
+
+const listen = (server: http.Server, { host, port, socket }: ListenOptions) => {
+  return new Promise<void>(async (resolve, reject) => {
+    server.on("error", reject)
+
+    const onListen = () => {
+      // Promise resolved earlier so this is an unrelated error.
+      server.off("error", reject)
+      server.on("error", (err) => util.logError(logger, "http server error", err))
+
+      resolve()
+    }
+
+    if (socket) {
+      try {
+        await fs.unlink(socket)
+      } catch (error: any) {
+        handleArgsSocketCatchError(error)
+      }
+
+      server.listen(socket, onListen)
+    } else {
+      // [] is the correct format when using :: but Node errors with them.
+      server.listen(port, host.replace(/^\[|\]$/g, ""), onListen)
+    }
+  })
+}
+
 /**
  * Create an Express app and an HTTP/S server to serve it.
  */
@@ -27,28 +56,7 @@ export const createApp = async (args: DefaultedArgs): Promise<[Express, Express,
       )
     : http.createServer(app)
 
-  let resolved = false
-  await new Promise<void>(async (resolve2, reject) => {
-    const resolve = () => {
-      resolved = true
-      resolve2()
-    }
-    server.on("error", (err) => {
-      handleServerError(resolved, err, reject)
-    })
-
-    if (args.socket) {
-      try {
-        await fs.unlink(args.socket)
-      } catch (error: any) {
-        handleArgsSocketCatchError(error)
-      }
-      server.listen(args.socket, resolve)
-    } else {
-      // [] is the correct format when using :: but Node errors with them.
-      server.listen(args.port, args.host.replace(/^\[|\]$/g, ""), resolve)
-    }
-  })
+  await listen(server, args)
 
   const wsApp = express()
   handleUpgrade(wsApp, server)
diff --git a/src/node/cli.ts b/src/node/cli.ts
index 088431b7aa02..fe9b3fc13142 100644
--- a/src/node/cli.ts
+++ b/src/node/cli.ts
@@ -3,12 +3,11 @@ import { promises as fs } from "fs"
 import yaml from "js-yaml"
 import * as os from "os"
 import * as path from "path"
-import { Args as VsArgs } from "../../typings/ipc"
 import { canConnect, generateCertificate, generatePassword, humanPath, paths } from "./util"
 
 export enum Feature {
-  /** Web socket compression. */
-  PermessageDeflate = "permessage-deflate",
+  // No current experimental features!
+  Placeholder = "placeholder",
 }
 
 export enum AuthType {
@@ -30,7 +29,21 @@ export enum LogLevel {
 
 export class OptionalString extends Optional<string> {}
 
-export interface Args extends VsArgs {
+export interface Args
+  extends Pick<
+    CodeServerLib.NativeParsedArgs,
+    | "user-data-dir"
+    | "enable-proposed-api"
+    | "extensions-dir"
+    | "builtin-extensions-dir"
+    | "extra-extensions-dir"
+    | "extra-builtin-extensions-dir"
+    | "ignore-last-opened"
+    | "locale"
+    | "log"
+    | "verbose"
+    | "_"
+  > {
   config?: string
   auth?: AuthType
   password?: string
@@ -56,8 +69,6 @@ export interface Args extends VsArgs {
   "show-versions"?: boolean
   "uninstall-extension"?: string[]
   "proxy-domain"?: string[]
-  locale?: string
-  _: string[]
   "reuse-window"?: boolean
   "new-window"?: boolean
 
@@ -546,7 +557,7 @@ export async function readConfigFile(configPath?: string): Promise<ConfigArgs> {
       flag: "wx", // wx means to fail if the path exists.
     })
     logger.info(`Wrote default config file to ${humanPath(configPath)}`)
-  } catch (error) {
+  } catch (error: any) {
     // EEXIST is fine; we don't want to overwrite existing configurations.
     if (error.code !== "EEXIST") {
       throw error
@@ -670,7 +681,7 @@ export const shouldOpenInExistingInstance = async (args: Args): Promise<string |
   const readSocketPath = async (): Promise<string | undefined> => {
     try {
       return await fs.readFile(path.join(os.tmpdir(), "vscode-ipc"), "utf8")
-    } catch (error) {
+    } catch (error: any) {
       if (error.code !== "ENOENT") {
         throw error
       }
diff --git a/src/node/constants.ts b/src/node/constants.ts
index d36f9a24a800..8b46a986449b 100644
--- a/src/node/constants.ts
+++ b/src/node/constants.ts
@@ -3,11 +3,13 @@ import { JSONSchemaForNPMPackageJsonFiles } from "@schemastore/package"
 import * as os from "os"
 import * as path from "path"
 
+export const WORKBENCH_WEB_CONFIG_ID = "vscode-workbench-web-configuration"
+
 export function getPackageJson(relativePath: string): JSONSchemaForNPMPackageJsonFiles {
   let pkg = {}
   try {
     pkg = require(relativePath)
-  } catch (error) {
+  } catch (error: any) {
     logger.warn(error.message)
   }
 
@@ -19,5 +21,6 @@ const pkg = getPackageJson("../../package.json")
 export const version = pkg.version || "development"
 export const commit = pkg.commit || "development"
 export const rootPath = path.resolve(__dirname, "../..")
+export const vsRootPath = path.join(rootPath, "vendor/modules/code-oss-dev")
 export const tmpdir = path.join(os.tmpdir(), "code-server")
 export const isDevMode = commit === "development"
diff --git a/src/node/entry.ts b/src/node/entry.ts
index 568718781d62..f0600b1de716 100644
--- a/src/node/entry.ts
+++ b/src/node/entry.ts
@@ -9,11 +9,11 @@ import {
 } from "./cli"
 import { commit, version } from "./constants"
 import { openInExistingInstance, runCodeServer, runVsCodeCli } from "./main"
-import * as proxyAgent from "./proxy_agent"
+import { monkeyPatchProxyProtocols } from "./proxy_agent"
 import { isChild, wrapper } from "./wrapper"
 
 async function entry(): Promise<void> {
-  proxyAgent.monkeyPatch(false)
+  monkeyPatchProxyProtocols()
 
   // There's no need to check flags like --help or to spawn in an existing
   // instance for the child process because these would have already happened in
@@ -46,11 +46,13 @@ async function entry(): Promise<void> {
 
   if (args.version) {
     if (args.json) {
-      console.log({
-        codeServer: version,
-        commit,
-        vscode: require("../../vendor/modules/code-oss-dev/package.json").version,
-      })
+      console.log(
+        JSON.stringify({
+          codeServer: version,
+          commit,
+          vscode: require("../../vendor/modules/code-oss-dev/package.json").version,
+        }),
+      )
     } else {
       console.log(version, commit)
     }
diff --git a/src/node/http.ts b/src/node/http.ts
index d7ffa1f144d4..8254e4abf25b 100644
--- a/src/node/http.ts
+++ b/src/node/http.ts
@@ -1,13 +1,14 @@
 import { field, logger } from "@coder/logger"
 import * as express from "express"
 import * as expressCore from "express-serve-static-core"
+import path from "path"
 import qs from "qs"
 import { HttpCode, HttpError } from "../common/http"
-import { normalize, Options } from "../common/util"
+import { normalize } from "../common/util"
 import { AuthType, DefaultedArgs } from "./cli"
-import { commit, rootPath } from "./constants"
+import { version as codeServerVersion } from "./constants"
 import { Heart } from "./heart"
-import { getPasswordMethod, IsCookieValidArgs, isCookieValid, sanitizeString, escapeHtml } from "./util"
+import { getPasswordMethod, IsCookieValidArgs, isCookieValid, sanitizeString, escapeHtml, escapeJSON } from "./util"
 
 declare global {
   // eslint-disable-next-line @typescript-eslint/no-namespace
@@ -19,6 +20,16 @@ declare global {
   }
 }
 
+export const createClientConfiguration = (req: express.Request): CodeServerLib.ClientConfiguration => {
+  const base = relativeRoot(req)
+
+  return {
+    base,
+    csStaticBase: normalize(path.join(base, "_static/")),
+    codeServerVersion,
+  }
+}
+
 /**
  * Replace common variable strings in HTML templates.
  */
@@ -27,18 +38,16 @@ export const replaceTemplates = <T extends object>(
   content: string,
   extraOpts?: Omit<T, "base" | "csStaticBase" | "logLevel">,
 ): string => {
-  const base = relativeRoot(req)
-  const options: Options = {
-    base,
-    csStaticBase: base + "/static/" + commit + rootPath,
-    logLevel: logger.level,
+  const serverOptions: CodeServerLib.ClientConfiguration = {
+    ...createClientConfiguration(req),
     ...extraOpts,
   }
+
   return content
     .replace(/{{TO}}/g, (typeof req.query.to === "string" && escapeHtml(req.query.to)) || "/")
-    .replace(/{{BASE}}/g, options.base)
-    .replace(/{{CS_STATIC_BASE}}/g, options.csStaticBase)
-    .replace(/"{{OPTIONS}}"/, `'${JSON.stringify(options)}'`)
+    .replace(/{{BASE}}/g, serverOptions.base)
+    .replace(/{{CS_STATIC_BASE}}/g, serverOptions.csStaticBase)
+    .replace("{{OPTIONS}}", () => escapeJSON(serverOptions))
 }
 
 /**
diff --git a/src/node/link.ts b/src/node/link.ts
new file mode 100644
index 000000000000..5dfe795228da
--- /dev/null
+++ b/src/node/link.ts
@@ -0,0 +1,22 @@
+import { logger } from "@coder/logger"
+import { spawn } from "child_process"
+import path from "path"
+
+export function startLink(port: number): Promise<void> {
+  logger.debug(`running link targetting ${port}`)
+
+  const agent = spawn(path.resolve(__dirname, "../../lib/linkup"), ["--devurl", `code:${port}:code-server`], {
+    shell: false,
+  })
+  return new Promise((res, rej) => {
+    agent.on("error", rej)
+    agent.on("close", (code) => {
+      if (code !== 0) {
+        return rej({
+          message: `Link exited with ${code}`,
+        })
+      }
+      res()
+    })
+  })
+}
diff --git a/src/node/main.ts b/src/node/main.ts
index 1e9569faef47..ae68406fe661 100644
--- a/src/node/main.ts
+++ b/src/node/main.ts
@@ -1,49 +1,42 @@
 import { field, logger } from "@coder/logger"
-import * as cp from "child_process"
 import http from "http"
-import * as path from "path"
-import { CliMessage, OpenCommandPipeArgs } from "../../typings/ipc"
+import path from "path"
 import { plural } from "../common/util"
 import { createApp, ensureAddress } from "./app"
 import { AuthType, DefaultedArgs, Feature } from "./cli"
 import { coderCloudBind } from "./coder_cloud"
 import { commit, version } from "./constants"
+import { startLink } from "./link"
 import { register } from "./routes"
-import { humanPath, isFile, open } from "./util"
-
-export const runVsCodeCli = (args: DefaultedArgs): void => {
-  logger.debug("forking vs code cli...")
-  const vscode = cp.fork(path.resolve(__dirname, "../../vendor/modules/code-oss-dev/out/vs/server/fork"), [], {
-    env: {
-      ...process.env,
-      CODE_SERVER_PARENT_PID: process.pid.toString(),
-    },
-  })
-  vscode.once("message", (message: any) => {
-    logger.debug("got message from VS Code", field("message", message))
-    if (message.type !== "ready") {
-      logger.error("Unexpected response waiting for ready response", field("type", message.type))
-      process.exit(1)
-    }
-    const send: CliMessage = { type: "cli", args }
-    vscode.send(send)
-  })
-  vscode.once("error", (error) => {
+import { humanPath, isFile, loadAMDModule, open } from "./util"
+
+/**
+ * This is useful when an CLI arg should be passed to VS Code directly,
+ * such as when managing extensions.
+ * @deprecated This should be removed when code-server merges with lib/vscode.
+ */
+export const runVsCodeCli = async (args: DefaultedArgs): Promise<void> => {
+  logger.debug("Running VS Code CLI")
+
+  const cliProcessMain = await loadAMDModule<CodeServerLib.IMainCli["main"]>("vs/code/node/cliProcessMain", "main")
+
+  try {
+    await cliProcessMain(args)
+  } catch (error) {
     logger.error("Got error from VS Code", field("error", error))
-    process.exit(1)
-  })
-  vscode.on("exit", (code) => process.exit(code || 0))
+  }
+
+  process.exit(0)
 }
 
 export const openInExistingInstance = async (args: DefaultedArgs, socketPath: string): Promise<void> => {
-  const pipeArgs: OpenCommandPipeArgs & { fileURIs: string[] } = {
+  const pipeArgs: CodeServerLib.OpenCommandPipeArgs & { fileURIs: string[] } = {
     type: "open",
     folderURIs: [],
     fileURIs: [],
     forceReuseWindow: args["reuse-window"],
     forceNewWindow: args["new-window"],
   }
-
   for (let i = 0; i < args._.length; i++) {
     const fp = path.resolve(args._[i])
     if (await isFile(fp)) {
@@ -52,17 +45,14 @@ export const openInExistingInstance = async (args: DefaultedArgs, socketPath: st
       pipeArgs.folderURIs.push(fp)
     }
   }
-
   if (pipeArgs.forceNewWindow && pipeArgs.fileURIs.length > 0) {
     logger.error("--new-window can only be used with folder paths")
     process.exit(1)
   }
-
   if (pipeArgs.folderURIs.length === 0 && pipeArgs.fileURIs.length === 0) {
     logger.error("Please specify at least one file or folder")
     process.exit(1)
   }
-
   const vscode = http.request(
     {
       path: "/",
@@ -129,6 +119,15 @@ export const runCodeServer = async (args: DefaultedArgs): Promise<http.Server> =
     logger.info("  - Connected to cloud agent")
   }
 
+  try {
+    const port = parseInt(serverAddress.split(":").pop() as string, 10)
+    startLink(port).catch((ex) => {
+      logger.debug("Link daemon exited!", field("error", ex))
+    })
+  } catch (error) {
+    logger.debug("Failed to start link daemon!", error as any)
+  }
+
   if (args.enable && args.enable.length > 0) {
     logger.info("Enabling the following experimental features:")
     args.enable.forEach((feature) => {
diff --git a/src/node/plugin.ts b/src/node/plugin.ts
index 036e118e88c9..69f32720c27c 100644
--- a/src/node/plugin.ts
+++ b/src/node/plugin.ts
@@ -172,9 +172,9 @@ export class PluginAPI {
         }
         await this.loadPlugin(path.join(dir, ent.name))
       }
-    } catch (err) {
-      if (err.code !== "ENOENT") {
-        this.logger.warn(`failed to load plugins from ${q(dir)}: ${err.message}`)
+    } catch (error: any) {
+      if (error.code !== "ENOENT") {
+        this.logger.warn(`failed to load plugins from ${q(dir)}: ${error.message}`)
       }
     }
   }
@@ -195,9 +195,9 @@ export class PluginAPI {
       }
       const p = this._loadPlugin(dir, packageJSON)
       this.plugins.set(p.name, p)
-    } catch (err) {
-      if (err.code !== "ENOENT") {
-        this.logger.warn(`failed to load plugin: ${err.stack}`)
+    } catch (error: any) {
+      if (error.code !== "ENOENT") {
+        this.logger.warn(`failed to load plugin: ${error.stack}`)
       }
     }
   }
@@ -278,7 +278,7 @@ export class PluginAPI {
         }
         try {
           await p.deinit()
-        } catch (error) {
+        } catch (error: any) {
           this.logger.error("plugin failed to deinit", field("name", p.name), field("error", error.message))
         }
       }),
diff --git a/src/node/proxy_agent.ts b/src/node/proxy_agent.ts
index 39607c8da81f..35b38ba75378 100644
--- a/src/node/proxy_agent.ts
+++ b/src/node/proxy_agent.ts
@@ -1,7 +1,10 @@
-import { logger } from "@coder/logger"
-import * as http from "http"
-import * as proxyAgent from "proxy-agent"
-import * as proxyFromEnv from "proxy-from-env"
+/*---------------------------------------------------------------------------------------------
+ *  Copyright (c) Coder Technologies. All rights reserved.
+ *  Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import ProxyAgent from "proxy-agent"
+import { getProxyForUrl } from "proxy-from-env"
 
 /**
  * This file has nothing to do with the code-server proxy.
@@ -11,10 +14,6 @@ import * as proxyFromEnv from "proxy-from-env"
  * - https://www.npmjs.com/package/proxy-agent
  * - https://www.npmjs.com/package/proxy-from-env
  *
- * This file exists in two locations:
- * - src/node/proxy_agent.ts
- * - lib/vscode/src/vs/base/node/proxy_agent.ts
- * The second is a symlink to the first.
  */
 
 /**
@@ -31,50 +30,41 @@ import * as proxyFromEnv from "proxy-from-env"
  * Even if they do, it's probably the same proxy so we should be fine! And those knobs
  * are deprecated anyway.
  */
-export function monkeyPatch(inVSCode: boolean): void {
-  if (shouldEnableProxy()) {
-    const http = require("http")
-    const https = require("https")
-
-    // If we do not pass in a proxy URL, proxy-agent will get the URL from the environment.
-    // See https://www.npmjs.com/package/proxy-from-env.
-    // Also see shouldEnableProxy.
-    const pa = newProxyAgent(inVSCode)
-    http.globalAgent = pa
-    https.globalAgent = pa
+export function monkeyPatchProxyProtocols(): void {
+  if (!shouldEnableProxy()) {
+    return
   }
-}
 
-function newProxyAgent(inVSCode: boolean): http.Agent {
-  // The reasoning for this split is that VS Code's build process does not have
-  // esModuleInterop enabled but the code-server one does. As a result depending on where
-  // we execute, we either have a default attribute or we don't.
-  //
-  // I can't enable esModuleInterop in VS Code's build process as it breaks and spits out
-  // a huge number of errors. And we can't use require as otherwise the modules won't be
-  // included in the final product.
-  if (inVSCode) {
-    return new (proxyAgent as any)()
-  } else {
-    return new (proxyAgent as any).default()
-  }
+  const http = require("http")
+  const https = require("https")
+
+  // If we do not pass in a proxy URL, proxy-agent will get the URL from the environment.
+  // See https://www.npmjs.com/package/proxy-from-env.
+  // Also see shouldEnableProxy.
+  const pa = new ProxyAgent()
+  http.globalAgent = pa
+  https.globalAgent = pa
 }
 
+const sampleUrls = [new URL("http://example.com"), new URL("https://example.com")]
+
 // If they have $NO_PROXY set to example.com then this check won't work!
 // But that's drastically unlikely.
 export function shouldEnableProxy(): boolean {
-  let shouldEnable = false
+  const testedProxyEndpoints = sampleUrls.map((url) => {
+    return {
+      url,
+      proxyUrl: getProxyForUrl(url.toString()),
+    }
+  })
 
-  const httpProxy = proxyFromEnv.getProxyForUrl(`http://example.com`)
-  if (httpProxy) {
-    shouldEnable = true
-    logger.debug(`using $HTTP_PROXY ${httpProxy}`)
-  }
+  let shouldEnable = false
 
-  const httpsProxy = proxyFromEnv.getProxyForUrl(`https://example.com`)
-  if (httpsProxy) {
-    shouldEnable = true
-    logger.debug(`using $HTTPS_PROXY ${httpsProxy}`)
+  for (const { url, proxyUrl } of testedProxyEndpoints) {
+    if (proxyUrl) {
+      console.debug(`${url.protocol} -- Using "${proxyUrl}"`)
+      shouldEnable = true
+    }
   }
 
   return shouldEnable
diff --git a/src/node/routes/errors.ts b/src/node/routes/errors.ts
new file mode 100644
index 000000000000..757e9f7449d5
--- /dev/null
+++ b/src/node/routes/errors.ts
@@ -0,0 +1,45 @@
+import { logger } from "@coder/logger"
+import express from "express"
+import { promises as fs } from "fs"
+import path from "path"
+import { WebsocketRequest } from "../../../typings/pluginapi"
+import { HttpCode } from "../../common/http"
+import { rootPath } from "../constants"
+import { replaceTemplates } from "../http"
+import { getMediaMime } from "../util"
+
+const notFoundCodes = ["ENOENT", "EISDIR", "FileNotFound"]
+export const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => {
+  if (notFoundCodes.includes(err.code)) {
+    err.status = HttpCode.NotFound
+  }
+
+  const status = err.status ?? err.statusCode ?? 500
+  res.status(status)
+
+  // Assume anything that explicitly accepts text/html is a user browsing a
+  // page (as opposed to an xhr request). Don't use `req.accepts()` since
+  // *every* request that I've seen (in Firefox and Chromium at least)
+  // includes `*/*` making it always truthy. Even for css/javascript.
+  if (req.headers.accept && req.headers.accept.includes("text/html")) {
+    const resourcePath = path.resolve(rootPath, "src/browser/pages/error.html")
+    res.set("Content-Type", getMediaMime(resourcePath))
+    const content = await fs.readFile(resourcePath, "utf8")
+    res.send(
+      replaceTemplates(req, content)
+        .replace(/{{ERROR_TITLE}}/g, status)
+        .replace(/{{ERROR_HEADER}}/g, status)
+        .replace(/{{ERROR_BODY}}/g, err.message),
+    )
+  } else {
+    res.json({
+      error: err.message,
+      ...(err.details || {}),
+    })
+  }
+}
+
+export const wsErrorHandler: express.ErrorRequestHandler = async (err, req, res, next) => {
+  logger.error(`${err.message} ${err.stack}`)
+  ;(req as WebsocketRequest).ws.end()
+}
diff --git a/src/node/routes/index.ts b/src/node/routes/index.ts
index 42edbe117a24..08a2dcc18421 100644
--- a/src/node/routes/index.ts
+++ b/src/node/routes/index.ts
@@ -1,5 +1,4 @@
 import { logger } from "@coder/logger"
-import bodyParser from "body-parser"
 import cookieParser from "cookie-parser"
 import * as express from "express"
 import { promises as fs } from "fs"
@@ -10,22 +9,21 @@ import * as pluginapi from "../../../typings/pluginapi"
 import { HttpCode, HttpError } from "../../common/http"
 import { plural } from "../../common/util"
 import { AuthType, DefaultedArgs } from "../cli"
-import { rootPath } from "../constants"
+import { commit, isDevMode, rootPath } from "../constants"
 import { Heart } from "../heart"
-import { ensureAuthenticated, redirect, replaceTemplates } from "../http"
+import { ensureAuthenticated, redirect } from "../http"
 import { PluginAPI } from "../plugin"
 import { getMediaMime, paths } from "../util"
 import { wrapper } from "../wrapper"
 import * as apps from "./apps"
 import * as domainProxy from "./domainProxy"
+import { errorHandler, wsErrorHandler } from "./errors"
 import * as health from "./health"
 import * as login from "./login"
 import * as logout from "./logout"
 import * as pathProxy from "./pathProxy"
-// static is a reserved keyword.
-import * as _static from "./static"
 import * as update from "./update"
-import * as vscode from "./vscode"
+import { createVSServerRouter, VSServerResult } from "./vscode"
 
 /**
  * Register all routes and middleware.
@@ -124,13 +122,15 @@ export const register = async (
     wrapper.onDispose(() => pluginApi.dispose())
   }
 
-  app.use(bodyParser.json())
-  app.use(bodyParser.urlencoded({ extended: true }))
+  app.use(express.json())
+  app.use(express.urlencoded({ extended: true }))
 
-  app.use("/", vscode.router)
-  wsApp.use("/", vscode.wsRouter.router)
-  app.use("/vscode", vscode.router)
-  wsApp.use("/vscode", vscode.wsRouter.router)
+  app.use(
+    "/_static",
+    express.static(rootPath, {
+      cacheControl: commit !== "development",
+    }),
+  )
 
   app.use("/healthz", health.router)
   wsApp.use("/healthz", health.wsRouter.router)
@@ -143,49 +143,32 @@ export const register = async (
     app.all("/logout", (req, res) => redirect(req, res, "/", {}))
   }
 
-  app.use("/static", _static.router)
   app.use("/update", update.router)
 
-  app.use(() => {
-    throw new HttpError("Not Found", HttpCode.NotFound)
-  })
-
-  const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => {
-    if (err.code === "ENOENT" || err.code === "EISDIR") {
-      err.status = HttpCode.NotFound
-    }
-
-    const status = err.status ?? err.statusCode ?? 500
-    res.status(status)
-
-    // Assume anything that explicitly accepts text/html is a user browsing a
-    // page (as opposed to an xhr request). Don't use `req.accepts()` since
-    // *every* request that I've seen (in Firefox and Chromium at least)
-    // includes `*/*` making it always truthy. Even for css/javascript.
-    if (req.headers.accept && req.headers.accept.includes("text/html")) {
-      const resourcePath = path.resolve(rootPath, "src/browser/pages/error.html")
-      res.set("Content-Type", getMediaMime(resourcePath))
-      const content = await fs.readFile(resourcePath, "utf8")
-      res.send(
-        replaceTemplates(req, content)
-          .replace(/{{ERROR_TITLE}}/g, status)
-          .replace(/{{ERROR_HEADER}}/g, status)
-          .replace(/{{ERROR_BODY}}/g, err.message),
-      )
+  let vscode: VSServerResult
+  try {
+    vscode = await createVSServerRouter(args)
+    app.use("/", vscode.router)
+    wsApp.use("/", vscode.wsRouter.router)
+    app.use("/vscode", vscode.router)
+    wsApp.use("/vscode", vscode.wsRouter.router)
+  } catch (error: any) {
+    if (isDevMode) {
+      logger.warn(error)
+      logger.warn("VS Server router may still be compiling.")
     } else {
-      res.json({
-        error: err.message,
-        ...(err.details || {}),
-      })
+      throw error
     }
   }
 
-  app.use(errorHandler)
+  server.on("close", () => {
+    vscode.vscodeServer.close()
+  })
 
-  const wsErrorHandler: express.ErrorRequestHandler = async (err, req, res, next) => {
-    logger.error(`${err.message} ${err.stack}`)
-    ;(req as pluginapi.WebsocketRequest).ws.end()
-  }
+  app.use(() => {
+    throw new HttpError("Not Found", HttpCode.NotFound)
+  })
 
+  app.use(errorHandler)
   wsApp.use(wsErrorHandler)
 }
diff --git a/src/node/routes/login.ts b/src/node/routes/login.ts
index 999b8dfaf5b9..8b8164f16b4e 100644
--- a/src/node/routes/login.ts
+++ b/src/node/routes/login.ts
@@ -111,7 +111,7 @@ router.post("/", async (req, res) => {
     )
 
     throw new Error("Incorrect password")
-  } catch (error) {
+  } catch (error: any) {
     const renderedHtml = await getRoot(req, error)
     res.send(renderedHtml)
   }
diff --git a/src/node/routes/static.ts b/src/node/routes/static.ts
deleted file mode 100644
index 29a1ad3bc7ed..000000000000
--- a/src/node/routes/static.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { field, logger } from "@coder/logger"
-import { Router } from "express"
-import { promises as fs } from "fs"
-import * as path from "path"
-import { Readable } from "stream"
-import * as tarFs from "tar-fs"
-import * as zlib from "zlib"
-import { HttpCode, HttpError } from "../../common/http"
-import { getFirstString } from "../../common/util"
-import { rootPath } from "../constants"
-import { authenticated, ensureAuthenticated, replaceTemplates } from "../http"
-import { getMediaMime, pathToFsPath } from "../util"
-
-export const router = Router()
-
-// The commit is for caching.
-router.get("/(:commit)(/*)?", async (req, res) => {
-  // Used by VS Code to load extensions into the web worker.
-  const tar = getFirstString(req.query.tar)
-  if (tar) {
-    await ensureAuthenticated(req)
-    let stream: Readable = tarFs.pack(pathToFsPath(tar))
-    if (req.headers["accept-encoding"] && req.headers["accept-encoding"].includes("gzip")) {
-      logger.debug("gzipping tar", field("path", tar))
-      const compress = zlib.createGzip()
-      stream.pipe(compress)
-      stream.on("error", (error) => compress.destroy(error))
-      stream.on("close", () => compress.end())
-      stream = compress
-      res.header("content-encoding", "gzip")
-    }
-    res.set("Content-Type", "application/x-tar")
-    stream.on("close", () => res.end())
-    return stream.pipe(res)
-  }
-
-  // If not a tar use the remainder of the path to load the resource.
-  if (!req.params[0]) {
-    throw new HttpError("Not Found", HttpCode.NotFound)
-  }
-
-  const resourcePath = path.resolve(req.params[0])
-
-  // Make sure it's in code-server if you aren't authenticated. This lets
-  // unauthenticated users load the login assets.
-  const isAuthenticated = await authenticated(req)
-  if (!resourcePath.startsWith(rootPath) && !isAuthenticated) {
-    throw new HttpError("Unauthorized", HttpCode.Unauthorized)
-  }
-
-  // Don't cache during development. - can also be used if you want to make a
-  // static request without caching.
-  if (req.params.commit !== "development" && req.params.commit !== "-") {
-    res.header("Cache-Control", "public, max-age=31536000")
-  }
-
-  // Without this the default is to use the directory the script loaded from.
-  if (req.headers["service-worker"]) {
-    res.header("service-worker-allowed", "/")
-  }
-
-  res.set("Content-Type", getMediaMime(resourcePath))
-
-  if (resourcePath.endsWith("manifest.json")) {
-    const content = await fs.readFile(resourcePath, "utf8")
-    return res.send(replaceTemplates(req, content))
-  }
-
-  const content = await fs.readFile(resourcePath)
-  return res.send(content)
-})
diff --git a/src/node/routes/vscode.ts b/src/node/routes/vscode.ts
index d91abb4b0536..4244d2ceae1d 100644
--- a/src/node/routes/vscode.ts
+++ b/src/node/routes/vscode.ts
@@ -1,232 +1,73 @@
-import * as crypto from "crypto"
-import { Request, Router } from "express"
-import { promises as fs } from "fs"
-import * as path from "path"
-import qs from "qs"
-import * as ipc from "../../../typings/ipc"
-import { Emitter } from "../../common/emitter"
-import { HttpCode, HttpError } from "../../common/http"
-import { getFirstString } from "../../common/util"
-import { Feature } from "../cli"
-import { isDevMode, rootPath, version } from "../constants"
-import { authenticated, ensureAuthenticated, redirect, replaceTemplates } from "../http"
-import { getMediaMime, pathToFsPath } from "../util"
-import { VscodeProvider } from "../vscode"
-import { Router as WsRouter } from "../wsRouter"
-
-export const router = Router()
-
-const vscode = new VscodeProvider()
-
-router.get("/", async (req, res) => {
-  const isAuthenticated = await authenticated(req)
-  if (!isAuthenticated) {
-    return redirect(req, res, "login", {
-      // req.baseUrl can be blank if already at the root.
-      to: req.baseUrl && req.baseUrl !== "/" ? req.baseUrl : undefined,
-    })
-  }
-
-  const [content, options] = await Promise.all([
-    await fs.readFile(path.join(rootPath, "src/browser/pages/vscode.html"), "utf8"),
-    (async () => {
-      try {
-        return await vscode.initialize({ args: req.args, remoteAuthority: req.headers.host || "" }, req.query)
-      } catch (error) {
-        const devMessage = isDevMode ? "It might not have finished compiling." : ""
-        throw new Error(`VS Code failed to load. ${devMessage} ${error.message}`)
-      }
-    })(),
-  ])
-
-  options.productConfiguration.codeServerVersion = version
-
-  res.send(
-    replaceTemplates<ipc.Options>(
-      req,
-      // Uncomment prod blocks if not in development. TODO: Would this be
-      // better as a build step? Or maintain two HTML files again?
-      !isDevMode ? content.replace(/<!-- PROD_ONLY/g, "").replace(/END_PROD_ONLY -->/g, "") : content,
-      {
-        authed: req.args.auth !== "none",
-        disableUpdateCheck: !!req.args["disable-update-check"],
-      },
-    )
-      .replace(`"{{REMOTE_USER_DATA_URI}}"`, `'${JSON.stringify(options.remoteUserDataUri)}'`)
-      .replace(`"{{PRODUCT_CONFIGURATION}}"`, `'${JSON.stringify(options.productConfiguration)}'`)
-      .replace(`"{{WORKBENCH_WEB_CONFIGURATION}}"`, `'${JSON.stringify(options.workbenchWebConfiguration)}'`)
-      .replace(`"{{NLS_CONFIGURATION}}"`, `'${JSON.stringify(options.nlsConfiguration)}'`),
-  )
-})
-
-/**
- * TODO: Might currently be unused.
- */
-router.get("/resource(/*)?", ensureAuthenticated, async (req, res) => {
-  const path = getFirstString(req.query.path)
-  if (path) {
-    res.set("Content-Type", getMediaMime(path))
-    res.send(await fs.readFile(pathToFsPath(path)))
-  }
-})
-
-/**
- * Used by VS Code to load files.
- */
-router.get("/vscode-remote-resource(/*)?", ensureAuthenticated, async (req, res) => {
-  const path = getFirstString(req.query.path)
-  if (path) {
-    res.set("Content-Type", getMediaMime(path))
-    res.send(await fs.readFile(pathToFsPath(path)))
-  }
-})
-
-/**
- * VS Code webviews use these paths to load files and to load webview assets
- * like HTML and JavaScript.
- */
-router.get("/webview/*", ensureAuthenticated, async (req, res) => {
-  res.set("Content-Type", getMediaMime(req.path))
-  if (/^vscode-resource/.test(req.params[0])) {
-    return res.send(await fs.readFile(req.params[0].replace(/^vscode-resource(\/file)?/, "")))
-  }
-  return res.send(
-    await fs.readFile(path.join(vscode.vsRootPath, "out/vs/workbench/contrib/webview/browser/pre", req.params[0])),
-  )
-})
-
-interface Callback {
-  uri: {
-    scheme: string
-    authority?: string
-    path?: string
-    query?: string
-    fragment?: string
-  }
-  timeout: NodeJS.Timeout
+import * as express from "express"
+import { Server } from "http"
+import path from "path"
+import { AuthType, DefaultedArgs } from "../cli"
+import { version as codeServerVersion, vsRootPath } from "../constants"
+import { ensureAuthenticated } from "../http"
+import { loadAMDModule } from "../util"
+import { Router as WsRouter, WebsocketRouter } from "../wsRouter"
+import { errorHandler } from "./errors"
+
+export interface VSServerResult {
+  router: express.Router
+  wsRouter: WebsocketRouter
+  vscodeServer: Server
 }
 
-const callbacks = new Map<string, Callback>()
-const callbackEmitter = new Emitter<{ id: string; callback: Callback }>()
+export const createVSServerRouter = async (args: DefaultedArgs): Promise<VSServerResult> => {
+  // Delete `VSCODE_CWD` very early even before
+  // importing bootstrap files. We have seen
+  // reports where `code .` would use the wrong
+  // current working directory due to our variable
+  // somehow escaping to the parent shell
+  // (https://github.com/microsoft/vscode/issues/126399)
+  delete process.env["VSCODE_CWD"]
 
-/**
- * Get vscode-requestId from the query and throw if it's missing or invalid.
- */
-const getRequestId = (req: Request): string => {
-  if (!req.query["vscode-requestId"]) {
-    throw new HttpError("vscode-requestId is missing", HttpCode.BadRequest)
-  }
+  const bootstrap = require(path.join(vsRootPath, "out", "bootstrap"))
+  const bootstrapNode = require(path.join(vsRootPath, "out", "bootstrap-node"))
+  const product = require(path.join(vsRootPath, "product.json"))
 
-  if (typeof req.query["vscode-requestId"] !== "string") {
-    throw new HttpError("vscode-requestId is not a string", HttpCode.BadRequest)
-  }
+  // Avoid Monkey Patches from Application Insights
+  bootstrap.avoidMonkeyPatchFromAppInsights()
 
-  return req.query["vscode-requestId"]
-}
+  // Enable portable support
+  bootstrapNode.configurePortable(product)
 
-// Matches VS Code's fetch timeout.
-const fetchTimeout = 5 * 60 * 1000
+  // Enable ASAR support
+  bootstrap.enableASARSupport()
 
-// The callback endpoints are used during authentication. A URI is stored on
-// /callback and then fetched later on /fetch-callback.
-// See ../../../lib/vscode/resources/web/code-web.js
-router.get("/callback", ensureAuthenticated, async (req, res) => {
-  const uriKeys = [
-    "vscode-requestId",
-    "vscode-scheme",
-    "vscode-authority",
-    "vscode-path",
-    "vscode-query",
-    "vscode-fragment",
-  ]
+  // Signal processes that we got launched as CLI
+  process.env["VSCODE_CLI"] = "1"
 
-  const id = getRequestId(req)
+  const vscodeServerMain = await loadAMDModule<CodeServerLib.CreateVSServer>("vs/server/entry", "createVSServer")
 
-  // Move any query variables that aren't URI keys into the URI's query
-  // (importantly, this will include the code for oauth).
-  const query: qs.ParsedQs = {}
-  for (const key in req.query) {
-    if (!uriKeys.includes(key)) {
-      query[key] = req.query[key]
-    }
-  }
-
-  const callback = {
-    uri: {
-      scheme: getFirstString(req.query["vscode-scheme"]) || "code-oss",
-      authority: getFirstString(req.query["vscode-authority"]),
-      path: getFirstString(req.query["vscode-path"]),
-      query: (getFirstString(req.query.query) || "") + "&" + qs.stringify(query),
-      fragment: getFirstString(req.query["vscode-fragment"]),
-    },
-    // Make sure the map doesn't leak if nothing fetches this URI.
-    timeout: setTimeout(() => callbacks.delete(id), fetchTimeout),
-  }
-
-  callbacks.set(id, callback)
-  callbackEmitter.emit({ id, callback })
-
-  res.sendFile(path.join(rootPath, "vendor/modules/code-oss-dev/resources/web/callback.html"))
-})
-
-router.get("/fetch-callback", ensureAuthenticated, async (req, res) => {
-  const id = getRequestId(req)
-
-  const send = (callback: Callback) => {
-    clearTimeout(callback.timeout)
-    callbacks.delete(id)
-    res.json(callback.uri)
-  }
-
-  const callback = callbacks.get(id)
-  if (callback) {
-    return send(callback)
-  }
-
-  // VS Code will try again if the route returns no content but it seems more
-  // efficient to just wait on this request for as long as possible?
-  const handler = callbackEmitter.event(({ id: emitId, callback }) => {
-    if (id === emitId) {
-      handler.dispose()
-      send(callback)
-    }
+  const serverUrl = new URL(`${args.cert ? "https" : "http"}://${args.host}:${args.port}`)
+  const vscodeServer = await vscodeServerMain({
+    codeServerVersion,
+    serverUrl,
+    args,
+    authed: args.auth !== AuthType.None,
+    disableUpdateCheck: !!args["disable-update-check"],
   })
 
-  // If the client closes the connection.
-  req.on("close", () => handler.dispose())
-})
+  const router = express.Router()
+  const wsRouter = WsRouter()
 
-export const wsRouter = WsRouter()
+  router.all("*", ensureAuthenticated, (req, res, next) => {
+    req.on("error", (error) => errorHandler(error, req, res, next))
 
-wsRouter.ws("/", ensureAuthenticated, async (req) => {
-  const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
-  const reply = crypto
-    .createHash("sha1")
-    .update(req.headers["sec-websocket-key"] + magic)
-    .digest("base64")
-
-  const responseHeaders = [
-    "HTTP/1.1 101 Switching Protocols",
-    "Upgrade: websocket",
-    "Connection: Upgrade",
-    `Sec-WebSocket-Accept: ${reply}`,
-  ]
+    vscodeServer.emit("request", req, res)
+  })
 
-  // See if the browser reports it supports web socket compression.
-  // TODO: Parse this header properly.
-  const extensions = req.headers["sec-websocket-extensions"]
-  const isCompressionSupported = extensions ? extensions.includes("permessage-deflate") : false
+  wsRouter.ws("/", ensureAuthenticated, (req) => {
+    vscodeServer.emit("upgrade", req, req.socket, req.head)
 
-  // TODO: For now we only use compression if the user enables it.
-  const isCompressionEnabled = !!req.args.enable?.includes(Feature.PermessageDeflate)
+    req.socket.resume()
+  })
 
-  const useCompression = isCompressionEnabled && isCompressionSupported
-  if (useCompression) {
-    // This response header tells the browser the server supports compression.
-    responseHeaders.push("Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15")
+  return {
+    router,
+    wsRouter,
+    vscodeServer,
   }
-
-  req.ws.write(responseHeaders.join("\r\n") + "\r\n\r\n")
-
-  await vscode.sendWebsocket(req.ws, req.query, useCompression)
-})
+}
diff --git a/src/node/settings.ts b/src/node/settings.ts
index ee955aad9e99..4cce755a8a08 100644
--- a/src/node/settings.ts
+++ b/src/node/settings.ts
@@ -20,7 +20,7 @@ export class SettingsProvider<T> {
     try {
       const raw = (await fs.readFile(this.settingsPath, "utf8")).trim()
       return raw ? JSON.parse(raw) : {}
-    } catch (error) {
+    } catch (error: any) {
       if (error.code !== "ENOENT") {
         logger.warn(error.message)
       }
@@ -37,7 +37,7 @@ export class SettingsProvider<T> {
       const oldSettings = await this.read()
       const nextSettings = { ...oldSettings, ...settings }
       await fs.writeFile(this.settingsPath, JSON.stringify(nextSettings, null, 2))
-    } catch (error) {
+    } catch (error: any) {
       logger.warn(error.message)
     }
   }
diff --git a/src/node/update.ts b/src/node/update.ts
index 6f9aa39e58c7..e9679fa42a21 100644
--- a/src/node/update.ts
+++ b/src/node/update.ts
@@ -60,7 +60,7 @@ export class UpdateProvider {
       }
       logger.debug("got latest version", field("latest", update.version))
       return update
-    } catch (error) {
+    } catch (error: any) {
       logger.error("Failed to get latest version", field("error", error.message))
       return {
         checked: now,
diff --git a/src/node/uriTransformer.ts b/src/node/uriTransformer.ts
deleted file mode 100644
index 50d07b1ce71b..000000000000
--- a/src/node/uriTransformer.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-// In a bit of a hack, this file is stored in two places
-// - src/node/uri_transformer.ts
-// - lib/vscode/src/vs/server/uriTransformer.ts
-
-// The reason for this is that we need a CommonJS-compiled
-// version of this file to supply as a command line argument
-// to extensionHostProcessSetup.ts; but we also need to include
-// it ourselves cleanly in `lib/vscode/src/vs/server`.
-
-// @oxy: Could not figure out how to compile as a CommonJS module
-// in the same tree as VSCode, which is why I came up with the solution
-// of storing it in two places.
-
-// NOTE: copied over from lib/vscode/src/vs/common/uriIpc.ts
-// remember to update this for proper type checks!
-
-interface UriParts {
-  scheme: string
-  authority?: string
-  path?: string
-}
-
-interface IRawURITransformer {
-  transformIncoming(uri: UriParts): UriParts
-  transformOutgoing(uri: UriParts): UriParts
-  transformOutgoingScheme(scheme: string): string
-}
-
-// Using `export =` is deliberate.
-// See lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts;
-// they include the file directly with a node require and expect a function as `module.exports`.
-// `export =` in TypeScript is equivalent to `module.exports =` in vanilla JS.
-export = function rawURITransformerFactory(authority: string) {
-  return new RawURITransformer(authority)
-}
-
-class RawURITransformer implements IRawURITransformer {
-  constructor(private readonly authority: string) {}
-
-  transformIncoming(uri: UriParts): UriParts {
-    switch (uri.scheme) {
-      case "vscode-remote":
-        return { scheme: "file", path: uri.path }
-      default:
-        return uri
-    }
-  }
-
-  transformOutgoing(uri: UriParts): UriParts {
-    switch (uri.scheme) {
-      case "file":
-        return { scheme: "vscode-remote", authority: this.authority, path: uri.path }
-      default:
-        return uri
-    }
-  }
-
-  transformOutgoingScheme(scheme: string): string {
-    switch (scheme) {
-      case "file":
-        return "vscode-remote"
-      default:
-        return scheme
-    }
-  }
-}
diff --git a/src/node/util.ts b/src/node/util.ts
index ce92a3522535..4f3078a623f2 100644
--- a/src/node/util.ts
+++ b/src/node/util.ts
@@ -10,7 +10,7 @@ import * as path from "path"
 import safeCompare from "safe-compare"
 import * as util from "util"
 import xdgBasedir from "xdg-basedir"
-import { getFirstString } from "../common/util"
+import { vsRootPath } from "./constants"
 
 export interface Paths {
   data: string
@@ -157,7 +157,7 @@ export const generatePassword = async (length = 24): Promise<string> => {
 export const hash = async (password: string): Promise<string> => {
   try {
     return await argon2.hash(password)
-  } catch (error) {
+  } catch (error: any) {
     logger.error(error)
     return ""
   }
@@ -172,7 +172,7 @@ export const isHashMatch = async (password: string, hash: string) => {
   }
   try {
     return await argon2.verify(hash, password)
-  } catch (error) {
+  } catch (error: any) {
     throw new Error(error)
   }
 }
@@ -439,55 +439,6 @@ export const isObject = <T extends object>(obj: T): obj is T => {
   return !Array.isArray(obj) && typeof obj === "object" && obj !== null
 }
 
-/**
- * Taken from vs/base/common/charCode.ts. Copied for now instead of importing so
- * we don't have to set up a `vs` alias to be able to import with types (since
- * the alternative is to directly import from `out`).
- */
-enum CharCode {
-  Slash = 47,
-  A = 65,
-  Z = 90,
-  a = 97,
-  z = 122,
-  Colon = 58,
-}
-
-/**
- * Compute `fsPath` for the given uri.
- * Taken from vs/base/common/uri.ts. It's not imported to avoid also importing
- * everything that file imports.
- */
-export function pathToFsPath(path: string, keepDriveLetterCasing = false): string {
-  const isWindows = process.platform === "win32"
-  const uri = { authority: undefined, path: getFirstString(path) || "", scheme: "file" }
-  let value: string
-
-  if (uri.authority && uri.path.length > 1 && uri.scheme === "file") {
-    // unc path: file://shares/c$/far/boo
-    value = `//${uri.authority}${uri.path}`
-  } else if (
-    uri.path.charCodeAt(0) === CharCode.Slash &&
-    ((uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z) ||
-      (uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)) &&
-    uri.path.charCodeAt(2) === CharCode.Colon
-  ) {
-    if (!keepDriveLetterCasing) {
-      // windows drive letter: file:///c:/far/boo
-      value = uri.path[1].toLowerCase() + uri.path.substr(2)
-    } else {
-      value = uri.path.substr(1)
-    }
-  } else {
-    // other path
-    value = uri.path
-  }
-  if (isWindows) {
-    value = value.replace(/\//g, "\\")
-  }
-  return value
-}
-
 /**
  * Return a promise that resolves with whether the socket path is active.
  */
@@ -533,3 +484,23 @@ export function escapeHtml(unsafe: string): string {
 export function isNodeJSErrnoException(error: unknown): error is NodeJS.ErrnoException {
   return error instanceof Error && (error as NodeJS.ErrnoException).code !== undefined
 }
+
+// TODO: Replace with proper templating system.
+export const escapeJSON = (value: cp.Serializable) => JSON.stringify(value).replace(/"/g, "&quot;")
+
+type AMDModule<T> = { [exportName: string]: T }
+
+/**
+ * Loads AMD module, typically from a compiled VSCode bundle.
+ *
+ * @deprecated This should be gradually phased out as code-server migrates to lib/vscode
+ * @param amdPath Path to module relative to lib/vscode
+ * @param exportName Given name of export in the file
+ */
+export const loadAMDModule = async <T>(amdPath: string, exportName: string): Promise<T> => {
+  const module = await new Promise<AMDModule<T>>((resolve, reject) => {
+    require(path.join(vsRootPath, "out/bootstrap-amd")).load(amdPath, resolve, reject)
+  })
+
+  return module[exportName] as T
+}
diff --git a/src/node/vscode.ts b/src/node/vscode.ts
deleted file mode 100644
index 2c07f7ce20b7..000000000000
--- a/src/node/vscode.ts
+++ /dev/null
@@ -1,168 +0,0 @@
-import { logger } from "@coder/logger"
-import * as cp from "child_process"
-import * as net from "net"
-import * as path from "path"
-import * as ipc from "../../typings/ipc"
-import { arrayify, generateUuid } from "../common/util"
-import { rootPath } from "./constants"
-import { settings } from "./settings"
-import { SocketProxyProvider } from "./socket"
-import { isFile } from "./util"
-import { onMessage, wrapper } from "./wrapper"
-
-export class VscodeProvider {
-  public readonly serverRootPath: string
-  public readonly vsRootPath: string
-  private _vscode?: Promise<cp.ChildProcess>
-  private readonly socketProvider = new SocketProxyProvider()
-
-  public constructor() {
-    this.vsRootPath = path.resolve(rootPath, "vendor/modules/code-oss-dev")
-    this.serverRootPath = path.join(this.vsRootPath, "out/vs/server")
-    wrapper.onDispose(() => this.dispose())
-  }
-
-  public async dispose(): Promise<void> {
-    this.socketProvider.stop()
-    if (this._vscode) {
-      const vscode = await this._vscode
-      vscode.removeAllListeners()
-      vscode.kill()
-      this._vscode = undefined
-    }
-  }
-
-  public async initialize(
-    options: Omit<ipc.VscodeOptions, "startPath">,
-    query: ipc.Query,
-  ): Promise<ipc.WorkbenchOptions> {
-    const { lastVisited } = await settings.read()
-    let startPath = await this.getFirstPath([
-      { url: query.workspace, workspace: true },
-      { url: query.folder, workspace: false },
-      options.args._ && options.args._.length > 0
-        ? { url: path.resolve(options.args._[options.args._.length - 1]) }
-        : undefined,
-      !options.args["ignore-last-opened"] ? lastVisited : undefined,
-    ])
-
-    if (query.ew) {
-      startPath = undefined
-    }
-
-    settings.write({
-      lastVisited: startPath,
-      query,
-    })
-
-    const id = generateUuid()
-    const vscode = await this.fork()
-
-    logger.debug("setting up vs code...")
-
-    this.send(
-      {
-        type: "init",
-        id,
-        options: {
-          ...options,
-          startPath,
-        },
-      },
-      vscode,
-    )
-
-    const message = await onMessage<ipc.VscodeMessage, ipc.OptionsMessage>(
-      vscode,
-      (message): message is ipc.OptionsMessage => {
-        // There can be parallel initializations so wait for the right ID.
-        return message.type === "options" && message.id === id
-      },
-    )
-
-    return message.options
-  }
-
-  private fork(): Promise<cp.ChildProcess> {
-    if (this._vscode) {
-      return this._vscode
-    }
-
-    logger.debug("forking vs code...")
-    const vscode = cp.fork(path.join(this.serverRootPath, "fork"))
-
-    const dispose = () => {
-      vscode.removeAllListeners()
-      vscode.kill()
-      this._vscode = undefined
-    }
-
-    vscode.on("error", (error: Error) => {
-      logger.error(error.message)
-      if (error.stack) {
-        logger.debug(error.stack)
-      }
-      dispose()
-    })
-
-    vscode.on("exit", (code) => {
-      logger.error(`VS Code exited unexpectedly with code ${code}`)
-      dispose()
-    })
-
-    this._vscode = onMessage<ipc.VscodeMessage, ipc.ReadyMessage>(vscode, (message): message is ipc.ReadyMessage => {
-      return message.type === "ready"
-    }).then(() => vscode)
-
-    return this._vscode
-  }
-
-  /**
-   * VS Code expects a raw socket. It will handle all the web socket frames.
-   */
-  public async sendWebsocket(socket: net.Socket, query: ipc.Query, permessageDeflate: boolean): Promise<void> {
-    const vscode = await this._vscode
-    // TLS sockets cannot be transferred to child processes so we need an
-    // in-between. Non-TLS sockets will be returned as-is.
-    const socketProxy = await this.socketProvider.createProxy(socket)
-    this.send({ type: "socket", query, permessageDeflate }, vscode, socketProxy)
-  }
-
-  private send(message: ipc.CodeServerMessage, vscode?: cp.ChildProcess, socket?: net.Socket): void {
-    if (!vscode || vscode.killed) {
-      throw new Error("vscode is not running")
-    }
-    vscode.send(message, socket)
-  }
-
-  /**
-   * Choose the first non-empty path from the provided array.
-   *
-   * Each array item consists of `url` and an optional `workspace` boolean that
-   * indicates whether that url is for a workspace.
-   *
-   * `url` can be a fully qualified URL or just the path portion.
-   *
-   * `url` can also be a query object to make it easier to pass in query
-   * variables directly but anything that isn't a string or string array is not
-   * valid and will be ignored.
-   */
-  private async getFirstPath(
-    startPaths: Array<{ url?: string | string[] | ipc.Query | ipc.Query[]; workspace?: boolean } | undefined>,
-  ): Promise<ipc.StartPath | undefined> {
-    for (let i = 0; i < startPaths.length; ++i) {
-      const startPath = startPaths[i]
-      const url = arrayify(startPath && startPath.url).find((p) => !!p)
-      if (startPath && url && typeof url === "string") {
-        return {
-          url,
-          // The only time `workspace` is undefined is for the command-line
-          // argument, in which case it's a path (not a URL) so we can stat it
-          // without having to parse it.
-          workspace: typeof startPath.workspace !== "undefined" ? startPath.workspace : await isFile(url),
-        }
-      }
-    }
-    return undefined
-  }
-}
diff --git a/src/node/wrapper.ts b/src/node/wrapper.ts
index 68eacbbcadc3..8e8d9ccabab2 100644
--- a/src/node/wrapper.ts
+++ b/src/node/wrapper.ts
@@ -267,7 +267,7 @@ export class ParentProcess extends Process {
     try {
       this.started = this._start()
       await this.started
-    } catch (error) {
+    } catch (error: any) {
       this.logger.error(error.message)
       this.exit(typeof error.code === "number" ? error.code : 1)
     }
diff --git a/test/package.json b/test/package.json
index 1a7f46655f5e..fffc28e8ecf8 100644
--- a/test/package.json
+++ b/test/package.json
@@ -4,7 +4,7 @@
   "devDependencies": {
     "@playwright/test": "^1.12.1",
     "@types/jest": "^26.0.20",
-    "@types/jsdom": "^16.2.6",
+    "@types/jsdom": "^16.2.13",
     "@types/node-fetch": "^2.5.8",
     "@types/supertest": "^2.0.10",
     "@types/wtfnode": "^0.7.0",
diff --git a/test/unit/browser/pages/login.test.ts b/test/unit/browser/pages/login.test.ts
index 92d4d1176c5e..cfef3c1ce023 100644
--- a/test/unit/browser/pages/login.test.ts
+++ b/test/unit/browser/pages/login.test.ts
@@ -24,10 +24,8 @@ describe("login", () => {
       const spy = jest.spyOn(document, "getElementById")
       // Create a fake element and set the attribute
       const mockElement = document.createElement("input")
-      mockElement.setAttribute("id", "base")
       const expected = {
         base: "./hello-world",
-        csStaticBase: "./static/development/Users/jp/Dev/code-server",
         logLevel: 2,
         disableTelemetry: false,
         disableUpdateCheck: false,
@@ -35,11 +33,6 @@ describe("login", () => {
       mockElement.setAttribute("data-settings", JSON.stringify(expected))
       document.body.appendChild(mockElement)
       spy.mockImplementation(() => mockElement)
-      // Load file
-      require("../../../../src/browser/pages/login")
-
-      const el: HTMLInputElement | null = document.querySelector("input#base")
-      expect(el?.value).toBe("/hello-world")
     })
   })
   describe("there is not an element with id 'base'", () => {
@@ -76,15 +69,5 @@ describe("login", () => {
     afterAll(() => {
       jest.restoreAllMocks()
     })
-
-    it("should do nothing", () => {
-      spy.mockImplementation(() => null)
-      // Load file
-      require("../../../../src/browser/pages/login")
-
-      // It's called once by getOptions in the top of the file
-      // and then another to get the base element
-      expect(spy).toHaveBeenCalledTimes(2)
-    })
   })
 })
diff --git a/test/unit/browser/pages/vscode.test.ts b/test/unit/browser/pages/vscode.test.ts
deleted file mode 100644
index 52c1d89c3618..000000000000
--- a/test/unit/browser/pages/vscode.test.ts
+++ /dev/null
@@ -1,400 +0,0 @@
-/**
- * @jest-environment jsdom
- */
-import fetchMock from "jest-fetch-mock"
-import { JSDOM } from "jsdom"
-import {
-  getNlsConfiguration,
-  nlsConfigElementId,
-  getConfigurationForLoader,
-  setBodyBackgroundToThemeBackgroundColor,
-  _createScriptURL,
-  main,
-  createBundlePath,
-} from "../../../../src/browser/pages/vscode"
-
-describe("vscode", () => {
-  describe("getNlsConfiguration", () => {
-    let _document: Document
-
-    beforeEach(() => {
-      // We use underscores to not confuse with global values
-      const { window: _window } = new JSDOM()
-      _document = _window.document
-      fetchMock.enableMocks()
-    })
-
-    afterEach(() => {
-      fetchMock.resetMocks()
-    })
-
-    it("should throw an error if no nlsConfigElement", () => {
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}`
-
-      expect(() => {
-        getNlsConfiguration(_document, "")
-      }).toThrowError(errorMessage)
-    })
-    it("should throw an error if no nlsConfig", () => {
-      const mockElement = _document.createElement("div")
-      mockElement.setAttribute("id", nlsConfigElementId)
-      _document.body.appendChild(mockElement)
-
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.`
-
-      expect(() => {
-        getNlsConfiguration(_document, "")
-      }).toThrowError(errorMessage)
-
-      _document.body.removeChild(mockElement)
-    })
-    it("should return the correct configuration", () => {
-      const mockElement = _document.createElement("div")
-      const dataSettings = {
-        first: "Jane",
-        last: "Doe",
-      }
-
-      mockElement.setAttribute("id", nlsConfigElementId)
-      mockElement.setAttribute("data-settings", JSON.stringify(dataSettings))
-      _document.body.appendChild(mockElement)
-      const actual = getNlsConfiguration(_document, "")
-
-      expect(actual).toStrictEqual(dataSettings)
-
-      _document.body.removeChild(mockElement)
-    })
-    it("should return and have a loadBundle property if _resolvedLangaugePackCoreLocation", async () => {
-      const mockElement = _document.createElement("div")
-      const dataSettings = {
-        locale: "en",
-        availableLanguages: ["en", "de"],
-        _resolvedLanguagePackCoreLocation: "./",
-      }
-
-      mockElement.setAttribute("id", nlsConfigElementId)
-      mockElement.setAttribute("data-settings", JSON.stringify(dataSettings))
-      _document.body.appendChild(mockElement)
-      const nlsConfig = getNlsConfiguration(_document, "")
-
-      expect(nlsConfig._resolvedLanguagePackCoreLocation).not.toBe(undefined)
-      expect(nlsConfig.loadBundle).not.toBe(undefined)
-
-      const mockCallbackFn = jest.fn((_, bundle) => {
-        return bundle
-      })
-
-      fetchMock.mockOnce(JSON.stringify({ key: "hello world" }))
-      // Ensure that load bundle works as expected
-      // by mocking the fetch response and checking that the callback
-      // had the expected value
-      await nlsConfig.loadBundle("hello", "en", mockCallbackFn)
-      expect(mockCallbackFn).toHaveBeenCalledTimes(1)
-      expect(mockCallbackFn).toHaveBeenCalledWith(undefined, { key: "hello world" })
-
-      // Call it again to ensure it loads from the cache
-      // it should return the same value
-      await nlsConfig.loadBundle("hello", "en", mockCallbackFn)
-      expect(mockCallbackFn).toHaveBeenCalledTimes(2)
-      expect(mockCallbackFn).toHaveBeenCalledWith(undefined, { key: "hello world" })
-
-      fetchMock.mockReject(new Error("fake error message"))
-      const mockCallbackFn2 = jest.fn((error) => error)
-      // Call it for a different bundle and mock a failed fetch call
-      // to ensure we get the expected error
-      const error = await nlsConfig.loadBundle("goodbye", "es", mockCallbackFn2)
-      expect(error.message).toEqual("fake error message")
-
-      // Clean up
-      _document.body.removeChild(mockElement)
-    })
-  })
-  describe("createBundlePath", () => {
-    it("should return the correct path", () => {
-      const _resolvedLangaugePackCoreLocation = "./languages"
-      const bundle = "/bundle.js"
-      const expected = "./languages/!bundle.js.nls.json"
-      const actual = createBundlePath(_resolvedLangaugePackCoreLocation, bundle)
-      expect(actual).toBe(expected)
-    })
-    it("should return the correct path (even if _resolvedLangaugePackCoreLocation is undefined)", () => {
-      const _resolvedLangaugePackCoreLocation = undefined
-      const bundle = "/bundle.js"
-      const expected = "/!bundle.js.nls.json"
-      const actual = createBundlePath(_resolvedLangaugePackCoreLocation, bundle)
-      expect(actual).toBe(expected)
-    })
-  })
-  describe("setBodyBackgroundToThemeBackgroundColor", () => {
-    let _document: Document
-    let _localStorage: Storage
-
-    beforeEach(() => {
-      // We need to set the url in the JSDOM constructor
-      // to prevent this error "SecurityError: localStorage is not available for opaque origins"
-      // See: https://github.com/jsdom/jsdom/issues/2304#issuecomment-622314949
-      const { window: _window } = new JSDOM("", { url: "http://localhost" })
-      _document = _window.document
-      _localStorage = _window.localStorage
-    })
-    it("should return null", () => {
-      const test = {
-        colorMap: {
-          [`editor.background`]: "#ff3270",
-        },
-      }
-      _localStorage.setItem("colorThemeData", JSON.stringify(test))
-
-      expect(setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)).toBeNull()
-
-      _localStorage.removeItem("colorThemeData")
-    })
-    it("should throw an error if it can't find colorThemeData in localStorage", () => {
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. Could not find colorThemeData in localStorage.`
-
-      expect(() => {
-        setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-      }).toThrowError(errorMessage)
-    })
-    it("should throw an error if there is an error parsing colorThemeData from localStorage", () => {
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. Could not parse colorThemeData from localStorage.`
-
-      _localStorage.setItem(
-        "colorThemeData",
-        '{"id":"vs-dark max-SS-Cyberpunk-themes-cyberpunk-umbra-color-theme-json","label":"Activate UMBRA protocol","settingsId":"Activate "errorForeground":"#ff3270","foreground":"#ffffff","sideBarTitle.foreground":"#bbbbbb"},"watch\\":::false}',
-      )
-
-      expect(() => {
-        setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-      }).toThrowError(errorMessage)
-
-      localStorage.removeItem("colorThemeData")
-    })
-    it("should throw an error if there is no colorMap property", () => {
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData is missing colorMap.`
-
-      const test = {
-        id: "hey-joe",
-      }
-      _localStorage.setItem("colorThemeData", JSON.stringify(test))
-
-      expect(() => {
-        setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-      }).toThrowError(errorMessage)
-
-      _localStorage.removeItem("colorThemeData")
-    })
-    it("should throw an error if there is no editor.background color", () => {
-      const errorMsgPrefix = "[vscode]"
-      const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData.colorMap["editor.background"] is undefined.`
-
-      const test = {
-        id: "hey-joe",
-        colorMap: {
-          editor: "#fff",
-        },
-      }
-      _localStorage.setItem("colorThemeData", JSON.stringify(test))
-
-      expect(() => {
-        setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-      }).toThrowError(errorMessage)
-
-      _localStorage.removeItem("colorThemeData")
-    })
-    it("should set the body background to the editor background color", () => {
-      const test = {
-        colorMap: {
-          [`editor.background`]: "#ff3270",
-        },
-      }
-      _localStorage.setItem("colorThemeData", JSON.stringify(test))
-
-      setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)
-
-      // When the body.style.backgroundColor is set using hex
-      // it is converted to rgb
-      // which is why we use that in the assertion
-      expect(_document.body.style.backgroundColor).toBe("rgb(255, 50, 112)")
-
-      _localStorage.removeItem("colorThemeData")
-    })
-  })
-  describe("getConfigurationForLoader", () => {
-    let _window: Window
-
-    beforeEach(() => {
-      const { window: __window } = new JSDOM()
-      // @ts-expect-error the Window from JSDOM is not exactly the same as Window
-      // so we expect an error here
-      _window = __window
-    })
-    it("should return a loader object (with undefined trustedTypesPolicy)", () => {
-      const options = {
-        base: ".",
-        csStaticBase: "/",
-        logLevel: 1,
-      }
-      const nlsConfig = {
-        first: "Jane",
-        last: "Doe",
-        locale: "en",
-        availableLanguages: {},
-      }
-      const loader = getConfigurationForLoader({
-        options,
-        _window,
-        nlsConfig: nlsConfig,
-      })
-
-      expect(loader).toStrictEqual({
-        baseUrl: "http://localhost//vendor/modules/code-oss-dev/out",
-        paths: {
-          "iconv-lite-umd": "../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js",
-          jschardet: "../node_modules/jschardet/dist/jschardet.min.js",
-          "tas-client-umd": "../node_modules/tas-client-umd/lib/tas-client-umd.js",
-          "vscode-oniguruma": "../node_modules/vscode-oniguruma/release/main",
-          "vscode-textmate": "../node_modules/vscode-textmate/release/main",
-          xterm: "../node_modules/xterm/lib/xterm.js",
-          "xterm-addon-search": "../node_modules/xterm-addon-search/lib/xterm-addon-search.js",
-          "xterm-addon-unicode11": "../node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js",
-          "xterm-addon-webgl": "../node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js",
-        },
-        recordStats: true,
-
-        trustedTypesPolicy: undefined,
-        "vs/nls": {
-          availableLanguages: {},
-          first: "Jane",
-          last: "Doe",
-          locale: "en",
-        },
-      })
-    })
-    it("should return a loader object with trustedTypesPolicy", () => {
-      interface PolicyOptions {
-        createScriptUrl: (url: string) => string
-      }
-
-      function mockCreatePolicy(policyName: string, options: PolicyOptions) {
-        return {
-          name: policyName,
-          ...options,
-        }
-      }
-
-      const mockFn = jest.fn(mockCreatePolicy)
-
-      // @ts-expect-error we are adding a custom property to window
-      _window.trustedTypes = {
-        createPolicy: mockFn,
-      }
-
-      const options = {
-        base: "/",
-        csStaticBase: "/",
-        logLevel: 1,
-      }
-      const nlsConfig = {
-        first: "Jane",
-        last: "Doe",
-        locale: "en",
-        availableLanguages: {},
-      }
-      const loader = getConfigurationForLoader({
-        options,
-        _window,
-        nlsConfig: nlsConfig,
-      })
-
-      expect(loader.trustedTypesPolicy).not.toBe(undefined)
-      expect(loader.trustedTypesPolicy.name).toBe("amdLoader")
-
-      // Check that we can actually create a script URL
-      // using the createScriptURL on the loader object
-      const scriptUrl = loader.trustedTypesPolicy.createScriptURL("http://localhost/foo.js")
-      expect(scriptUrl).toBe("http://localhost/foo.js")
-    })
-  })
-  describe("_createScriptURL", () => {
-    it("should return the correct url", () => {
-      const url = _createScriptURL("localhost/foo/bar.js", "localhost")
-
-      expect(url).toBe("localhost/foo/bar.js")
-    })
-    it("should throw if the value doesn't start with the origin", () => {
-      expect(() => {
-        _createScriptURL("localhost/foo/bar.js", "coder.com")
-      }).toThrow("Invalid script url: localhost/foo/bar.js")
-    })
-  })
-  describe("main", () => {
-    let _window: Window
-    let _document: Document
-    let _localStorage: Storage
-
-    beforeEach(() => {
-      // We need to set the url in the JSDOM constructor
-      // to prevent this error "SecurityError: localStorage is not available for opaque origins"
-      // See: https://github.com/jsdom/jsdom/issues/2304#issuecomment-62231494
-      const { window: __window } = new JSDOM("", { url: "http://localhost" })
-      // @ts-expect-error the Window from JSDOM is not exactly the same as Window
-      // so we expect an error here
-      _window = __window
-      _document = __window.document
-      _localStorage = __window.localStorage
-
-      const mockElement = _document.createElement("div")
-      const dataSettings = {
-        first: "Jane",
-        last: "Doe",
-      }
-
-      mockElement.setAttribute("id", nlsConfigElementId)
-      mockElement.setAttribute("data-settings", JSON.stringify(dataSettings))
-      _document.body.appendChild(mockElement)
-
-      const test = {
-        colorMap: {
-          [`editor.background`]: "#ff3270",
-        },
-      }
-      _localStorage.setItem("colorThemeData", JSON.stringify(test))
-    })
-    afterEach(() => {
-      _localStorage.removeItem("colorThemeData")
-    })
-    it("should throw if document is missing", () => {
-      expect(() => {
-        main(undefined, _window, _localStorage)
-      }).toThrow("document is undefined.")
-    })
-    it("should throw if window is missing", () => {
-      expect(() => {
-        main(_document, undefined, _localStorage)
-      }).toThrow("window is undefined.")
-    })
-    it("should throw if localStorage is missing", () => {
-      expect(() => {
-        main(_document, _window, undefined)
-      }).toThrow("localStorage is undefined.")
-    })
-    it("should add loader to self.require", () => {
-      main(_document, _window, _localStorage)
-
-      expect(Object.prototype.hasOwnProperty.call(self, "require")).toBe(true)
-    })
-    it("should not throw in browser context", () => {
-      // Assuming we call it in a normal browser context
-      // where everything is defined
-      expect(() => {
-        main(_document, _window, _localStorage)
-      }).not.toThrow()
-    })
-  })
-})
diff --git a/test/unit/browser/register.test.ts b/test/unit/browser/register.test.ts
deleted file mode 100644
index 1c213196602c..000000000000
--- a/test/unit/browser/register.test.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-import { JSDOM } from "jsdom"
-import { registerServiceWorker } from "../../../src/browser/register"
-import { createLoggerMock } from "../../utils/helpers"
-import { LocationLike } from "../common/util.test"
-
-describe("register", () => {
-  describe("when navigator and serviceWorker are defined", () => {
-    const mockRegisterFn = jest.fn()
-
-    beforeAll(() => {
-      const { window } = new JSDOM()
-      global.window = window as unknown as Window & typeof globalThis
-      global.document = window.document
-      global.navigator = window.navigator
-      global.location = window.location
-
-      Object.defineProperty(global.navigator, "serviceWorker", {
-        value: {
-          register: mockRegisterFn,
-        },
-      })
-    })
-
-    const loggerModule = createLoggerMock()
-    beforeEach(() => {
-      jest.clearAllMocks()
-      jest.mock("@coder/logger", () => loggerModule)
-    })
-
-    afterEach(() => {
-      jest.resetModules()
-    })
-
-    afterAll(() => {
-      jest.restoreAllMocks()
-
-      // We don't want these to stay around because it can affect other tests
-      global.window = undefined as unknown as Window & typeof globalThis
-      global.document = undefined as unknown as Document & typeof globalThis
-      global.navigator = undefined as unknown as Navigator & typeof globalThis
-      global.location = undefined as unknown as Location & typeof globalThis
-    })
-
-    it("test should have access to browser globals from beforeAll", () => {
-      expect(typeof global.window).not.toBeFalsy()
-      expect(typeof global.document).not.toBeFalsy()
-      expect(typeof global.navigator).not.toBeFalsy()
-      expect(typeof global.location).not.toBeFalsy()
-    })
-
-    it("should register a ServiceWorker", () => {
-      // Load service worker like you would in the browser
-      require("../../../src/browser/register")
-      expect(mockRegisterFn).toHaveBeenCalled()
-      expect(mockRegisterFn).toHaveBeenCalledTimes(1)
-    })
-
-    it("should log an error if something doesn't work", () => {
-      const message = "Can't find browser"
-      const error = new Error(message)
-
-      mockRegisterFn.mockImplementation(() => {
-        throw error
-      })
-
-      // Load service worker like you would in the browser
-      require("../../../src/browser/register")
-
-      expect(mockRegisterFn).toHaveBeenCalled()
-      expect(loggerModule.logger.error).toHaveBeenCalled()
-      expect(loggerModule.logger.error).toHaveBeenCalledTimes(1)
-      expect(loggerModule.logger.error).toHaveBeenCalledWith(
-        `[Service Worker] registration: ${error.message} ${error.stack}`,
-      )
-    })
-  })
-
-  describe("when navigator and serviceWorker are NOT defined", () => {
-    const loggerModule = createLoggerMock()
-    beforeEach(() => {
-      jest.clearAllMocks()
-      jest.mock("@coder/logger", () => loggerModule)
-    })
-
-    afterAll(() => {
-      jest.restoreAllMocks()
-    })
-
-    it("should log an error", () => {
-      // Load service worker like you would in the browser
-      require("../../../src/browser/register")
-      expect(loggerModule.logger.error).toHaveBeenCalled()
-      expect(loggerModule.logger.error).toHaveBeenCalledTimes(1)
-      expect(loggerModule.logger.error).toHaveBeenCalledWith("[Service Worker] navigator is undefined")
-    })
-  })
-
-  describe("registerServiceWorker", () => {
-    let serviceWorkerPath: string
-    let serviceWorkerScope: string
-    const mockFn = jest.fn((path: string, options: { scope: string }) => {
-      serviceWorkerPath = path
-      serviceWorkerScope = options.scope
-      return undefined
-    })
-
-    beforeAll(() => {
-      const location: LocationLike = {
-        pathname: "",
-        origin: "http://localhost:8080",
-      }
-      const { window } = new JSDOM()
-      global.window = window as unknown as Window & typeof globalThis
-      global.document = window.document
-      global.navigator = window.navigator
-      global.location = location as Location
-
-      Object.defineProperty(global.navigator, "serviceWorker", {
-        value: {
-          register: mockFn,
-        },
-      })
-    })
-
-    afterEach(() => {
-      mockFn.mockClear()
-      jest.resetModules()
-    })
-
-    afterAll(() => {
-      jest.restoreAllMocks()
-
-      // We don't want these to stay around because it can affect other tests
-      global.window = undefined as unknown as Window & typeof globalThis
-      global.document = undefined as unknown as Document & typeof globalThis
-      global.navigator = undefined as unknown as Navigator & typeof globalThis
-      global.location = undefined as unknown as Location & typeof globalThis
-    })
-    it("should register when options.base is undefined", async () => {
-      // Mock getElementById
-      const csStaticBasePath = "/static/development/Users/jp/Dev/code-server"
-      const spy = jest.spyOn(document, "getElementById")
-      // Create a fake element and set the attribute
-      const mockElement = document.createElement("div")
-      mockElement.id = "coder-options"
-      mockElement.setAttribute(
-        "data-settings",
-        `{"csStaticBase":"${csStaticBasePath}","logLevel":2,"disableUpdateCheck":false}`,
-      )
-      // Return mockElement from the spy
-      // this way, when we call "getElementById"
-      // it returns the element
-      spy.mockImplementation(() => mockElement)
-
-      await registerServiceWorker()
-
-      expect(mockFn).toBeCalled()
-      expect(serviceWorkerPath).toMatch(`${csStaticBasePath}/out/browser/serviceWorker.js`)
-      expect(serviceWorkerScope).toMatch("/")
-    })
-    it("should register when options.base is defined", async () => {
-      const csStaticBasePath = "/static/development/Users/jp/Dev/code-server"
-      const spy = jest.spyOn(document, "getElementById")
-      // Create a fake element and set the attribute
-      const mockElement = document.createElement("div")
-      mockElement.id = "coder-options"
-      mockElement.setAttribute(
-        "data-settings",
-        `{"base":"proxy/","csStaticBase":"${csStaticBasePath}","logLevel":2,"disableUpdateCheck":false}`,
-      )
-      // Return mockElement from the spy
-      // this way, when we call "getElementById"
-      // it returns the element
-      spy.mockImplementation(() => mockElement)
-
-      await registerServiceWorker()
-
-      expect(mockFn).toBeCalled()
-      expect(serviceWorkerPath).toMatch(`/out/browser/serviceWorker.js`)
-      expect(serviceWorkerScope).toMatch("/")
-    })
-  })
-})
diff --git a/test/unit/browser/serviceWorker.test.ts b/test/unit/browser/serviceWorker.test.ts
deleted file mode 100644
index 8f41173b8173..000000000000
--- a/test/unit/browser/serviceWorker.test.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-interface MockEvent {
-  claim: jest.Mock<any, any>
-  waitUntil?: jest.Mock<any, any>
-}
-
-interface Listener {
-  event: string
-  cb: (event?: MockEvent) => void
-}
-
-describe("serviceWorker", () => {
-  let listeners: Listener[] = []
-  let spy: jest.SpyInstance
-  let claimSpy: jest.Mock<any, any>
-  let waitUntilSpy: jest.Mock<any, any>
-
-  function emit(event: string) {
-    listeners
-      .filter((listener) => listener.event === event)
-      .forEach((listener) => {
-        switch (event) {
-          case "activate":
-            listener.cb({
-              claim: jest.fn(),
-              waitUntil: jest.fn(() => waitUntilSpy()),
-            })
-            break
-          default:
-            listener.cb()
-        }
-      })
-  }
-
-  beforeEach(() => {
-    claimSpy = jest.fn()
-    spy = jest.spyOn(console, "log")
-    waitUntilSpy = jest.fn()
-
-    Object.assign(global, {
-      self: global,
-      addEventListener: (event: string, cb: () => void) => {
-        listeners.push({ event, cb })
-      },
-      clients: {
-        claim: claimSpy.mockResolvedValue("claimed"),
-      },
-    })
-  })
-
-  afterEach(() => {
-    jest.restoreAllMocks()
-    jest.resetModules()
-    spy.mockClear()
-    claimSpy.mockClear()
-
-    // Clear all the listeners
-    listeners = []
-  })
-
-  it("should add 3 listeners: install, activate and fetch", () => {
-    require("../../../src/browser/serviceWorker.ts")
-    const listenerEventNames = listeners.map((listener) => listener.event)
-
-    expect(listeners).toHaveLength(3)
-    expect(listenerEventNames).toContain("install")
-    expect(listenerEventNames).toContain("activate")
-    expect(listenerEventNames).toContain("fetch")
-  })
-
-  it("should call the proper callbacks for 'install'", async () => {
-    require("../../../src/browser/serviceWorker.ts")
-    emit("install")
-    expect(spy).toHaveBeenCalledWith("[Service Worker] installed")
-    expect(spy).toHaveBeenCalledTimes(1)
-  })
-
-  it("should do nothing when 'fetch' is called", async () => {
-    require("../../../src/browser/serviceWorker.ts")
-    emit("fetch")
-    expect(spy).not.toHaveBeenCalled()
-  })
-
-  it("should call the proper callbacks for 'activate'", async () => {
-    require("../../../src/browser/serviceWorker.ts")
-    emit("activate")
-
-    // Activate serviceWorker
-    expect(spy).toHaveBeenCalledWith("[Service Worker] activated")
-    expect(waitUntilSpy).toHaveBeenCalled()
-    expect(claimSpy).toHaveBeenCalled()
-  })
-})
diff --git a/test/unit/common/util.test.ts b/test/unit/common/util.test.ts
index 85422aa84629..4cf76cffcb23 100644
--- a/test/unit/common/util.test.ts
+++ b/test/unit/common/util.test.ts
@@ -131,7 +131,7 @@ describe("util", () => {
     })
 
     it("should return options with base and cssStaticBase even if it doesn't exist", () => {
-      expect(util.getOptions()).toStrictEqual({
+      expect(util.getClientConfiguration()).toStrictEqual({
         base: "",
         csStaticBase: "",
       })
@@ -151,7 +151,7 @@ describe("util", () => {
       // it returns the element
       spy.mockImplementation(() => mockElement)
 
-      expect(util.getOptions()).toStrictEqual({
+      expect(util.getClientConfiguration()).toStrictEqual({
         base: "",
         csStaticBase: "/static/development/Users/jp/Dev/code-server",
         disableUpdateCheck: false,
@@ -167,7 +167,7 @@ describe("util", () => {
       // spreads the original options
       // then parses the queryOpts
       location.search = '?options={"logLevel":2}'
-      expect(util.getOptions()).toStrictEqual({
+      expect(util.getClientConfiguration()).toStrictEqual({
         base: "",
         csStaticBase: "",
         logLevel: 2,
@@ -194,20 +194,6 @@ describe("util", () => {
     })
   })
 
-  describe("getFirstString", () => {
-    it("should return the string if passed a string", () => {
-      expect(util.getFirstString("Hello world!")).toBe("Hello world!")
-    })
-
-    it("should get the first string from an array", () => {
-      expect(util.getFirstString(["Hello", "World"])).toBe("Hello")
-    })
-
-    it("should return undefined if the value isn't an array or a string", () => {
-      expect(util.getFirstString({ name: "Coder" })).toBe(undefined)
-    })
-  })
-
   describe("logError", () => {
     afterEach(() => {
       jest.clearAllMocks()
diff --git a/test/unit/node/app.test.ts b/test/unit/node/app.test.ts
index d3fccc3caeef..89626882be73 100644
--- a/test/unit/node/app.test.ts
+++ b/test/unit/node/app.test.ts
@@ -122,26 +122,6 @@ describe("createApp", () => {
     expect(unlinkSpy).toHaveBeenCalledTimes(1)
     server.close()
   })
-  it("should catch errors thrown when unlinking a socket", async () => {
-    const tmpDir2 = await tmpdir("unlink-socket-error")
-    const tmpFile = path.join(tmpDir2, "unlink-socket-file")
-    // await promises.writeFile(tmpFile, "")
-    const socketPath = tmpFile
-    const defaultArgs = await setDefaults({
-      _: [],
-      socket: socketPath,
-    })
-
-    const app = await createApp(defaultArgs)
-    const server = app[2]
-
-    expect(spy).toHaveBeenCalledTimes(1)
-    expect(spy).toHaveBeenCalledWith(`ENOENT: no such file or directory, unlink '${socketPath}'`)
-
-    server.close()
-    // Ensure directory was removed
-    rmdirSync(tmpDir2, { recursive: true })
-  })
 
   it("should create an https server if args.cert exists", async () => {
     const testCertificate = await generateCertificate("localhost")
diff --git a/test/unit/node/routes/static.test.ts b/test/unit/node/routes/static.test.ts
index cca66ffcb4d8..3856e0f654bc 100644
--- a/test/unit/node/routes/static.test.ts
+++ b/test/unit/node/routes/static.test.ts
@@ -1,10 +1,16 @@
 import { promises as fs } from "fs"
 import * as path from "path"
+import { rootPath } from "../../../../src/node/constants"
 import { tmpdir } from "../../../utils/helpers"
 import * as httpserver from "../../../utils/httpserver"
 import * as integration from "../../../utils/integration"
 
-describe("/static", () => {
+const NOT_FOUND = {
+  code: 404,
+  message: "not found",
+}
+
+describe("/_static", () => {
   let _codeServer: httpserver.HttpServer | undefined
   function codeServer(): httpserver.HttpServer {
     if (!_codeServer) {
@@ -17,14 +23,8 @@ describe("/static", () => {
   let testFileContent: string | undefined
   let nonExistentTestFile: string | undefined
 
-  // The static endpoint expects a commit and then the full path of the file.
-  // The commit is just for cache busting so we can use anything we want. `-`
-  // and `development` are specially recognized in that they will cause the
-  // static endpoint to avoid sending cache headers.
-  const commit = "-"
-
   beforeAll(async () => {
-    const testDir = await tmpdir("static")
+    const testDir = await tmpdir("_static")
     testFile = path.join(testDir, "test")
     testFileContent = "static file contents"
     nonExistentTestFile = path.join(testDir, "i-am-not-here")
@@ -39,20 +39,12 @@ describe("/static", () => {
   })
 
   function commonTests() {
-    it("should return a 404 when a commit and file are not provided", async () => {
-      const resp = await codeServer().fetch("/static")
-      expect(resp.status).toBe(404)
-
-      const content = await resp.json()
-      expect(content).toStrictEqual({ error: "Not Found" })
-    })
-
     it("should return a 404 when a file is not provided", async () => {
-      const resp = await codeServer().fetch(`/static/${commit}`)
-      expect(resp.status).toBe(404)
+      const resp = await codeServer().fetch(`/_static/`)
+      expect(resp.status).toBe(NOT_FOUND.code)
 
       const content = await resp.json()
-      expect(content).toStrictEqual({ error: "Not Found" })
+      expect(content.error).toContain(NOT_FOUND.message)
     })
   }
 
@@ -64,73 +56,22 @@ describe("/static", () => {
     commonTests()
 
     it("should return a 404 for a nonexistent file", async () => {
-      const resp = await codeServer().fetch(`/static/${commit}/${nonExistentTestFile}`)
-      expect(resp.status).toBe(404)
+      const filePath = path.join("/_static/", nonExistentTestFile!)
 
-      const content = await resp.json()
-      expect(content.error).toMatch("ENOENT")
+      const resp = await codeServer().fetch(filePath)
+      expect(resp.status).toBe(NOT_FOUND.code)
     })
 
     it("should return a 200 and file contents for an existent file", async () => {
-      const resp = await codeServer().fetch(`/static/${commit}${testFile}`)
+      const resp = await codeServer().fetch("/_static/src/browser/robots.txt")
       expect(resp.status).toBe(200)
 
-      const content = await resp.text()
-      expect(content).toStrictEqual(testFileContent)
-    })
-  })
-
-  describe("enabled authentication", () => {
-    // Store whatever might be in here so we can restore it afterward.
-    // TODO: We should probably pass this as an argument somehow instead of
-    // manipulating the environment.
-    const previousEnvPassword = process.env.PASSWORD
-
-    beforeEach(async () => {
-      process.env.PASSWORD = "test"
-      _codeServer = await integration.setup(["--auth=password"], "")
-    })
+      const localFilePath = path.join(rootPath, "src/browser/robots.txt")
+      const localFileContent = await fs.readFile(localFilePath, "utf8")
 
-    afterEach(() => {
-      process.env.PASSWORD = previousEnvPassword
-    })
-
-    commonTests()
-
-    describe("inside code-server root", () => {
-      it("should return a 404 for a nonexistent file", async () => {
-        const resp = await codeServer().fetch(`/static/${commit}/${__filename}-does-not-exist`)
-        expect(resp.status).toBe(404)
-
-        const content = await resp.json()
-        expect(content.error).toMatch("ENOENT")
-      })
-
-      it("should return a 200 and file contents for an existent file", async () => {
-        const resp = await codeServer().fetch(`/static/${commit}${__filename}`)
-        expect(resp.status).toBe(200)
-
-        const content = await resp.text()
-        expect(content).toStrictEqual(await fs.readFile(__filename, "utf8"))
-      })
-    })
-
-    describe("outside code-server root", () => {
-      it("should return a 401 for a nonexistent file", async () => {
-        const resp = await codeServer().fetch(`/static/${commit}/${nonExistentTestFile}`)
-        expect(resp.status).toBe(401)
-
-        const content = await resp.json()
-        expect(content).toStrictEqual({ error: "Unauthorized" })
-      })
-
-      it("should return a 401 for an existent file", async () => {
-        const resp = await codeServer().fetch(`/static/${commit}${testFile}`)
-        expect(resp.status).toBe(401)
-
-        const content = await resp.json()
-        expect(content).toStrictEqual({ error: "Unauthorized" })
-      })
+      // console.log(localFileContent)
+      const content = await resp.text()
+      expect(content).toStrictEqual(localFileContent)
     })
   })
 })
diff --git a/test/unit/node/util.test.ts b/test/unit/node/util.test.ts
index d7e6cf87ce06..717428983bb8 100644
--- a/test/unit/node/util.test.ts
+++ b/test/unit/node/util.test.ts
@@ -457,31 +457,6 @@ describe("escapeHtml", () => {
   })
 })
 
-describe("pathToFsPath", () => {
-  it("should convert a path to a file system path", () => {
-    expect(util.pathToFsPath("/foo/bar/baz")).toBe("/foo/bar/baz")
-  })
-  it("should lowercase drive letter casing by default", () => {
-    expect(util.pathToFsPath("/C:/far/boo")).toBe("c:/far/boo")
-  })
-  it("should keep drive letter casing when set to true", () => {
-    expect(util.pathToFsPath("/C:/far/bo", true)).toBe("C:/far/bo")
-  })
-  it("should replace / with \\ on Windows", () => {
-    const ORIGINAL_PLATFORM = process.platform
-
-    Object.defineProperty(process, "platform", {
-      value: "win32",
-    })
-
-    expect(util.pathToFsPath("/C:/far/boo")).toBe("c:\\far\\boo")
-
-    Object.defineProperty(process, "platform", {
-      value: ORIGINAL_PLATFORM,
-    })
-  })
-})
-
 describe("isFile", () => {
   const testDir = path.join(tmpdir, "tests", "isFile")
   let pathToFile = ""
diff --git a/test/yarn.lock b/test/yarn.lock
index fb97b3806513..c975aeb310f5 100644
--- a/test/yarn.lock
+++ b/test/yarn.lock
@@ -1101,10 +1101,10 @@
     jest-diff "^26.0.0"
     pretty-format "^26.0.0"
 
-"@types/jsdom@^16.2.6":
-  version "16.2.6"
-  resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.6.tgz#9ddf0521e49be5365797e690c3ba63148e562c29"
-  integrity sha512-yQA+HxknGtW9AkRTNyiSH3OKW5V+WzO8OPTdne99XwJkYC+KYxfNIcoJjeiSqP3V00PUUpFP6Myoo9wdIu78DQ==
+"@types/jsdom@^16.2.13":
+  version "16.2.13"
+  resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.13.tgz#126c8b7441b159d6234610a48de77b6066f1823f"
+  integrity sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==
   dependencies:
     "@types/node" "*"
     "@types/parse5" "*"
diff --git a/tsconfig.json b/tsconfig.json
index 06ab8ced5ae8..e7eec93ee22c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,9 +15,14 @@
     "sourceMap": true,
     "tsBuildInfoFile": "./.cache/tsbuildinfo",
     "incremental": true,
-    "typeRoots": ["./node_modules/@types", "./typings", "./test/node_modules/@types"],
+    "typeRoots": [
+      "./node_modules/@types",
+      "./typings",
+      "./test/node_modules/@types",
+      "./vendor/modules/code-oss-dev/src/vs/server/@types"
+    ],
     "downlevelIteration": true
   },
-  "include": ["./src/**/*.ts"],
+  "include": ["./src/**/*"],
   "exclude": ["/test", "/lib", "/ci", "/doc"]
 }
diff --git a/typings/ipc.d.ts b/typings/ipc.d.ts
deleted file mode 100644
index 60e9924fdfd3..000000000000
--- a/typings/ipc.d.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * External interfaces for integration into code-server over IPC.
- * This file exists in two locations:
- * - typings/ipc.d.ts
- * - lib/vscode/src/typings/ipc.d.ts
- * The second is a symlink to the first.
- */
-export interface Options {
-  authed: boolean
-  base: string
-  csStaticBase: string
-  disableUpdateCheck: boolean
-  logLevel: number
-}
-
-export interface InitMessage {
-  type: "init"
-  id: string
-  options: VscodeOptions
-}
-
-export type Query = { [key: string]: string | string[] | undefined | Query | Query[] }
-
-export interface SocketMessage {
-  type: "socket"
-  query: Query
-  permessageDeflate: boolean
-}
-
-export interface CliMessage {
-  type: "cli"
-  args: Args
-}
-
-export interface OpenCommandPipeArgs {
-  type: "open"
-  fileURIs?: string[]
-  folderURIs: string[]
-  forceNewWindow?: boolean
-  diffMode?: boolean
-  addMode?: boolean
-  gotoLineMode?: boolean
-  forceReuseWindow?: boolean
-  waitMarkerFilePath?: string
-}
-
-export type CodeServerMessage = InitMessage | SocketMessage | CliMessage
-
-export interface ReadyMessage {
-  type: "ready"
-}
-
-export interface OptionsMessage {
-  id: string
-  type: "options"
-  options: WorkbenchOptions
-}
-
-export type VscodeMessage = ReadyMessage | OptionsMessage
-
-export interface StartPath {
-  url: string
-  workspace: boolean
-}
-
-export interface Args {
-  "user-data-dir"?: string
-
-  "enable-proposed-api"?: string[]
-  "extensions-dir"?: string
-  "builtin-extensions-dir"?: string
-  "extra-extensions-dir"?: string[]
-  "extra-builtin-extensions-dir"?: string[]
-  "ignore-last-opened"?: boolean
-
-  locale?: string
-
-  log?: string
-  verbose?: boolean
-
-  _: string[]
-}
-
-export interface VscodeOptions {
-  readonly args: Args
-  readonly remoteAuthority: string
-  readonly startPath?: StartPath
-}
-
-export interface VscodeOptionsMessage extends VscodeOptions {
-  readonly id: string
-}
-
-export interface UriComponents {
-  readonly scheme: string
-  readonly authority: string
-  readonly path: string
-  readonly query: string
-  readonly fragment: string
-}
-
-export interface NLSConfiguration {
-  locale: string
-  availableLanguages: {
-    [key: string]: string
-  }
-  pseudo?: boolean
-  _languagePackSupport?: boolean
-}
-
-export interface WorkbenchOptions {
-  readonly workbenchWebConfiguration: {
-    readonly remoteAuthority?: string
-    readonly folderUri?: UriComponents
-    readonly workspaceUri?: UriComponents
-    readonly logLevel?: number
-    readonly workspaceProvider?: {
-      payload: [["userDataPath", string], ["enableProposedApi", string]]
-    }
-  }
-  readonly remoteUserDataUri: UriComponents
-  readonly productConfiguration: {
-    codeServerVersion?: string
-    readonly extensionsGallery?: {
-      readonly serviceUrl: string
-      readonly itemUrl: string
-      readonly controlUrl: string
-      readonly recommendationsUrl: string
-    }
-  }
-  readonly nlsConfiguration: NLSConfiguration
-  readonly commit: string
-}
-
-export interface WorkbenchOptionsMessage {
-  id: string
-}
diff --git a/vendor/package.json b/vendor/package.json
index 22fe1709b706..2d9c7275daf9 100644
--- a/vendor/package.json
+++ b/vendor/package.json
@@ -7,6 +7,6 @@
     "postinstall": "./postinstall.sh"
   },
   "devDependencies": {
-    "code-oss-dev": "cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b"
+    "code-oss-dev": "cdr/vscode#63718dfe9f975d6638d46c1548a5feb482c6dfa8"
   }
 }
diff --git a/vendor/yarn.lock b/vendor/yarn.lock
index d505c31d46d2..7e8afff38583 100644
--- a/vendor/yarn.lock
+++ b/vendor/yarn.lock
@@ -2,11 +2,6 @@
 # yarn lockfile v1
 
 
-"@coder/logger@^1.1.16":
-  version "1.1.16"
-  resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.1.16.tgz#ee5b1b188f680733f35c11b065bbd139d618c1e1"
-  integrity sha512-X6VB1++IkosYY6amRAiMvuvCf12NA4+ooX+gOuu5bJIkdjmh4Lz7QpJcWRdgxesvo1msriDDr9E/sDbIWf6vsQ==
-
 "@electron/get@^1.0.1":
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.0.tgz#95c6bcaff4f9a505ea46792424f451efea89228c"
@@ -150,7 +145,7 @@ agent-base@5:
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c"
   integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==
 
-agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
+agent-base@6, agent-base@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
   integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
@@ -197,13 +192,6 @@ are-we-there-yet@~1.1.2:
     delegates "^1.0.0"
     readable-stream "^2.0.6"
 
-ast-types@^0.13.2:
-  version "0.13.4"
-  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
-  integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
-  dependencies:
-    tslib "^2.0.1"
-
 base64-js@^1.3.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -260,11 +248,6 @@ buffer@^5.5.0:
     base64-js "^1.3.1"
     ieee754 "^1.1.13"
 
-bytes@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
-  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-
 cacheable-request@^6.0.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
@@ -313,17 +296,17 @@ clone-response@^1.0.2:
   dependencies:
     mimic-response "^1.0.0"
 
-code-oss-dev@cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b:
-  version "1.60.0"
-  resolved "https://codeload.github.com/cdr/vscode/tar.gz/9cb5fb3759f46b10bc66e676fa7f44c51e84824b"
+code-oss-dev@cdr/vscode#63718dfe9f975d6638d46c1548a5feb482c6dfa8:
+  version "1.60.2"
+  resolved "https://codeload.github.com/cdr/vscode/tar.gz/63718dfe9f975d6638d46c1548a5feb482c6dfa8"
   dependencies:
-    "@coder/logger" "^1.1.16"
     "@microsoft/applicationinsights-web" "^2.6.4"
     "@vscode/sqlite3" "4.0.12"
     "@vscode/vscode-languagedetection" "1.0.20"
     applicationinsights "1.0.8"
     chokidar "3.5.1"
     graceful-fs "4.2.6"
+    handlebars "^4.7.7"
     http-proxy-agent "^2.1.0"
     https-proxy-agent "^2.2.3"
     iconv-lite-umd "0.6.8"
@@ -333,8 +316,7 @@ code-oss-dev@cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b:
     native-watchdog "1.3.0"
     node-pty "0.11.0-beta7"
     nsfw "2.1.2"
-    proxy-agent "^4.0.1"
-    proxy-from-env "^1.1.0"
+    path-to-regexp "^6.2.0"
     spdlog "^0.13.0"
     sudo-prompt "9.2.1"
     tar-stream "^2.2.0"
@@ -457,11 +439,6 @@ 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==
 
-deep-is@~0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
-  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
-
 defer-to-connect@^1.0.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
@@ -474,25 +451,11 @@ define-properties@^1.1.3:
   dependencies:
     object-keys "^1.0.12"
 
-degenerator@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254"
-  integrity sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==
-  dependencies:
-    ast-types "^0.13.2"
-    escodegen "^1.8.1"
-    esprima "^4.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=
-
 detect-libc@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
@@ -568,33 +531,6 @@ escape-string-regexp@^4.0.0:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
-escodegen@^1.8.1:
-  version "1.14.3"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
-  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
-  dependencies:
-    esprima "^4.0.1"
-    estraverse "^4.2.0"
-    esutils "^2.0.2"
-    optionator "^0.8.1"
-  optionalDependencies:
-    source-map "~0.6.1"
-
-esprima@^4.0.0, esprima@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
-  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-estraverse@^4.2.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
-  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-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==
-
 expand-template@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
@@ -610,11 +546,6 @@ extract-zip@^1.0.3:
     mkdirp "^0.5.4"
     yauzl "^2.10.0"
 
-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=
-
 fd-slicer@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
@@ -694,7 +625,7 @@ get-stream@^5.1.0:
   dependencies:
     pump "^3.0.0"
 
-get-uri@3, get-uri@^3.0.2:
+get-uri@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c"
   integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==
@@ -775,6 +706,18 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
   integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
 
+handlebars@^4.7.7:
+  version "4.7.7"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+  integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+  dependencies:
+    minimist "^1.2.5"
+    neo-async "^2.6.0"
+    source-map "^0.6.1"
+    wordwrap "^1.0.0"
+  optionalDependencies:
+    uglify-js "^3.1.4"
+
 has-unicode@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@@ -785,17 +728,6 @@ http-cache-semantics@^4.0.0:
   resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
   integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
 
-http-errors@1.7.3:
-  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"
-
 http-proxy-agent@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
@@ -804,7 +736,7 @@ http-proxy-agent@^2.1.0:
     agent-base "4"
     debug "3.1.0"
 
-http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
+http-proxy-agent@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
   integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
@@ -813,14 +745,6 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
     agent-base "6"
     debug "4"
 
-https-proxy-agent@5, https-proxy-agent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
-  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
-  dependencies:
-    agent-base "6"
-    debug "4"
-
 https-proxy-agent@^2.2.3:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
@@ -837,24 +761,25 @@ https-proxy-agent@^4.0.0:
     agent-base "5"
     debug "4"
 
+https-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
 iconv-lite-umd@0.6.8:
   version "0.6.8"
   resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0"
   integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A==
 
-iconv-lite@0.4.24:
-  version "0.4.24"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
-  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
-  dependencies:
-    safer-buffer ">= 2.1.2 < 3"
-
 ieee754@^1.1.13:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 
-inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -952,14 +877,6 @@ keyv@^3.0.0:
   dependencies:
     json-buffer "3.0.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:
-    prelude-ls "~1.1.2"
-    type-check "~0.3.2"
-
 lodash@^4.17.10:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -975,13 +892,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@^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"
-
 lru-cache@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -1068,10 +978,10 @@ native-watchdog@1.3.0:
   resolved "https://registry.yarnpkg.com/native-watchdog/-/native-watchdog-1.3.0.tgz#88cee94c9dc766b85c8506eda14c8bd8c9618e27"
   integrity sha512-WOjGRNGkYZ5MXsntcvCYrKtSYMaewlbCFplbcUVo9bE80LPVt8TAVFHYWB8+a6fWCGYheq21+Wtt6CJrUaCJhw==
 
-netmask@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
-  integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
+neo-async@^2.6.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
 
 node-abi@^2.21.0:
   version "2.30.1"
@@ -1154,46 +1064,15 @@ once@^1.3.1, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-optionator@^0.8.1:
-  version "0.8.3"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
-  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
-  dependencies:
-    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"
-
 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==
 
-pac-proxy-agent@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb"
-  integrity sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==
-  dependencies:
-    "@tootallnate/once" "1"
-    agent-base "6"
-    debug "4"
-    get-uri "3"
-    http-proxy-agent "^4.0.1"
-    https-proxy-agent "5"
-    pac-resolver "^4.1.0"
-    raw-body "^2.2.0"
-    socks-proxy-agent "5"
-
-pac-resolver@^4.1.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.2.0.tgz#b82bcb9992d48166920bc83c7542abb454bd9bdd"
-  integrity sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==
-  dependencies:
-    degenerator "^2.2.0"
-    ip "^1.1.5"
-    netmask "^2.0.1"
+path-to-regexp@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38"
+  integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==
 
 pend@~1.2.0:
   version "1.2.0"
@@ -1229,11 +1108,6 @@ prebuild-install@^6.0.0:
     tar-fs "^2.0.0"
     tunnel-agent "^0.6.0"
 
-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"
@@ -1254,21 +1128,7 @@ proto-list@~1.2.1:
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
-proxy-agent@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.1.tgz#326c3250776c7044cd19655ccbfadf2e065a045c"
-  integrity sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==
-  dependencies:
-    agent-base "^6.0.0"
-    debug "4"
-    http-proxy-agent "^4.0.0"
-    https-proxy-agent "^5.0.0"
-    lru-cache "^5.1.1"
-    pac-proxy-agent "^4.1.0"
-    proxy-from-env "^1.0.0"
-    socks-proxy-agent "^5.0.0"
-
-proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
+proxy-from-env@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
   integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
@@ -1281,16 +1141,6 @@ pump@^3.0.0:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
-raw-body@^2.2.0:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
-  integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
-  dependencies:
-    bytes "3.1.0"
-    http-errors "1.7.3"
-    iconv-lite "0.4.24"
-    unpipe "1.0.0"
-
 rc@^1.2.7:
   version "1.2.8"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -1369,11 +1219,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   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==
-
 semver-compare@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@@ -1408,11 +1253,6 @@ set-blocking@~2.0.0:
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
-setprototypeof@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
-  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
 signal-exit@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
@@ -1437,7 +1277,7 @@ smart-buffer@^4.1.0:
   resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
   integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
 
-socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
+socks-proxy-agent@^5.0.0:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e"
   integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==
@@ -1454,7 +1294,7 @@ socks@^2.3.3:
     ip "^1.1.5"
     smart-buffer "^4.1.0"
 
-source-map@~0.6.1:
+source-map@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -1473,11 +1313,6 @@ sprintf-js@^1.1.2:
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
   integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
 
-"statuses@>= 1.5.0 < 2":
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
-  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-
 string-width@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -1583,16 +1418,6 @@ to-regex-range@^5.0.1:
   dependencies:
     is-number "^7.0.0"
 
-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==
-
-tslib@^2.0.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
-  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
-
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -1605,13 +1430,6 @@ tunnel@^0.0.6:
   resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
   integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
 
-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:
-    prelude-ls "~1.1.2"
-
 type-fest@^0.13.1:
   version "0.13.1"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
@@ -1622,16 +1440,16 @@ typedarray@^0.0.6:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
+uglify-js@^3.1.4:
+  version "3.14.2"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99"
+  integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==
+
 universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
   integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
 
-unpipe@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
-  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
-
 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"
@@ -1728,10 +1546,10 @@ windows-process-tree@0.3.0:
   dependencies:
     nan "^2.13.2"
 
-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==
+wordwrap@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+  integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
 
 wrappy@1:
   version "1.0.2"
@@ -1778,11 +1596,6 @@ xterm@4.14.0-beta.22:
   resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.14.0-beta.22.tgz#89e1060927f6542645f53584bfcd35cec08abe5a"
   integrity sha512-zl4d2fmjAoCB+G0O5tq2kNkoe7dnnrcY2Daj6VFPPV6nItyXrgRzlKWNfTjKYunC3kU2ApYy+FnHulO7lWuXSw==
 
-yallist@^3.0.2:
-  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"
diff --git a/yarn.lock b/yarn.lock
index 7b07d7473573..1156343ec198 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -339,7 +339,7 @@
   resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1"
   integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==
 
-"@types/body-parser@*", "@types/body-parser@^1.19.0":
+"@types/body-parser@*":
   version "1.19.1"
   resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c"
   integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==
@@ -347,14 +347,6 @@
     "@types/connect" "*"
     "@types/node" "*"
 
-"@types/browserify@^12.0.36":
-  version "12.0.37"
-  resolved "https://registry.yarnpkg.com/@types/browserify/-/browserify-12.0.37.tgz#f08312f17b4a7411441cce3a45434a0ce81c4da3"
-  integrity sha512-rGVZQhqlBMdnU0Wcq/RDO6+I1tppM42SqVq5ZEXiw2ft/A55Ro+dz4aKTy28gniwOIxZhRFqb5N+qnbg7J040g==
-  dependencies:
-    "@types/insert-module-globals" "*"
-    "@types/node" "*"
-
 "@types/compression@^1.7.0":
   version "1.7.1"
   resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.1.tgz#d935a1cd6f5cd9a4dc8b0d8aadf2ee91a2975acc"
@@ -402,13 +394,6 @@
   dependencies:
     "@types/node" "*"
 
-"@types/insert-module-globals@*":
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/@types/insert-module-globals/-/insert-module-globals-7.0.1.tgz#234f9263f6b315088287e3597d7e98033804a031"
-  integrity sha512-qtSfo/jdYHO4jNO6QCp4CwR/TPrvR39Yan5K4nPU1iCmxcnTWiERKDXcvFGuXEmfpjrHeOCvrZPa0UrUsy+mvA==
-  dependencies:
-    "@types/node" "*"
-
 "@types/js-yaml@^4.0.0":
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.2.tgz#4117a7a378593a218e9d6f0ef44ce6d5d9edf7fa"
@@ -505,20 +490,10 @@
   dependencies:
     "@types/node" "*"
 
-"@types/tar-fs@^2.0.0":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-2.0.1.tgz#6391dcad1b03dea2d79fac07371585ab54472bb1"
-  integrity sha512-qlsQyIY9sN7p221xHuXKNoMfUenOcvEBN4zI8dGsYbYCqHtTarXOEXSIgUnK+GcR0fZDse6pAIc5pIrCh9NefQ==
-  dependencies:
-    "@types/node" "*"
-    "@types/tar-stream" "*"
-
-"@types/tar-stream@*", "@types/tar-stream@^2.1.0":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-2.2.1.tgz#7cb4516fe6d1a926a37b7733905c50885718e7ad"
-  integrity sha512-zhcfACZ4HavArMutfAB1/ApfSx44kNF2zyytU4mbO1dGCT/y9kL2IZwRDRyYYtBUxW6LRparZpLoX8i67b6IZw==
-  dependencies:
-    "@types/node" "*"
+"@types/trusted-types@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
+  integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==
 
 "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
   version "2.0.3"
@@ -601,7 +576,7 @@
     "@typescript-eslint/types" "4.28.5"
     eslint-visitor-keys "^2.0.0"
 
-JSONStream@^1.0.3, JSONStream@^1.3.5:
+JSONStream@^1.3.5:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
   integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
@@ -627,26 +602,12 @@ acorn-jsx@^5.3.1:
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
   integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
 
-acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1:
-  version "1.8.2"
-  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
-  integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
-  dependencies:
-    acorn "^7.0.0"
-    acorn-walk "^7.0.0"
-    xtend "^4.0.2"
-
-acorn-walk@^7.0.0:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
-  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-
-acorn@^7.0.0, acorn@^7.4.0:
+acorn@^7.4.0:
   version "7.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
-agent-base@6, agent-base@^6.0.0:
+agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
   integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
@@ -784,24 +745,6 @@ arrify@^1.0.1:
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
   integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
 
-asn1.js@^5.2.0:
-  version "5.4.1"
-  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
-  integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
-  dependencies:
-    bn.js "^4.0.0"
-    inherits "^2.0.1"
-    minimalistic-assert "^1.0.0"
-    safer-buffer "^2.1.0"
-
-assert@^1.4.0:
-  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@^0.13.2:
   version "0.13.4"
   resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
@@ -839,11 +782,6 @@ autoprefixer@^9.8.6:
     postcss "^7.0.32"
     postcss-value-parser "^4.1.0"
 
-available-typed-arrays@^1.0.2:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9"
-  integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
-
 bail@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
@@ -859,31 +797,7 @@ balanced-match@^2.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
   integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
 
-base64-js@^1.0.2, base64-js@^1.3.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
-  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
-bl@^4.0.3:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
-  integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
-  dependencies:
-    buffer "^5.5.0"
-    inherits "^2.0.4"
-    readable-stream "^3.4.0"
-
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
-  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
-
-bn.js@^5.0.0, bn.js@^5.1.1:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
-  integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
-
-body-parser@1.19.0, body-parser@^1.19.0:
+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==
@@ -919,145 +833,6 @@ braces@^3.0.1:
   dependencies:
     fill-range "^7.0.1"
 
-brorand@^1.0.1, brorand@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
-  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-
-browser-pack@^6.0.1:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774"
-  integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==
-  dependencies:
-    JSONStream "^1.0.3"
-    combine-source-map "~0.8.0"
-    defined "^1.0.0"
-    safe-buffer "^5.1.1"
-    through2 "^2.0.0"
-    umd "^3.0.0"
-
-browser-resolve@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b"
-  integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==
-  dependencies:
-    resolve "^1.17.0"
-
-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, browserify-rsa@^4.0.1:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
-  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
-  dependencies:
-    bn.js "^5.0.0"
-    randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
-  integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
-  dependencies:
-    bn.js "^5.1.1"
-    browserify-rsa "^4.0.1"
-    create-hash "^1.2.0"
-    create-hmac "^1.1.7"
-    elliptic "^6.5.3"
-    inherits "^2.0.4"
-    parse-asn1 "^5.1.5"
-    readable-stream "^3.6.0"
-    safe-buffer "^5.2.0"
-
-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"
-
-browserify@^17.0.0:
-  version "17.0.0"
-  resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22"
-  integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==
-  dependencies:
-    JSONStream "^1.0.3"
-    assert "^1.4.0"
-    browser-pack "^6.0.1"
-    browser-resolve "^2.0.0"
-    browserify-zlib "~0.2.0"
-    buffer "~5.2.1"
-    cached-path-relative "^1.0.0"
-    concat-stream "^1.6.0"
-    console-browserify "^1.1.0"
-    constants-browserify "~1.0.0"
-    crypto-browserify "^3.0.0"
-    defined "^1.0.0"
-    deps-sort "^2.0.1"
-    domain-browser "^1.2.0"
-    duplexer2 "~0.1.2"
-    events "^3.0.0"
-    glob "^7.1.0"
-    has "^1.0.0"
-    htmlescape "^1.1.0"
-    https-browserify "^1.0.0"
-    inherits "~2.0.1"
-    insert-module-globals "^7.2.1"
-    labeled-stream-splicer "^2.0.0"
-    mkdirp-classic "^0.5.2"
-    module-deps "^6.2.3"
-    os-browserify "~0.3.0"
-    parents "^1.0.1"
-    path-browserify "^1.0.0"
-    process "~0.11.0"
-    punycode "^1.3.2"
-    querystring-es3 "~0.2.0"
-    read-only-stream "^2.0.0"
-    readable-stream "^2.0.2"
-    resolve "^1.1.4"
-    shasum-object "^1.0.0"
-    shell-quote "^1.6.1"
-    stream-browserify "^3.0.0"
-    stream-http "^3.0.0"
-    string_decoder "^1.1.1"
-    subarg "^1.0.0"
-    syntax-error "^1.1.1"
-    through2 "^2.0.0"
-    timers-browserify "^1.0.1"
-    tty-browserify "0.0.1"
-    url "~0.11.0"
-    util "~0.12.0"
-    vm-browserify "^1.0.0"
-    xtend "^4.0.0"
-
 browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.5:
   version "4.16.6"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
@@ -1092,32 +867,6 @@ buffer-from@^1.0.0:
   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@^5.5.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
-  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
-  dependencies:
-    base64-js "^1.3.1"
-    ieee754 "^1.1.13"
-
-buffer@~5.2.1:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
-  integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==
-  dependencies:
-    base64-js "^1.0.2"
-    ieee754 "^1.1.4"
-
-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.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -1128,11 +877,6 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
-cached-path-relative@^1.0.0, cached-path-relative@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db"
-  integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==
-
 call-bind@^1.0.0, call-bind@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -1207,24 +951,11 @@ charenc@0.0.2:
   resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
   integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
 
-chownr@^1.1.1:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
-  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
-
 chownr@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
   integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
 
-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"
-
 cliui@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
@@ -1291,16 +1022,6 @@ colorette@^1.2.1, colorette@^1.2.2:
   resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
   integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
 
-combine-source-map@^0.8.0, combine-source-map@~0.8.0:
-  version "0.8.0"
-  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
-  integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=
-  dependencies:
-    convert-source-map "~1.1.0"
-    inline-source-map "~0.6.0"
-    lodash.memoize "~3.0.3"
-    source-map "~0.5.3"
-
 compressible@~2.0.16:
   version "2.0.18"
   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
@@ -1326,31 +1047,11 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^1.6.0, concat-stream@^1.6.1, 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"
-
-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"
@@ -1370,11 +1071,6 @@ convert-source-map@^1.7.0:
   dependencies:
     safe-buffer "~5.1.1"
 
-convert-source-map@~1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
-  integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
-
 cookie-parser@^1.4.5:
   version "1.4.5"
   resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49"
@@ -1409,37 +1105,6 @@ cosmiconfig@^7.0.0:
     path-type "^4.0.0"
     yaml "^1.10.0"
 
-create-ecdh@^4.0.0:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
-  integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
-  dependencies:
-    bn.js "^4.1.0"
-    elliptic "^6.5.3"
-
-create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
-  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.4, create-hmac@^1.1.7:
-  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"
-
 create-require@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
@@ -1459,33 +1124,11 @@ crypt@0.0.2:
   resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
   integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
 
-crypto-browserify@^3.0.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"
-
 cssesc@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
-dash-ast@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37"
-  integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==
-
 data-uri-to-buffer@3:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
@@ -1532,11 +1175,16 @@ decamelize@^1.1.0, decamelize@^1.2.0:
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
-deep-is@^0.1.3, deep-is@~0.1.3:
+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=
 
+deep-is@~0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
 define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -1544,11 +1192,6 @@ define-properties@^1.1.3:
   dependencies:
     object-keys "^1.0.12"
 
-defined@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
-  integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
-
 degenerator@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b"
@@ -1569,24 +1212,6 @@ depd@~1.1.2:
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
   integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
 
-deps-sort@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d"
-  integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==
-  dependencies:
-    JSONStream "^1.0.3"
-    shasum-object "^1.0.0"
-    subarg "^1.0.0"
-    through2 "^2.0.0"
-
-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"
@@ -1597,29 +1222,11 @@ detect-libc@^1.0.3:
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
   integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
 
-detective@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b"
-  integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==
-  dependencies:
-    acorn-node "^1.6.1"
-    defined "^1.0.0"
-    minimist "^1.1.1"
-
 diff@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
   integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
 
-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"
@@ -1670,11 +1277,6 @@ dom-serializer@^1.0.1:
     domhandler "^4.0.0"
     entities "^2.0.0"
 
-domain-browser@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
-  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
-
 domelementtype@1, domelementtype@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
@@ -1723,13 +1325,6 @@ domutils@^2.0.0:
     domelementtype "^2.2.0"
     domhandler "^4.2.0"
 
-duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
-  integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
-  dependencies:
-    readable-stream "^2.0.2"
-
 duplexer@^0.1.1, duplexer@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
@@ -1745,19 +1340,6 @@ electron-to-chromium@^1.3.723:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf"
   integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==
 
-elliptic@^6.5.3:
-  version "6.5.4"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
-  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
-  dependencies:
-    bn.js "^4.11.9"
-    brorand "^1.1.0"
-    hash.js "^1.0.0"
-    hmac-drbg "^1.0.1"
-    inherits "^2.0.4"
-    minimalistic-assert "^1.0.1"
-    minimalistic-crypto-utils "^1.0.1"
-
 emoji-regex@^8.0.0:
   version "8.0.0"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -1773,13 +1355,6 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
-  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"
-
 enquirer@^2.3.5:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
@@ -2075,19 +1650,6 @@ eventemitter3@^4.0.0:
   resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
   integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
 
-events@^3.0.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
-  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-
-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"
-
 execall@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
@@ -2169,11 +1731,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-fast-safe-stringify@^2.0.7:
-  version "2.0.7"
-  resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
-  integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
-
 fast-url-parser@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d"
@@ -2265,11 +1822,6 @@ follow-redirects@^1.0.0:
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
   integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==
 
-foreach@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
-  integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
-
 format@^0.2.0:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
@@ -2290,11 +1842,6 @@ from@^0.1.7:
   resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
   integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
 
-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==
-
 fs-extra@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -2353,11 +1900,6 @@ gensync@^1.0.0-beta.2:
   resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
   integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
 
-get-assigned-identifiers@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1"
-  integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==
-
 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"
@@ -2396,18 +1938,6 @@ glob-parent@^5.1.0, glob-parent@^5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
-glob@^7.1.0:
-  version "7.1.7"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
-  integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.4"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
 glob@^7.1.3:
   version "7.1.6"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
@@ -2472,11 +2002,16 @@ gonzales-pe@^4.3.0:
   dependencies:
     minimist "^1.2.5"
 
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+graceful-fs@^4.1.2:
   version "4.2.6"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
   integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
 
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+  version "4.2.8"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+
 hard-rejection@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
@@ -2507,39 +2042,13 @@ has-unicode@^2.0.0:
   resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
   integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
 
-has@^1.0.0, has@^1.0.3:
+has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
   dependencies:
     function-bind "^1.1.1"
 
-hash-base@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
-  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
-  dependencies:
-    inherits "^2.0.4"
-    readable-stream "^3.6.0"
-    safe-buffer "^5.2.0"
-
-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"
-
-hmac-drbg@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
-  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
-  dependencies:
-    hash.js "^1.0.3"
-    minimalistic-assert "^1.0.0"
-    minimalistic-crypto-utils "^1.0.1"
-
 hosted-git-info@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.0.tgz#9f06639a90beff66cacae6e77f8387b431d61ddc"
@@ -2552,11 +2061,6 @@ html-tags@^3.1.0:
   resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
   integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
 
-htmlescape@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
-  integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=
-
 htmlparser2@^3.10.0:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
@@ -2624,11 +2128,6 @@ httpolyglot@^0.1.2:
   resolved "https://registry.yarnpkg.com/httpolyglot/-/httpolyglot-0.1.2.tgz#e4d347fe8984a62f467d4060df527f1851f6997b"
   integrity sha1-5NNH/omEpi9GfUBg31J/GFH2mXs=
 
-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=
-
 https-proxy-agent@5, https-proxy-agent@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
@@ -2644,11 +2143,6 @@ iconv-lite@0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-ieee754@^1.1.13, ieee754@^1.1.4:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
-  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
 ignore-walk@3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
@@ -2697,16 +2191,11 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-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"
@@ -2717,29 +2206,6 @@ ini@^1.3.5:
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
   integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
 
-inline-source-map@~0.6.0:
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
-  integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=
-  dependencies:
-    source-map "~0.5.3"
-
-insert-module-globals@^7.2.1:
-  version "7.2.1"
-  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3"
-  integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==
-  dependencies:
-    JSONStream "^1.0.3"
-    acorn-node "^1.5.2"
-    combine-source-map "^0.8.0"
-    concat-stream "^1.6.1"
-    is-buffer "^1.1.0"
-    path-is-absolute "^1.0.1"
-    process "~0.11.0"
-    through2 "^2.0.0"
-    undeclared-identifiers "^1.1.2"
-    xtend "^4.0.0"
-
 ip@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
@@ -2763,13 +2229,6 @@ is-alphanumerical@^1.0.0:
     is-alphabetical "^1.0.0"
     is-decimal "^1.0.0"
 
-is-arguments@^1.0.4:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
-  integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
-  dependencies:
-    call-bind "^1.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"
@@ -2787,7 +2246,7 @@ is-boolean-object@^1.1.0:
   dependencies:
     call-bind "^1.0.0"
 
-is-buffer@^1.1.0, is-buffer@^1.1.4, is-buffer@~1.1.6:
+is-buffer@^1.1.4, is-buffer@~1.1.6:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
@@ -2841,11 +2300,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-generator-function@^1.0.7:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c"
-  integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==
-
 is-glob@^4.0.0, is-glob@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
@@ -2908,17 +2362,6 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
   dependencies:
     has-symbols "^1.0.1"
 
-is-typed-array@^1.1.3:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e"
-  integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==
-  dependencies:
-    available-typed-arrays "^1.0.2"
-    call-bind "^1.0.2"
-    es-abstract "^1.18.0-next.2"
-    foreach "^2.0.5"
-    has-symbols "^1.0.1"
-
 is-typedarray@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -3040,14 +2483,6 @@ known-css-properties@^0.21.0:
   resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d"
   integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==
 
-labeled-stream-splicer@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21"
-  integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==
-  dependencies:
-    inherits "^2.0.1"
-    stream-splicer "^2.0.0"
-
 levn@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -3104,11 +2539,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.memoize@~3.0.3:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
-  integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=
-
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -3188,15 +2618,6 @@ mathml-tag-names@^2.1.3:
   resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
   integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
 
-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"
-
 md5@^2.2.1:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
@@ -3288,14 +2709,6 @@ micromatch@^4.0.2, micromatch@^4.0.4:
     braces "^3.0.1"
     picomatch "^2.2.3"
 
-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.47.0, "mime-db@>= 1.43.0 < 2":
   version "1.47.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
@@ -3318,16 +2731,6 @@ min-indent@^1.0.0:
   resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
   integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
 
-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.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.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -3344,7 +2747,7 @@ minimist-options@4.1.0:
     is-plain-obj "^1.1.0"
     kind-of "^6.0.3"
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+minimist@^1.2.0, minimist@^1.2.5, 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==
@@ -3364,37 +2767,11 @@ minizlib@^2.1.1:
     minipass "^3.0.0"
     yallist "^4.0.0"
 
-mkdirp-classic@^0.5.2:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
-  integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-
 mkdirp@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-module-deps@^6.2.3:
-  version "6.2.3"
-  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee"
-  integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==
-  dependencies:
-    JSONStream "^1.0.3"
-    browser-resolve "^2.0.0"
-    cached-path-relative "^1.0.2"
-    concat-stream "~1.6.0"
-    defined "^1.0.0"
-    detective "^5.2.0"
-    duplexer2 "^0.1.2"
-    inherits "^2.0.1"
-    parents "^1.0.0"
-    readable-stream "^2.0.2"
-    resolve "^1.4.0"
-    stream-combiner2 "^1.1.1"
-    subarg "^1.0.0"
-    through2 "^2.0.0"
-    xtend "^4.0.0"
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -3502,7 +2879,7 @@ number-is-nan@^1.0.0:
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
   integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
 
-object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -3549,7 +2926,7 @@ on-headers@~1.0.2:
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
   integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
 
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -3585,11 +2962,6 @@ optionator@^0.9.1:
     type-check "^0.4.0"
     word-wrap "^1.2.3"
 
-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-tmpdir@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -3657,11 +3029,6 @@ pac-resolver@^5.0.0:
     ip "^1.1.5"
     netmask "^2.0.1"
 
-pako@~1.0.5:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
-  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
-
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -3669,24 +3036,6 @@ parent-module@^1.0.0:
   dependencies:
     callsites "^3.0.0"
 
-parents@^1.0.0, parents@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
-  integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=
-  dependencies:
-    path-platform "~0.11.15"
-
-parse-asn1@^5.0.0, parse-asn1@^5.1.5:
-  version "5.1.6"
-  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
-  integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
-  dependencies:
-    asn1.js "^5.2.0"
-    browserify-aes "^1.0.0"
-    evp_bytestokey "^1.0.0"
-    pbkdf2 "^3.0.3"
-    safe-buffer "^5.1.1"
-
 parse-entities@^1.1.0:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50"
@@ -3734,11 +3083,6 @@ parseurl@~1.3.2, parseurl@~1.3.3:
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
   integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 
-path-browserify@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
-  integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
-
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -3749,7 +3093,7 @@ path-exists@^4.0.0:
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
   integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
 
-path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+path-is-absolute@1.0.1, path-is-absolute@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
@@ -3764,11 +3108,6 @@ path-parse@^1.0.6, path-parse@^1.0.7:
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 
-path-platform@~0.11.15:
-  version "0.11.15"
-  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
-  integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
-
 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"
@@ -3793,17 +3132,6 @@ pause-stream@^0.0.11:
   dependencies:
     through "~2.3"
 
-pbkdf2@^3.0.3:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
-  integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
-  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"
-
 pem@^1.14.2:
   version "1.14.4"
   resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9"
@@ -3950,11 +3278,6 @@ process-nextick-args@~2.0.0:
   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.0:
-  version "0.11.10"
-  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
-  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -3987,31 +3310,6 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
   resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
   integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
 
-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@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
-  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
-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.3.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
@@ -4034,16 +3332,6 @@ qs@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=
-
 queue-microtask@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3"
@@ -4054,21 +3342,6 @@ quick-lru@^4.0.1:
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
-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"
@@ -4094,13 +3367,6 @@ raw-body@^2.2.0:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
-read-only-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
-  integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=
-  dependencies:
-    readable-stream "^2.0.2"
-
 read-pkg-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
@@ -4147,7 +3413,7 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6:
+readable-stream@^2.0.6:
   version "2.3.7"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
   integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -4160,7 +3426,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
+readable-stream@^3.0.0, readable-stream@^3.1.1:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -4279,7 +3545,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@^1.1.4, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.4.0:
+resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0:
   version "1.20.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
   integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -4299,14 +3565,6 @@ rimraf@^3.0.2:
   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"
-
 rotating-file-stream@^2.1.1:
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-2.1.5.tgz#6490d0a09e11dd4d441aa5d4d3676debed4a44e4"
@@ -4332,7 +3590,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-safe-buffer@5.1.2, 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.1.0, safe-buffer@~5.1.1, safe-buffer@~5.2.0:
+safe-buffer@5.1.2, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -4344,7 +3602,7 @@ safe-compare@^1.1.4:
   dependencies:
     buffer-alloc "^1.2.0"
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
+"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==
@@ -4405,21 +3663,6 @@ setprototypeof@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"
-
-shasum-object@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e"
-  integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==
-  dependencies:
-    fast-safe-stringify "^2.0.7"
-
 shebang-command@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -4432,11 +3675,6 @@ shebang-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 
-shell-quote@^1.6.1:
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
-  integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
-
 shellcheck@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shellcheck/-/shellcheck-1.0.0.tgz#263479d92c3708d63d98883f896481461cf17cd0"
@@ -4456,11 +3694,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
   integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 
-simple-concat@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
-  integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-
 slash@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -4476,23 +3709,23 @@ slice-ansi@^4.0.0:
     is-fullwidth-code-point "^3.0.0"
 
 smart-buffer@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
-  integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+  integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
 
 socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60"
-  integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e"
+  integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==
   dependencies:
-    agent-base "6"
+    agent-base "^6.0.2"
     debug "4"
     socks "^2.3.3"
 
 socks@^2.3.3:
-  version "2.6.0"
-  resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.0.tgz#6b984928461d39871b3666754b9000ecf39dfac2"
-  integrity sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw==
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
+  integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==
   dependencies:
     ip "^1.1.5"
     smart-buffer "^4.1.0"
@@ -4505,7 +3738,7 @@ source-map-support@^0.5.17:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map@^0.5.0, source-map@~0.5.3:
+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=
@@ -4575,22 +3808,6 @@ state-toggle@^1.0.0:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
   integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
 
-stream-browserify@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
-  integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
-  dependencies:
-    inherits "~2.0.4"
-    readable-stream "^3.5.0"
-
-stream-combiner2@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
-  integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4=
-  dependencies:
-    duplexer2 "~0.1.0"
-    readable-stream "^2.0.2"
-
 stream-combiner@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858"
@@ -4606,24 +3823,6 @@ stream-events@^1.0.5:
   dependencies:
     stubs "^3.0.0"
 
-stream-http@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5"
-  integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==
-  dependencies:
-    builtin-status-codes "^3.0.0"
-    inherits "^2.0.4"
-    readable-stream "^3.6.0"
-    xtend "^4.0.2"
-
-stream-splicer@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd"
-  integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==
-  dependencies:
-    inherits "^2.0.1"
-    readable-stream "^2.0.2"
-
 string-width@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -4799,13 +3998,6 @@ stylelint@^13.0.0:
     v8-compile-cache "^2.3.0"
     write-file-atomic "^3.0.3"
 
-subarg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
-  integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI=
-  dependencies:
-    minimist "^1.1.0"
-
 sugarss@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d"
@@ -4832,13 +4024,6 @@ svg-tags@^1.0.0:
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
   integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
 
-syntax-error@^1.1.1:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
-  integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==
-  dependencies:
-    acorn-node "^1.2.0"
-
 table@^6.0.9, table@^6.6.0:
   version "6.7.1"
   resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
@@ -4851,27 +4036,6 @@ table@^6.0.9, table@^6.6.0:
     string-width "^4.2.0"
     strip-ansi "^6.0.0"
 
-tar-fs@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
-  integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
-  dependencies:
-    chownr "^1.1.1"
-    mkdirp-classic "^0.5.2"
-    pump "^3.0.0"
-    tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
-  integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
-  dependencies:
-    bl "^4.0.3"
-    end-of-stream "^1.4.1"
-    fs-constants "^1.0.0"
-    inherits "^2.0.3"
-    readable-stream "^3.1.1"
-
 tar@^6.1.0, tar@^6.1.9:
   version "6.1.11"
   resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
@@ -4900,26 +4064,11 @@ text-table@^0.2.0:
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
-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"
-
 through@2, "through@>=2.2.7 <3", through@^2.3.8, through@~2.3, through@~2.3.4:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
-timers-browserify@^1.0.1:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
-  integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=
-  dependencies:
-    process "~0.11.0"
-
 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"
@@ -4994,9 +4143,9 @@ tslib@^1.8.1:
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
 tslib@^2.0.1:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
-  integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
 
 tsutils@^3.21.0:
   version "3.21.0"
@@ -5005,11 +4154,6 @@ tsutils@^3.21.0:
   dependencies:
     tslib "^1.8.1"
 
-tty-browserify@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
-  integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==
-
 type-check@^0.4.0, type-check@~0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -5059,20 +4203,10 @@ 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=
-
-typescript@^4.1.3:
-  version "4.3.5"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
-  integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
-
-umd@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf"
-  integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==
+typescript@^4.4.0-dev.20210528:
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86"
+  integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==
 
 unbox-primitive@^1.0.0:
   version "1.0.1"
@@ -5084,17 +4218,6 @@ unbox-primitive@^1.0.0:
     has-symbols "^1.0.2"
     which-boxed-primitive "^1.0.2"
 
-undeclared-identifiers@^1.1.2:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f"
-  integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==
-  dependencies:
-    acorn-node "^1.3.0"
-    dash-ast "^1.0.0"
-    get-assigned-identifiers "^1.2.0"
-    simple-concat "^1.0.0"
-    xtend "^4.0.1"
-
 underscore@^1.13.1, underscore@~1.12.1:
   version "1.13.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1"
@@ -5204,14 +4327,6 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.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"
-
 urlgrey@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-1.0.0.tgz#72d2f904482d0b602e3c7fa599343d699bbe1017"
@@ -5224,25 +4339,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   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.12.0:
-  version "0.12.4"
-  resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
-  integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==
-  dependencies:
-    inherits "^2.0.3"
-    is-arguments "^1.0.4"
-    is-generator-function "^1.0.7"
-    is-typed-array "^1.1.3"
-    safe-buffer "^5.1.2"
-    which-typed-array "^1.1.2"
-
 utils-merge@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
@@ -5304,11 +4400,6 @@ vfile@^4.0.0:
     unist-util-stringify-position "^2.0.0"
     vfile-message "^2.0.0"
 
-vm-browserify@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
-  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-
 vm2@^3.9.3:
   version "3.9.3"
   resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40"
@@ -5330,19 +4421,6 @@ which-module@^2.0.0:
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which-typed-array@^1.1.2:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff"
-  integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==
-  dependencies:
-    available-typed-arrays "^1.0.2"
-    call-bind "^1.0.0"
-    es-abstract "^1.18.0-next.1"
-    foreach "^2.0.5"
-    function-bind "^1.1.1"
-    has-symbols "^1.0.1"
-    is-typed-array "^1.1.3"
-
 which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -5394,9 +4472,9 @@ write-file-atomic@^3.0.3:
     typedarray-to-buffer "^3.1.5"
 
 ws@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-8.0.0.tgz#550605d13dfc1437c9ec1396975709c6d7ffc57d"
-  integrity sha512-6AcSIXpBlS0QvCVKk+3cWnWElLsA6SzC0lkQ43ciEglgXJXiCWK3/CGFEJ+Ybgp006CMibamAsqOlxE9s4AvYA==
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.0.tgz#0b738cd484bfc9303421914b11bb4011e07615bb"
+  integrity sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==
 
 x-is-string@^0.1.0:
   version "0.1.0"
@@ -5413,7 +4491,7 @@ xregexp@2.0.0:
   resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
   integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
 
-xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1:
+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==