diff --git a/packages/desktop-client/package.json b/packages/desktop-client/package.json
index 77220ed8ba5038f959c56bf2e74cbd537e2ecaf4..977e91ab5ca760ab33670535a90bf0b75430382a 100644
--- a/packages/desktop-client/package.json
+++ b/packages/desktop-client/package.json
@@ -16,7 +16,6 @@
     "@react-stately/list": "^3.5.3",
     "@reactions/component": "^2.0.2",
     "chalk": "2.4.1",
-    "codemirror": "^5.37.0",
     "cross-env": "^7.0.3",
     "customize-cra": "^1.0.0",
     "date-fns": "2.0.0-alpha.27",
@@ -28,7 +27,6 @@
     "inter-ui": "^3.19.3",
     "jest-watch-typeahead": "^2.2.2",
     "mitt": "^3.0.0",
-    "perf-deets": "^1.0.15",
     "prop-types": "15.6.0",
     "react": "16.13.1",
     "react-app-rewired": "^2.2.1",
diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js
index 294235cf9f2941b32e7683166241ff258b8aed60..dd24ff5aa24b3ee78cf41cd244d38ef346f3d23c 100644
--- a/packages/desktop-client/src/browser-preload.browser.js
+++ b/packages/desktop-client/src/browser-preload.browser.js
@@ -8,7 +8,6 @@ const backendWorkerUrl = new URL('./browser-server.js', import.meta.url);
 // everything else.
 
 let IS_DEV = process.env.NODE_ENV === 'development';
-let IS_PERF_BUILD = process.env.PERF_BUILD != null;
 let ACTUAL_VERSION = process.env.REACT_APP_ACTUAL_VERSION;
 
 // *** Start the backend ***
@@ -32,46 +31,10 @@ function createBackendWorker() {
       'SharedArrayBufferOverride',
     ),
   });
-
-  if (IS_DEV || IS_PERF_BUILD) {
-    worker.onmessage = e => {
-      if (e.data.type === '__actual:backend-running') {
-        let activity = document.querySelector('.debugger .activity');
-        if (activity) {
-          let original = window.getComputedStyle(activity)['background-color'];
-          activity.style.transition = 'none';
-          activity.style.backgroundColor = '#3EBD93';
-          setTimeout(() => {
-            activity.style.transition = 'background-color 1s';
-            activity.style.backgroundColor = original;
-          }, 100);
-        }
-      }
-    };
-
-    import('perf-deets/frontend').then(({ listenForPerfData }) => {
-      listenForPerfData(worker);
-    });
-  }
 }
 
 createBackendWorker();
 
-if (IS_DEV || IS_PERF_BUILD) {
-  import('perf-deets/frontend').then(({ listenForPerfData }) => {
-    listenForPerfData(window);
-
-    global.__startProfile = () => {
-      window.postMessage({ type: '__perf-deets:start-profile' });
-      worker.postMessage({ type: '__perf-deets:start-profile' });
-    };
-    global.__stopProfile = () => {
-      window.postMessage({ type: '__perf-deets:stop-profile' });
-      worker.postMessage({ type: '__perf-deets:stop-profile' });
-    };
-  });
-}
-
 global.Actual = {
   IS_DEV,
   ACTUAL_VERSION,
@@ -153,13 +116,6 @@ global.Actual = {
   },
 };
 
-if (IS_DEV) {
-  global.Actual.reloadBackend = () => {
-    worker.postMessage({ type: '__actual:shutdown' });
-    createBackendWorker();
-  };
-}
-
 document.addEventListener('keydown', e => {
   if (e.metaKey || e.ctrlKey) {
     // Cmd/Ctrl+o
diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js
index c90c764e251195185a77ebf620e10f9c79b0d07b..8ccee8c3402769551ef5c93da51aa5733a5cb8ff 100644
--- a/packages/desktop-client/src/browser-server.js
+++ b/packages/desktop-client/src/browser-server.js
@@ -21,24 +21,16 @@ self.addEventListener('message', e => {
 
       importScripts(`${msg.publicUrl}/kcab/kcab.worker.${hash}.js`);
 
-      backend.initApp(version, isDev, self).then(
-        () => {
-          if (isDev) {
-            console.log('Backend running!');
-            self.postMessage({ type: '__actual:backend-running' });
-          }
-        },
-        err => {
-          console.log(err);
-          let msg = {
-            type: 'app-init-failure',
-            IDBFailure: err.message.includes('indexeddb-failure'),
-          };
-          self.postMessage(msg);
+      backend.initApp(version, isDev, self).catch(err => {
+        console.log(err);
+        let msg = {
+          type: 'app-init-failure',
+          IDBFailure: err.message.includes('indexeddb-failure'),
+        };
+        self.postMessage(msg);
 
-          throw err;
-        },
-      );
+        throw err;
+      });
     }
   }
 });
diff --git a/packages/desktop-client/src/components/Debugger.js b/packages/desktop-client/src/components/Debugger.js
deleted file mode 100644
index 413db67e39af4324aa678dfe83d97b0052f660b5..0000000000000000000000000000000000000000
--- a/packages/desktop-client/src/components/Debugger.js
+++ /dev/null
@@ -1,314 +0,0 @@
-import React from 'react';
-
-import CodeMirror from 'codemirror';
-
-import * as spreadsheet from 'loot-core/src/client/sheetql/spreadsheet';
-import {
-  send,
-  init as initConnection,
-} from 'loot-core/src/platform/client/fetch';
-import {
-  View,
-  Button,
-  Input,
-  InlineField,
-} from 'loot-design/src/components/common';
-import { colors } from 'loot-design/src/style';
-
-require('codemirror/lib/codemirror.css');
-require('codemirror/theme/monokai.css');
-
-class Debugger extends React.Component {
-  state = {
-    recording: false,
-    selecting: false,
-    name: '__global!tmp',
-    collapsed: true,
-    node: null,
-  };
-
-  toggleRecord = () => {
-    if (this.state.recording) {
-      window.__stopProfile();
-      this.setState({ recording: false });
-    } else {
-      window.__startProfile();
-      this.setState({ recording: true });
-    }
-  };
-
-  reloadBackend = async () => {
-    window.Actual.reloadBackend();
-    initConnection(await global.Actual.getServerSocket());
-  };
-
-  init() {
-    this.mirror = CodeMirror(this.node, {
-      theme: 'monokai',
-    });
-
-    this.mirror.setSize('100%', '100%');
-
-    // this.mirror.on('change', () => {
-    //   const val = this.mirror.getValue();
-    //   const [sheetName, name] = this.state.name.split('!');
-
-    //   spreadsheet.set(sheetName, name, this.mirror.getValue());
-    // });
-
-    const mouseoverHandler = e => {
-      let node = e.target;
-      let cellname = null;
-
-      while (!cellname && node) {
-        cellname = node.dataset && node.dataset.cellname;
-        node = node.parentNode;
-      }
-
-      if (this.state.selecting && cellname) {
-        this.bind(cellname);
-      }
-    };
-    document.body.addEventListener('mouseover', mouseoverHandler, false);
-
-    const clickHandler = e => {
-      if (this.state.selecting) {
-        this.setState({ selecting: false });
-      }
-    };
-    document.body.addEventListener('click', clickHandler, false);
-
-    this.removeListeners = () => {
-      document.body.removeEventListener('mouseover', mouseoverHandler);
-      document.body.removeEventListener('click', clickHandler);
-    };
-
-    this.bind(this.state.name);
-  }
-
-  deinit() {
-    if (this.unbind) {
-      this.unbind();
-    }
-
-    this.removeListeners();
-    this.mirror = null;
-  }
-
-  bind(resolvedName) {
-    if (this.unbind) {
-      this.unbind();
-    }
-    const [sheetName, name] = resolvedName.split('!');
-    let currentReq = Math.random();
-    this.currentReq = currentReq;
-
-    send('debugCell', { sheetName, name }).then(node => {
-      if (currentReq === this.currentReq) {
-        if (node._run) {
-          this.mirror.setValue(node._run);
-        }
-        this.setState({ name: node.name, node });
-
-        this.unbind = spreadsheet.bind(sheetName, { name }, null, node => {
-          if (currentReq !== this.currentReq) {
-            return;
-          }
-
-          this.setState({ node: { ...this.state.node, value: node.value } });
-
-          this.valueNode.style.transition = 'none';
-          this.valueNode.style.backgroundColor = colors.y9;
-          setTimeout(() => {
-            this.valueNode.style.transition = 'background-color .8s';
-            this.valueNode.style.backgroundColor = 'rgba(0, 0, 0, 0)';
-          }, 50);
-        });
-      }
-    });
-  }
-
-  componentWillUnmount() {
-    if (this.unbind) {
-      this.unbind();
-      this.unbind = null;
-    }
-  }
-
-  onShow = () => {
-    this.setState({ collapsed: false }, () => {
-      this.init();
-    });
-  };
-
-  onClose = () => {
-    this.setState({ collapsed: true }, () => {
-      this.deinit();
-    });
-  };
-
-  onSelect = () => {
-    this.setState({ selecting: true });
-  };
-
-  onNameChange = e => {
-    const name = e.target.value;
-    this.bind(name);
-    this.setState({ name });
-  };
-
-  unselect() {
-    if (this.unbind) {
-      this.unbind();
-      this.unbind = null;
-      this.setState({ sheetName: null, name: null, node: null });
-    }
-  }
-
-  render() {
-    const { children } = this.props;
-    const { name, node, selecting, collapsed, recording } = this.state;
-
-    return (
-      <View
-        style={{
-          height: '100%',
-          '& .CodeMirror': { border: '1px solid ' + colors.b4 },
-        }}
-      >
-        <div style={{ flex: 1, overflow: 'hidden' }}>{children}</div>
-        <View
-          className="debugger"
-          style={[
-            {
-              position: 'fixed',
-              right: 0,
-              bottom: 0,
-              margin: 15,
-              padding: 10,
-              backgroundColor: 'rgba(50, 50, 50, .85)',
-              color: 'white',
-              zIndex: 1000,
-              flexDirection: 'row',
-              alignItems: 'center',
-            },
-            !collapsed && {
-              width: 700,
-              height: 200,
-            },
-          ]}
-        >
-          {collapsed ? (
-            <React.Fragment>
-              <div
-                className="activity"
-                style={{
-                  width: 10,
-                  height: 10,
-                  backgroundColor: '#303030',
-                  marginRight: 10,
-                  borderRadius: 10,
-                }}
-              />
-              <Button onClick={this.toggleRecord} style={{ marginRight: 10 }}>
-                {recording ? 'Stop' : 'Start'} Profile
-              </Button>
-              <Button onClick={this.reloadBackend} style={{ marginRight: 10 }}>
-                Reload backend
-              </Button>
-              <Button onClick={this.onShow}>^</Button>
-            </React.Fragment>
-          ) : (
-            <View style={{ flex: 1 }}>
-              <View
-                style={{
-                  flexDirection: 'row',
-                  justifyContent: 'flex-start',
-                  marginBottom: 5,
-                  flexShrink: 0,
-                }}
-              >
-                <Button
-                  style={{
-                    backgroundColor: '#303030',
-                    color: 'white',
-                    padding: '2px 5px',
-                    marginRight: 5,
-                  }}
-                  onClick={this.onClose}
-                >
-                  v
-                </Button>
-                <Button
-                  style={[
-                    {
-                      backgroundColor: '#303030',
-                      color: 'white',
-                      padding: '2px 5px',
-                    },
-                    selecting && {
-                      backgroundColor: colors.p7,
-                    },
-                  ]}
-                  onClick={this.onSelect}
-                >
-                  Inspect Cell
-                </Button>
-              </View>
-              <InlineField label="Name" style={{ flex: '0 0 auto' }}>
-                <Input
-                  value={name}
-                  onChange={this.onNameChange}
-                  style={{
-                    backgroundColor: '#303030',
-                    color: 'white',
-                    flex: 1,
-                  }}
-                />
-              </InlineField>
-              <InlineField
-                label="Expr"
-                style={{ flex: 1, alignItems: 'stretch', overflow: 'hidden' }}
-              >
-                <div
-                  style={{ flex: 1, overflow: 'hidden' }}
-                  ref={n => (this.node = n)}
-                />
-              </InlineField>
-              <InlineField
-                label="Dependencies"
-                labelWidth={100}
-                style={{ flex: '0 0 auto' }}
-              >
-                <pre
-                  style={{
-                    backgroundColor: 'rgba(0, 0, 0, 0)',
-                    height: 30,
-                    overflow: 'scroll',
-                  }}
-                >
-                  {node && JSON.stringify(node._dependencies, null, 2)}
-                </pre>
-              </InlineField>
-              <InlineField label="Value" style={{ flex: '0 0 auto' }}>
-                <div
-                  style={{
-                    backgroundColor: 'rgba(0, 0, 0, 0)',
-                    transition: 'background-color .5s',
-                    height: 30,
-                    overflow: 'scroll',
-                  }}
-                  ref={n => (this.valueNode = n)}
-                >
-                  {node && JSON.stringify(node.value)}
-                </div>
-              </InlineField>
-            </View>
-          )}
-        </View>
-      </View>
-    );
-  }
-}
-
-export default Debugger;
diff --git a/packages/desktop-client/src/components/FinancesApp.js b/packages/desktop-client/src/components/FinancesApp.js
index 1a59f5c6c9de76d9eb6d0f04f1fd7ad83700ec4e..76efc5cf2f19398ac8c1cd44bd8092275bf90a3a 100644
--- a/packages/desktop-client/src/components/FinancesApp.js
+++ b/packages/desktop-client/src/components/FinancesApp.js
@@ -56,7 +56,6 @@ import LinkSchedule from './schedules/LinkSchedule';
 import PostsOfflineNotification from './schedules/PostsOfflineNotification';
 import Settings from './settings';
 import Titlebar, { TitlebarProvider } from './Titlebar';
-// import Debugger from './Debugger';
 
 function PageRoute({ path, component: Component }) {
   return (
@@ -336,7 +335,6 @@ class FinancesApp extends React.Component {
                   <Notifications />
                   <BankSyncStatus />
                   <StackedRoutes isMobile={this.state.isMobile} />
-                  {/*window.Actual.IS_DEV && <Debugger />*/}
                   <Modals history={this.history} />
                 </div>
                 {this.state.isMobile && (
diff --git a/packages/loot-core/jest.web.config.js b/packages/loot-core/jest.web.config.js
index b3fe4bcb20bfc10508b134199b9e5153e9c585e8..659966ffc71a93af38f646d8c635bef9e947a377 100644
--- a/packages/loot-core/jest.web.config.js
+++ b/packages/loot-core/jest.web.config.js
@@ -4,10 +4,7 @@ module.exports = {
   testEnvironment: 'jsdom',
   testPathIgnorePatterns: ['/node_modules/', '/lib/'].filter(Boolean),
   testMatch: ['**/*.web.test.js'],
-  transformIgnorePatterns: [
-    '__mocks__',
-    '/node_modules/(?!perf-deets|absurd-sql)',
-  ],
+  transformIgnorePatterns: ['__mocks__', '/node_modules/(?!absurd-sql)'],
   transform: {
     '\\.pegjs$': 'pegjs-jest-transformer',
   },
diff --git a/packages/loot-core/package.json b/packages/loot-core/package.json
index 301f0aa69fd9ff435bfa12d9c626f80b17b5962b..ea95b414751daa1206d9bff24330115596c6a0d8 100644
--- a/packages/loot-core/package.json
+++ b/packages/loot-core/package.json
@@ -61,7 +61,6 @@
     "pegjs": "^0.10.0",
     "pegjs-jest-transformer": "^1.2.3",
     "pegjs-loader": "^0.5.6",
-    "perf-deets": "^1.0.15",
     "snapshot-diff": "^0.10.0",
     "source-map": "^0.7.3",
     "throttleit": "^1.0.0",
diff --git a/packages/loot-core/src/platform/server/asyncStorage/index.web.js b/packages/loot-core/src/platform/server/asyncStorage/index.web.js
index c0b790a25048d8679e712864bd1456a2489067ff..09835319bb88d84ea6decd65a584749cb08d4250 100644
--- a/packages/loot-core/src/platform/server/asyncStorage/index.web.js
+++ b/packages/loot-core/src/platform/server/asyncStorage/index.web.js
@@ -1,11 +1,7 @@
-let { getDatabase, closeDatabase } = require('../indexeddb');
+let { getDatabase } = require('../indexeddb');
 
 function init() {}
 
-function shutdown() {
-  closeDatabase();
-}
-
 function commit(trans) {
   if (trans.commit) {
     trans.commit();
@@ -116,7 +112,6 @@ async function multiRemove(keys) {
 
 module.exports = {
   init,
-  shutdown,
   getItem,
   setItem,
   removeItem,
diff --git a/packages/loot-core/src/platform/server/fs/index.web.js b/packages/loot-core/src/platform/server/fs/index.web.js
index 85db86b4a95426e31268738afe5ed325634a2495..2596e9569d84661718375477efe214859b39c090 100644
--- a/packages/loot-core/src/platform/server/fs/index.web.js
+++ b/packages/loot-core/src/platform/server/fs/index.web.js
@@ -243,10 +243,6 @@ async function init() {
   await populateFileHeirarchy();
 }
 
-function shutdown() {
-  BFS.backend.shutdown();
-}
-
 function basename(filepath) {
   let parts = filepath.split('/');
   return parts.slice(0, -1).join('/');
@@ -321,7 +317,6 @@ module.exports = {
   pathToId,
   populateFileHeirarchy,
   init,
-  shutdown,
   bundledDatabasePath: '/default-db.sqlite',
   migrationsPath: '/migrations',
   demoBudgetPath: '/demo-budget',
diff --git a/packages/loot-core/src/platform/server/indexeddb/index.web.js b/packages/loot-core/src/platform/server/indexeddb/index.web.js
index bb09f4ddc65ef3d852ef5f0d6d97fe6ccdbeac57..633f49d907983e0c301e90ab9d5f4f9e66d14055 100644
--- a/packages/loot-core/src/platform/server/indexeddb/index.web.js
+++ b/packages/loot-core/src/platform/server/indexeddb/index.web.js
@@ -138,14 +138,6 @@ function closeDatabase() {
   }
 }
 
-if (process.env.NODE_ENV === 'development') {
-  self.addEventListener('message', e => {
-    if (e.data.type === '__actual:shutdown') {
-      closeDatabase();
-    }
-  });
-}
-
 module.exports = {
   getDatabase,
   openDatabase,
diff --git a/packages/loot-core/src/platform/server/sqlite/index.web.js b/packages/loot-core/src/platform/server/sqlite/index.web.js
index a4586235eb7a942df8149447c6f38c30617d1619..d8439a3a0ef5de19e7789f4e6ce1d429ee23f4cb 100644
--- a/packages/loot-core/src/platform/server/sqlite/index.web.js
+++ b/packages/loot-core/src/platform/server/sqlite/index.web.js
@@ -1,5 +1,4 @@
 import initSqlJS from '@jlongster/sql.js';
-import * as perf from 'perf-deets';
 
 let SQL = null;
 
@@ -41,7 +40,6 @@ export function prepare(db, sql) {
 }
 
 export function runQuery(db, sql, params = [], fetchAll) {
-  perf.count('runQuery');
   if (params) {
     verifyParamTypes(sql, params);
   }
diff --git a/packages/loot-core/src/server/budget/goaltemplates.js b/packages/loot-core/src/server/budget/goaltemplates.js
index afd9173219839948a3b15180246754b06e5efa48..7a81dc72ebeafc9025bcec30071f4730688fbe61 100644
--- a/packages/loot-core/src/server/budget/goaltemplates.js
+++ b/packages/loot-core/src/server/budget/goaltemplates.js
@@ -133,8 +133,6 @@ async function applyCategoryTemplate(category, template_lines, month, force) {
   // remove lines for past dates, calculate repeating dates
   let got_by = false;
   template_lines = template_lines.filter(template => {
-    //debugger;
-
     switch (template.type) {
       case 'by':
       case 'spend':
diff --git a/packages/loot-core/src/server/main.js b/packages/loot-core/src/server/main.js
index 752b75e9793cae1ca069e7ed384158891ab4501a..38f87ab22db54d730b240fb02ff9cbb2342c34f1 100644
--- a/packages/loot-core/src/server/main.js
+++ b/packages/loot-core/src/server/main.js
@@ -2507,21 +2507,3 @@ export const lib = {
   },
   SyncProtoBuf: SyncPb,
 };
-
-if (process.env.NODE_ENV === 'development' && Platform.isWeb) {
-  // Support reloading the backend
-  self.addEventListener('message', async e => {
-    if (e.data.type === '__actual:shutdown') {
-      await sheet.waitOnSpreadsheet();
-      await app.stopServices();
-      await db.closeDatabase();
-      asyncStorage.shutdown();
-      fs.shutdown();
-
-      setTimeout(() => {
-        // Give everything else some time to process shutdown events
-        self.close();
-      }, 100);
-    }
-  });
-}
diff --git a/packages/loot-core/webpack/webpack.browser.config.js b/packages/loot-core/webpack/webpack.browser.config.js
index 57f5b657c006efcfca0c363b547fda9ff9c813ae..d9cb170cef508f0b864bc54219c14f69c8673572 100644
--- a/packages/loot-core/webpack/webpack.browser.config.js
+++ b/packages/loot-core/webpack/webpack.browser.config.js
@@ -18,11 +18,6 @@ module.exports = {
     alias: {
       fs: 'memfs',
       path: 'path-browserify',
-
-      'perf-deets':
-        process.env.NODE_ENV === 'development' || process.env.PERF_BUILD
-          ? 'perf-deets'
-          : require.resolve('perf-deets/noop'),
     },
   },
   resolveLoader: {
diff --git a/packages/loot-core/webpack/webpack.desktop.config.js b/packages/loot-core/webpack/webpack.desktop.config.js
index 433df753c71886823e4d07694cc55684216fe91b..72ccdab09951999297e4695751e17531743a856f 100644
--- a/packages/loot-core/webpack/webpack.desktop.config.js
+++ b/packages/loot-core/webpack/webpack.desktop.config.js
@@ -17,9 +17,6 @@ module.exports = {
   },
   resolve: {
     extensions: ['.electron.js', '.js', '.json'],
-    alias: {
-      'perf-deets': require.resolve('perf-deets/noop'),
-    },
   },
   externals: [
     'better-sqlite3',
diff --git a/upcoming-release-notes/755.md b/upcoming-release-notes/755.md
new file mode 100644
index 0000000000000000000000000000000000000000..2746f78b32191f440a328c38b8aa1134aac25a17
--- /dev/null
+++ b/upcoming-release-notes/755.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [MatissJanis]
+---
+
+Removing unused `Debugger` component and its dependencies: perf-deets, codemirror
diff --git a/yarn.lock b/yarn.lock
index 2a485d05e48297b232f3f963615055698233c2c6..19585b2b39ecad3cec740c83544d439adcc3a7ae 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -62,7 +62,6 @@ __metadata:
     "@react-stately/list": ^3.5.3
     "@reactions/component": ^2.0.2
     chalk: 2.4.1
-    codemirror: ^5.37.0
     cross-env: ^7.0.3
     customize-cra: ^1.0.0
     date-fns: 2.0.0-alpha.27
@@ -74,7 +73,6 @@ __metadata:
     inter-ui: ^3.19.3
     jest-watch-typeahead: ^2.2.2
     mitt: ^3.0.0
-    perf-deets: ^1.0.15
     prop-types: 15.6.0
     react: 16.13.1
     react-app-rewired: ^2.2.1
@@ -2555,16 +2553,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@observablehq/plot@npm:^0.1.0":
-  version: 0.1.0
-  resolution: "@observablehq/plot@npm:0.1.0"
-  dependencies:
-    d3: ^6.7.0
-    isoformat: ^0.1.0
-  checksum: 02935dc844a488ef291a26ca1b4c14d29941ad5b2225710052699ca5a9c56cf31764e32ca39f4b20208ed4c2ff027e08a36c295bc1e66d054766926f4e069a80
-  languageName: node
-  linkType: hard
-
 "@playwright/test@npm:^1.29.1":
   version: 1.29.1
   resolution: "@playwright/test@npm:1.29.1"
@@ -6719,13 +6707,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"codemirror@npm:^5.37.0":
-  version: 5.65.2
-  resolution: "codemirror@npm:5.65.2"
-  checksum: 8e13511319aa8b4772a4406952d89ecef63f4518fa17a3893270d9835ade59d67a94bc83918d881901abb57ed68cbbe697e720a01a43e1aae43fc0f03a6591b1
-  languageName: node
-  linkType: hard
-
 "collect-v8-coverage@npm:^1.0.0":
   version: 1.0.1
   resolution: "collect-v8-coverage@npm:1.0.1"
@@ -6821,13 +6802,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"commander@npm:2, commander@npm:^2.20.0":
-  version: 2.20.3
-  resolution: "commander@npm:2.20.3"
-  checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e
-  languageName: node
-  linkType: hard
-
 "commander@npm:2.9.0":
   version: 2.9.0
   resolution: "commander@npm:2.9.0"
@@ -6837,6 +6811,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"commander@npm:^2.20.0":
+  version: 2.20.3
+  resolution: "commander@npm:2.20.3"
+  checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e
+  languageName: node
+  linkType: hard
+
 "commander@npm:^5.0.0":
   version: 5.1.0
   resolution: "commander@npm:5.1.0"
@@ -7597,51 +7578,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-array@npm:2, d3-array@npm:^2.3.0, d3-array@npm:^2.5.0":
-  version: 2.12.1
-  resolution: "d3-array@npm:2.12.1"
-  dependencies:
-    internmap: ^1.0.0
-  checksum: 97853b7b523aded17078f37c67742f45d81e88dda2107ae9994c31b9e36c5fa5556c4c4cf39650436f247813602dfe31bf7ad067ff80f127a16903827f10c6eb
-  languageName: node
-  linkType: hard
-
-"d3-axis@npm:2":
-  version: 2.1.0
-  resolution: "d3-axis@npm:2.1.0"
-  checksum: 43d80f68e516b315bbe86afff1552abd9518296e60f58a9a70ee9a524c109dec9d4585da5fc34a5c589e599c5ee4fe465f850c5a43f5e112c3850965bb00e9f5
-  languageName: node
-  linkType: hard
-
-"d3-brush@npm:2":
-  version: 2.1.0
-  resolution: "d3-brush@npm:2.1.0"
-  dependencies:
-    d3-dispatch: 1 - 2
-    d3-drag: 2
-    d3-interpolate: 1 - 2
-    d3-selection: 2
-    d3-transition: 2
-  checksum: 35fb7e3b422626194aac1b85434e6a346de1b69f497d1f80d2f6bf881602e8826255a7c95a0c27f0de5ec2f5f7bc8481d6e1df24c80ebb28175a0830c868d218
-  languageName: node
-  linkType: hard
-
-"d3-chord@npm:2":
-  version: 2.0.0
-  resolution: "d3-chord@npm:2.0.0"
-  dependencies:
-    d3-path: 1 - 2
-  checksum: 932f1e9a50a68b95f42431fe043164c671433226582cf4e5f5a8f7064da99efaca656283861bf243286c5ef7dcf87aa77811418564fba83350da48d8c50074c0
-  languageName: node
-  linkType: hard
-
-"d3-color@npm:1 - 2, d3-color@npm:2":
-  version: 2.0.0
-  resolution: "d3-color@npm:2.0.0"
-  checksum: b887354aa383937abd04fbffed3e26e5d6a788472cd3737fb10735930e427763e69fe93398663bccf88c0b53ee3e638ac6fcf0c02226b00ed9e4327c2dfbf3dc
-  languageName: node
-  linkType: hard
-
 "d3-color@npm:1 - 3":
   version: 3.1.0
   resolution: "d3-color@npm:3.1.0"
@@ -7649,69 +7585,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-contour@npm:2":
-  version: 2.0.0
-  resolution: "d3-contour@npm:2.0.0"
-  dependencies:
-    d3-array: 2
-  checksum: 7d46bad378f6e329dddcc52df76077f28b563219cf5a0003385fbcb6c501d5fbb10d71c508da6a7690b527ccdbc1909b6f1f36fa36f03b43b19f8bcab0c2961d
-  languageName: node
-  linkType: hard
-
-"d3-delaunay@npm:5":
-  version: 5.3.0
-  resolution: "d3-delaunay@npm:5.3.0"
-  dependencies:
-    delaunator: 4
-  checksum: 3fa5ae167eb86e62ca0f9c3e8d05470b23572b4b480f05201705c0db976d403834cee1cdf264a41c97e45238e3999d48cc593f97d0da37229a42673a6bb10e95
-  languageName: node
-  linkType: hard
-
-"d3-dispatch@npm:1 - 2, d3-dispatch@npm:2":
-  version: 2.0.0
-  resolution: "d3-dispatch@npm:2.0.0"
-  checksum: cf473676ae0df1915d51d056d2c6734ceec480d258611d970a01847c50e8c273c185032bf9ed491abd077696bcbeeb491dc94af53e888871f3a1a0fac7365cec
-  languageName: node
-  linkType: hard
-
-"d3-drag@npm:2":
-  version: 2.0.0
-  resolution: "d3-drag@npm:2.0.0"
-  dependencies:
-    d3-dispatch: 1 - 2
-    d3-selection: 2
-  checksum: 47f0bcdd097fd363d59da41299f276c1f6bd88bc460f53871b3d9c35982d40f59a535c6de7fa07a51120e56c99064bd9aa3551279dc09ce4204c639d54f80399
-  languageName: node
-  linkType: hard
-
-"d3-dsv@npm:1 - 2, d3-dsv@npm:2":
-  version: 2.0.0
-  resolution: "d3-dsv@npm:2.0.0"
-  dependencies:
-    commander: 2
-    iconv-lite: 0.4
-    rw: 1
-  bin:
-    csv2json: bin/dsv2json
-    csv2tsv: bin/dsv2dsv
-    dsv2dsv: bin/dsv2dsv
-    dsv2json: bin/dsv2json
-    json2csv: bin/json2dsv
-    json2dsv: bin/json2dsv
-    json2tsv: bin/json2dsv
-    tsv2csv: bin/dsv2dsv
-    tsv2json: bin/dsv2json
-  checksum: 01b12d81e4ca3996f2e921388b1929c358a39711bf250f2c53dd0e452b80465ebe31ddb58a4064f160322dec7aaf2ceae1a249874af989404705fcfdf1e9b64d
-  languageName: node
-  linkType: hard
-
-"d3-ease@npm:1 - 2, d3-ease@npm:2":
-  version: 2.0.0
-  resolution: "d3-ease@npm:2.0.0"
-  checksum: 1a9f6dfc836f0c66fba1ed28f0a3ad170d7c4f4812d442c6b562163e1a60283cc697e72a2cc4ba64abff9e77ad56354847986a5964e0c661af9b6d132c642e29
-  languageName: node
-  linkType: hard
-
 "d3-ease@npm:^3.0.1":
   version: 3.0.1
   resolution: "d3-ease@npm:3.0.1"
@@ -7719,33 +7592,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-fetch@npm:2":
-  version: 2.0.0
-  resolution: "d3-fetch@npm:2.0.0"
-  dependencies:
-    d3-dsv: 1 - 2
-  checksum: e592420726c39dbbe342504761e5c80a026fc9add4f808ed4e01ab66c3064f7251f988dd2bcb6b8b61f8866769470eabb14a8d7f18e014338d9d9637ffd51af1
-  languageName: node
-  linkType: hard
-
-"d3-force@npm:2":
-  version: 2.1.1
-  resolution: "d3-force@npm:2.1.1"
-  dependencies:
-    d3-dispatch: 1 - 2
-    d3-quadtree: 1 - 2
-    d3-timer: 1 - 2
-  checksum: aaee5b86d753450e72dae6748765ac3e0b7b784bd420a61264b778d697b9521a343b74b5c55654be2ff7fdf9bada0953a6fcae9be69091176d0579b56df72937
-  languageName: node
-  linkType: hard
-
-"d3-format@npm:1 - 2, d3-format@npm:2":
-  version: 2.0.0
-  resolution: "d3-format@npm:2.0.0"
-  checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7
-  languageName: node
-  linkType: hard
-
 "d3-format@npm:1 - 3":
   version: 3.1.0
   resolution: "d3-format@npm:3.1.0"
@@ -7753,31 +7599,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-geo@npm:2":
-  version: 2.0.2
-  resolution: "d3-geo@npm:2.0.2"
-  dependencies:
-    d3-array: ^2.5.0
-  checksum: 992f667c646f8e2ea810de20e62914128e119f0458bce4090934287af3b93395632ed4af16aae7ccae095ae702a23b5d7a49888674f1aa27ab1a6e410882d86c
-  languageName: node
-  linkType: hard
-
-"d3-hierarchy@npm:2":
-  version: 2.0.0
-  resolution: "d3-hierarchy@npm:2.0.0"
-  checksum: 594bea104d3cf947da8499f3c50c93d914c5af34195ef3848e4888ed5c8c1aa6a1adae1dd656acfd04779005255347f68a3d270d825ec94fc88b88a72dd7cb4e
-  languageName: node
-  linkType: hard
-
-"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2, d3-interpolate@npm:2":
-  version: 2.0.1
-  resolution: "d3-interpolate@npm:2.0.1"
-  dependencies:
-    d3-color: 1 - 2
-  checksum: 4a2018ac34fbcc3e0e7241e117087ca1b2274b8b33673913658623efacc5db013b8d876586d167b23e3145bdb34ec8e441d301299b082e1a90985b2f18d4299c
-  languageName: node
-  linkType: hard
-
 "d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1":
   version: 3.0.1
   resolution: "d3-interpolate@npm:3.0.1"
@@ -7787,13 +7608,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-path@npm:1 - 2, d3-path@npm:2":
-  version: 2.0.0
-  resolution: "d3-path@npm:2.0.0"
-  checksum: e39e91dfb9abf9637962caede1f4ea4877f4b9e1c914868bdfc355688e9a637ba51bed0fb6180934eb596e50a4d0d1f001b5f2e98a4a3d23cc42558acfbd1f2c
-  languageName: node
-  linkType: hard
-
 "d3-path@npm:^3.1.0":
   version: 3.1.0
   resolution: "d3-path@npm:3.1.0"
@@ -7801,50 +7615,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-polygon@npm:2":
-  version: 2.0.0
-  resolution: "d3-polygon@npm:2.0.0"
-  checksum: aeabedd8c74b0087d9b3fa9d9a95ce6535edb07c546cb070ffb1f971a3e9112124a9f63bf1377cbb6889d2cb0268363c4a864ec8c7629d990623fff73262d1ea
-  languageName: node
-  linkType: hard
-
-"d3-quadtree@npm:1 - 2, d3-quadtree@npm:2":
-  version: 2.0.0
-  resolution: "d3-quadtree@npm:2.0.0"
-  checksum: e5f9cee19a636666e9f1614f9a9508dde9af47d80769ecb70b6b5033448a8c3ae96f39f1ffea0d1782442559412e3f98508fedf5dc39fe09a2f5995e6a0913bf
-  languageName: node
-  linkType: hard
-
-"d3-random@npm:2":
-  version: 2.2.2
-  resolution: "d3-random@npm:2.2.2"
-  checksum: 79931d642f059c874c2be964b629ac0ce0f73306fa744e2ac8eb5ef1592ecfe8ab4a31a5273bef75db7ba2055c344af9921ef1bf55070edd826d7a7ba0b47331
-  languageName: node
-  linkType: hard
-
-"d3-scale-chromatic@npm:2":
-  version: 2.0.0
-  resolution: "d3-scale-chromatic@npm:2.0.0"
-  dependencies:
-    d3-color: 1 - 2
-    d3-interpolate: 1 - 2
-  checksum: 9fe5b4c1d9907abbda76e414856d9089182a0641f3bbf43d8d3008dbcccb52781e21793682e2b53663d3c6cd63e76965f961894e53ed3b01a345797412fe5b1f
-  languageName: node
-  linkType: hard
-
-"d3-scale@npm:3":
-  version: 3.3.0
-  resolution: "d3-scale@npm:3.3.0"
-  dependencies:
-    d3-array: ^2.3.0
-    d3-format: 1 - 2
-    d3-interpolate: 1.2.0 - 2
-    d3-time: ^2.1.1
-    d3-time-format: 2 - 3
-  checksum: f77e73f0fb422292211d0687914c30d26e29011a936ad2a535a868ae92f306c3545af1fe7ea5db1b3e67dbce7a6c6cd952e53d02d1d557543e7e5d30e30e52f2
-  languageName: node
-  linkType: hard
-
 "d3-scale@npm:^4.0.2":
   version: 4.0.2
   resolution: "d3-scale@npm:4.0.2"
@@ -7858,22 +7628,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-selection@npm:2":
-  version: 2.0.0
-  resolution: "d3-selection@npm:2.0.0"
-  checksum: c00143f55d510e405fc51e5ef626cb6b3705181ec3d595e84e5cb977508e30228d95d7e209aff6e686ff758c562c5dd17e974325ee8c8555bb6f4f382331ec7d
-  languageName: node
-  linkType: hard
-
-"d3-shape@npm:2":
-  version: 2.1.0
-  resolution: "d3-shape@npm:2.1.0"
-  dependencies:
-    d3-path: 1 - 2
-  checksum: 4a82a83fbb15aadee3eb6661226a34bcd793cdbcd7aa5bf980a4724efc93eb94acc6c499f0ebedc9c3144c57c0f033867d137f41e86459acbd5d7181cb27b49c
-  languageName: node
-  linkType: hard
-
 "d3-shape@npm:^3.1.0":
   version: 3.2.0
   resolution: "d3-shape@npm:3.2.0"
@@ -7883,15 +7637,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-time-format@npm:2 - 3, d3-time-format@npm:3":
-  version: 3.0.0
-  resolution: "d3-time-format@npm:3.0.0"
-  dependencies:
-    d3-time: 1 - 2
-  checksum: c20c1667dbea653f81d923e741f84c23e4b966002ba0d6ed94cbc70692105566e55e89d18d175404534a879383fd1123300bd12885a3c924fe924032bb0060db
-  languageName: node
-  linkType: hard
-
 "d3-time-format@npm:2 - 4":
   version: 4.1.0
   resolution: "d3-time-format@npm:4.1.0"
@@ -7901,15 +7646,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-time@npm:1 - 2, d3-time@npm:2, d3-time@npm:^2.1.1":
-  version: 2.1.1
-  resolution: "d3-time@npm:2.1.1"
-  dependencies:
-    d3-array: 2
-  checksum: d1c7b9658c20646e46c3dd19e11c38e02dec098e8baa7d2cd868af8eb01953668f5da499fa33dc63541cf74a26e788786f8828c4381dbbf475a76b95972979a6
-  languageName: node
-  linkType: hard
-
 "d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.0.0":
   version: 3.1.0
   resolution: "d3-time@npm:3.1.0"
@@ -7919,13 +7655,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-timer@npm:1 - 2, d3-timer@npm:2":
-  version: 2.0.0
-  resolution: "d3-timer@npm:2.0.0"
-  checksum: 70733c3baffe473155b712896f04f27dae32d6e94169827f57aebb203e190926ba37af12c5f56cbc7126e538a4b1cd083f2451b80dc2a5644d076b6b31982bd8
-  languageName: node
-  linkType: hard
-
 "d3-timer@npm:^3.0.1":
   version: 3.0.1
   resolution: "d3-timer@npm:3.0.1"
@@ -7933,21 +7662,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-transition@npm:2":
-  version: 2.0.0
-  resolution: "d3-transition@npm:2.0.0"
-  dependencies:
-    d3-color: 1 - 2
-    d3-dispatch: 1 - 2
-    d3-ease: 1 - 2
-    d3-interpolate: 1 - 2
-    d3-timer: 1 - 2
-  peerDependencies:
-    d3-selection: 2
-  checksum: 8f29d195adc75e20dcffacb44e571fd64a2f60d511e6e7438019356bbc6c3ada10ae2b1393c36242ab71eb1b131f60cf71d0d76bd4cab4fce6a5ddaf1f6f6b00
-  languageName: node
-  linkType: hard
-
 "d3-voronoi@npm:^1.1.4":
   version: 1.1.4
   resolution: "d3-voronoi@npm:1.1.4"
@@ -7955,57 +7669,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"d3-zoom@npm:2":
-  version: 2.0.0
-  resolution: "d3-zoom@npm:2.0.0"
-  dependencies:
-    d3-dispatch: 1 - 2
-    d3-drag: 2
-    d3-interpolate: 1 - 2
-    d3-selection: 2
-    d3-transition: 2
-  checksum: d98cc6ffa1105b0062ee312303caff9345ecd1f6df11b7da1e008c1c4731551755ac951327e8c758ffcf74e761218bc6c4f4a6b48f91551ea5d67e0dcf574a49
-  languageName: node
-  linkType: hard
-
-"d3@npm:^6.7.0":
-  version: 6.7.0
-  resolution: "d3@npm:6.7.0"
-  dependencies:
-    d3-array: 2
-    d3-axis: 2
-    d3-brush: 2
-    d3-chord: 2
-    d3-color: 2
-    d3-contour: 2
-    d3-delaunay: 5
-    d3-dispatch: 2
-    d3-drag: 2
-    d3-dsv: 2
-    d3-ease: 2
-    d3-fetch: 2
-    d3-force: 2
-    d3-format: 2
-    d3-geo: 2
-    d3-hierarchy: 2
-    d3-interpolate: 2
-    d3-path: 2
-    d3-polygon: 2
-    d3-quadtree: 2
-    d3-random: 2
-    d3-scale: 3
-    d3-scale-chromatic: 2
-    d3-selection: 2
-    d3-shape: 2
-    d3-time: 2
-    d3-time-format: 3
-    d3-timer: 2
-    d3-transition: 2
-    d3-zoom: 2
-  checksum: 68e37250bacbfaa677d45dbbd82395e898d628d4598b827a3682e3612e0e43c67784f2cd7ecdc23e75c48ad0abe07b65e20c5aa13fb5ebf8879db6db468032e9
-  languageName: node
-  linkType: hard
-
 "damerau-levenshtein@npm:^1.0.8":
   version: 1.0.8
   resolution: "damerau-levenshtein@npm:1.0.8"
@@ -8258,7 +7921,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"delaunator@npm:4, delaunator@npm:^4.0.0":
+"delaunator@npm:^4.0.0":
   version: 4.0.1
   resolution: "delaunator@npm:4.0.1"
   checksum: a49f1c23edbcb79079a13577d32fcd46d0db30879c8484f742a0d840923085f2f3de35a9bfbb96eadd12201ffb7c3adf45b0f528d08b71cb547c5f8068b5d61b
@@ -11398,7 +11061,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"iconv-lite@npm:0.4, iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.4":
+"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.4":
   version: 0.4.24
   resolution: "iconv-lite@npm:0.4.24"
   dependencies:
@@ -11620,13 +11283,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"internmap@npm:^1.0.0":
-  version: 1.0.1
-  resolution: "internmap@npm:1.0.1"
-  checksum: 9d00f8c0cf873a24a53a5a937120dab634c41f383105e066bb318a61864e6292d24eb9516e8e7dccfb4420ec42ca474a0f28ac9a6cc82536898fa09bbbe53813
-  languageName: node
-  linkType: hard
-
 "interpret@npm:^1.4.0":
   version: 1.4.0
   resolution: "interpret@npm:1.4.0"
@@ -12240,13 +11896,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"isoformat@npm:^0.1.0":
-  version: 0.1.0
-  resolution: "isoformat@npm:0.1.0"
-  checksum: 6e184edd27f6e7fee6f13df7590d62012434547b0c15c0a96ff0d6bb58000c7c5597dcd1e7f4facc8b52fedd337fcd3c94951253537f8552aed6f6ea266df854
-  languageName: node
-  linkType: hard
-
 "isomorphic-fetch@npm:^2.1.1":
   version: 2.2.1
   resolution: "isomorphic-fetch@npm:2.2.1"
@@ -13783,7 +13432,6 @@ __metadata:
     pegjs: ^0.10.0
     pegjs-jest-transformer: ^1.2.3
     pegjs-loader: ^0.5.6
-    perf-deets: ^1.0.15
     snapshot-diff: ^0.10.0
     source-map: ^0.7.3
     throttleit: ^1.0.0
@@ -15745,15 +15393,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"perf-deets@npm:^1.0.15":
-  version: 1.0.17
-  resolution: "perf-deets@npm:1.0.17"
-  dependencies:
-    "@observablehq/plot": ^0.1.0
-  checksum: fbff7219db990eb8fe6d044262bd619e3b01471be45258bcd624c3da0397ca89ddbf6d24b0ec602692cad48cc999a106a560460000f5fe2ba84ce509b85caf15
-  languageName: node
-  linkType: hard
-
 "performance-now@npm:^2.1.0":
   version: 2.1.0
   resolution: "performance-now@npm:2.1.0"
@@ -18202,13 +17841,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rw@npm:1":
-  version: 1.3.3
-  resolution: "rw@npm:1.3.3"
-  checksum: c20d82421f5a71c86a13f76121b751553a99cd4a70ea27db86f9b23f33db941f3f06019c30f60d50c356d0bd674c8e74764ac146ea55e217c091bde6fba82aa3
-  languageName: node
-  linkType: hard
-
 "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1":
   version: 5.1.2
   resolution: "safe-buffer@npm:5.1.2"