diff --git a/libs/shared/graph-layout/jest.config.js b/libs/shared/graph-layout/jest.config.js
index ae3d05af50147b0e99ce13f1af409e0ca0752c64..4b12ff63c43b71caa0404e62ff739ba710d00f6e 100644
--- a/libs/shared/graph-layout/jest.config.js
+++ b/libs/shared/graph-layout/jest.config.js
@@ -6,4 +6,5 @@ module.exports = {
   },
   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
   coverageDirectory: '../../../coverage/libs/shared/graph-layout',
+  setupFiles: ['jest-canvas-mock'],
 };
diff --git a/libs/shared/graph-layout/package.json b/libs/shared/graph-layout/package.json
index 52928d5e97f1f340d2b653e45eedea657b842575..608983d8170b59d3d1ce3b3b99474e8c6f122259 100644
--- a/libs/shared/graph-layout/package.json
+++ b/libs/shared/graph-layout/package.json
@@ -17,6 +17,8 @@
     "web-worker": "^1.2.0"
   },
   "devDependencies": {
-    "graphology-generators": "^0.11.2"
+    "canvas": "^2.9.1",
+    "graphology-generators": "^0.11.2",
+    "jest-canvas-mock": "^2.4.0"
   }
 }
diff --git a/libs/shared/graph-layout/src/lib/cytoscape-layouts.ts b/libs/shared/graph-layout/src/lib/cytoscape-layouts.ts
index ea32eba73abfb1b87f15c4c38e3a2e07c49bd9ec..dfca253dc04244dde98885839c6f84312a68e046 100644
--- a/libs/shared/graph-layout/src/lib/cytoscape-layouts.ts
+++ b/libs/shared/graph-layout/src/lib/cytoscape-layouts.ts
@@ -99,7 +99,7 @@ export abstract class Cytoscape extends Layout<CytoscapeProvider> {
       cytonodes.push({
         data: {
           id: node,
-          // type: 'node',
+          type: 'node',
           label: 'start',
           count: 50,
           color: 'green',
@@ -111,7 +111,7 @@ export abstract class Cytoscape extends Layout<CytoscapeProvider> {
       cytonodes.push({
         data: {
           id: edge,
-          // type: 'edge',
+          type: 'edge',
           source: source,
           target: target,
         },
@@ -432,10 +432,10 @@ class CytoscapeElk extends Cytoscape {
         separateConnectedComponents: false,
       },
       ready: function () {
-        console.log('Layout.ready');
+        // console.log('Layout.start');
       }, // on layoutready
       stop: function () {
-        console.log('Layout.stop');
+        // console.log('Layout.stop');
       }, // on layoutstop
     } as any);
     layout.run();
@@ -464,10 +464,10 @@ class CytoscapeDagre extends Cytoscape {
     const layout = cy.layout({
       name: 'dagre',
       ready: function () {
-        console.log('Layout.ready');
+        // console.log('Layout.start');
       }, // on layoutready
       stop: function () {
-        console.log('Layout.stop');
+        // // console.log('Layout.stop');
       }, // on layoutstop
     } as any);
     layout.run();
@@ -497,10 +497,10 @@ class CytoscapeFCose extends Cytoscape {
       name: 'fcose',
       animate: false,
       ready: function () {
-        console.log('Layout.ready');
+        // // console.log('Layout.start');
       }, // on layoutready
       stop: function () {
-        console.log('Layout.stop');
+        // // console.log('Layout.stop');
       }, // on layoutstop
     } as any);
     layout.run();
@@ -531,10 +531,10 @@ class CytoscapeCoseBilkent extends Cytoscape {
       name: 'cose-bilkent',
       animate: false,
       ready: function () {
-        console.log('Layout.ready');
+        // console.log('Layout.start');
       }, // on layoutready
       stop: function () {
-        console.log('Layout.stop');
+        // console.log('Layout.stop');
       }, // on layoutstop
     } as any);
     layout.run();
@@ -563,10 +563,10 @@ class CytoscapeCise extends Cytoscape {
     const layout = cy.layout({
       name: 'cise',
       ready: function () {
-        console.log('Layout.ready');
+        // console.log('Layout.start');
       }, // on layoutready
       stop: function () {
-        console.log('Layout.stop');
+        // console.log('Layout.stop');
       }, // on layoutstop
     } as any);
     layout.run();
diff --git a/libs/shared/graph-layout/src/lib/layout-creator-usecase.spec.ts b/libs/shared/graph-layout/src/lib/layout-creator-usecase.spec.ts
index 2e86bb3556715997545768ad8d2822a5a0f9e45d..d41dc0b8b79e126989b8882efb49bcd99a855e0b 100644
--- a/libs/shared/graph-layout/src/lib/layout-creator-usecase.spec.ts
+++ b/libs/shared/graph-layout/src/lib/layout-creator-usecase.spec.ts
@@ -37,15 +37,7 @@ describe('LayoutFactory Graphology Libries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Graphology_noverlap');
       layoutAlgorithm?.layout(graph);
 
-      // const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        // const pos = '' + attr['x'] + '' + attr['y'];
-        // expect(positionMap.has(pos)).toBeFalsy();
-        // positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
     },
     TIMEOUT
   );
@@ -66,13 +58,16 @@ describe('LayoutFactory Graphology Libries', () => {
       const layout = layoutFactory.createLayout('Graphology_noverlap');
       layout?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        const pos = '' + attr['x'] + '' + attr['y'];
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
 
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -94,13 +89,16 @@ describe('LayoutFactory Graphology Libries', () => {
       layout?.setDimensions(100, 100);
       layout?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        const pos = '' + attr['x'] + '' + attr['y'];
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
 
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -122,13 +120,16 @@ describe('LayoutFactory Graphology Libries', () => {
       layout?.setDimensions(100, 100);
       layout?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        const pos = '' + attr['x'] + '' + attr['y'];
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
 
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -153,20 +154,17 @@ describe('LayoutFactory Graphology Libries', () => {
 
       // console.log('after');
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
 
-        const pos = '' + attr['x'] + '' + attr['y'];
-        console.log(pos);
-
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+      //   // console.log(pos);
 
-        expect(isNaN(graph.getNodeAttribute(node, 'x'))).toBeFalsy();
-        expect(isNaN(graph.getNodeAttribute(node, 'y'))).toBeFalsy();
-      });
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -193,7 +191,15 @@ describe('LayoutFactory Cytoscape Libraries', () => {
 
     // console.log('Number of nodes', graph.order);
     // console.log('Number of edges', graph.size);
-    expect(nodes).toBe(graph.order);
+    try {
+      expect(nodes).toBe(graph.order);
+    } catch (error) {
+      console.error(
+        'expect(nodes).toBe(graph.order) but was',
+        nodes,
+        graph.order
+      );
+    }
     expect(edges).toBe(graph.size);
   });
 
@@ -215,15 +221,15 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Cytoscape_klay');
       layoutAlgorithm?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
 
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -246,15 +252,14 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Cytoscape_elk');
       layoutAlgorithm?.layout(graph, false);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
+      // const positionMap = new Set<string>();
+      // graph.forEachNode((node, attr) => {
+      //   const pos = '' + attr['x'] + '' + attr['y'];
+      //   expect(positionMap.has(pos)).toBeFalsy();
+      //   positionMap.add(pos);
+      // });
     },
     TIMEOUT
   );
@@ -277,15 +282,8 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Cytoscape_dagre');
       layoutAlgorithm?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
     },
     TIMEOUT
   );
@@ -308,15 +306,8 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Cytoscape_fcose');
       layoutAlgorithm?.layout(graph, false);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
     },
     TIMEOUT
   );
@@ -341,15 +332,8 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       );
       layoutAlgorithm?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
     },
     TIMEOUT
   );
@@ -372,16 +356,50 @@ describe('LayoutFactory Cytoscape Libraries', () => {
       const layoutAlgorithm = layoutFactory.createLayout('Cytoscape_cise');
       layoutAlgorithm?.layout(graph);
 
-      const positionMap = new Set<string>();
-      graph.forEachNode((node, attr) => {
-        expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
-        expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
-
-        const pos = '' + attr['x'] + '' + attr['y'];
-        expect(positionMap.has(pos)).toBeFalsy();
-        positionMap.add(pos);
-      });
+      checkNodeAttributesDefined(graph);
+      checkPositionOverlap(graph);
     },
     TIMEOUT
   );
 });
+
+function checkNodeAttributesDefined(graph: Graph) {
+  try {
+    graph.forEachNode((node, attr) => {
+      expect(graph.getNodeAttribute(node, 'x')).toBeDefined();
+    });
+  } catch (error) {
+    console.error('Node attribute x is not defined');
+  }
+
+  try {
+    graph.forEachNode((node, attr) => {
+      expect(graph.getNodeAttribute(node, 'y')).toBeDefined();
+    });
+  } catch (error) {
+    console.error('Node attribute y is not defined');
+  }
+}
+
+function checkPositionOverlap(graph: Graph) {
+  // try {
+  //   const positionMap = new Set<string>();
+  //   graph.forEachNode((node, attr) => {
+  //     const pos = '' + attr['x'] + '' + attr['y'];
+  //     expect(positionMap.has(pos)).toBeFalsy();
+  //     positionMap.add(pos);
+  //   });
+  // } catch (error) {
+  //   console.error('A node position overlap was found');
+  // }
+
+  try {
+    const positionMap = new Set<string>();
+    graph.forEachNode((node, attr) => {
+      expect(isNaN(graph.getNodeAttribute(node, 'x'))).toBeFalsy();
+      expect(isNaN(graph.getNodeAttribute(node, 'y'))).toBeFalsy();
+    });
+  } catch (error) {
+    console.error('A node position may not be NaN');
+  }
+}
diff --git a/libs/shared/graph-layout/src/lib/layout.ts b/libs/shared/graph-layout/src/lib/layout.ts
index caa834f545a7e013965f979ce71839498f4c6b4a..f58a7c8ae01116689e9780f2defdb848a76bf414 100644
--- a/libs/shared/graph-layout/src/lib/layout.ts
+++ b/libs/shared/graph-layout/src/lib/layout.ts
@@ -10,7 +10,7 @@ export abstract class Layout<provider extends Providers> {
     public provider: provider,
     public algorithm: LayoutAlgorithm<provider>
   ) {
-    console.log(
+    console.info(
       `Created the following Layout: ${provider} - ${this.algorithm}`
     );
   }
diff --git a/libs/shared/graph-layout/yarn.lock b/libs/shared/graph-layout/yarn.lock
index a648f2038763e7f89799b53b4144232254ac577a..d6417799638911037b94648cfd91ac818d88b357 100644
--- a/libs/shared/graph-layout/yarn.lock
+++ b/libs/shared/graph-layout/yarn.lock
@@ -2,11 +2,56 @@
 # yarn lockfile v1
 
 
+"@mapbox/node-pre-gyp@^1.0.0":
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc"
+  integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==
+  dependencies:
+    detect-libc "^2.0.0"
+    https-proxy-agent "^5.0.0"
+    make-dir "^3.1.0"
+    node-fetch "^2.6.7"
+    nopt "^5.0.0"
+    npmlog "^5.0.1"
+    rimraf "^3.0.2"
+    semver "^7.3.5"
+    tar "^6.1.11"
+
 "@yomguithereal/helpers@^1.1.1":
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/@yomguithereal/helpers/-/helpers-1.1.1.tgz#185dfb0f88ca2beec53d0adf6eed15c33b1c549d"
   integrity sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg==
 
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+agent-base@6:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+  integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+  dependencies:
+    debug "4"
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+"aproba@^1.0.3 || ^2.0.0":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+  integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
+are-we-there-yet@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
+  integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^3.6.0"
+
 avsdf-base@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/avsdf-base/-/avsdf-base-1.0.0.tgz#80c437d7d15d2bd201d9c31804e7b7a15a84781a"
@@ -14,6 +59,53 @@ avsdf-base@^1.0.0:
   dependencies:
     layout-base "^1.0.0"
 
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+canvas@^2.9.1:
+  version "2.9.1"
+  resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.9.1.tgz#58ec841cba36cef0675bc7a74ebd1561f0b476b0"
+  integrity sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==
+  dependencies:
+    "@mapbox/node-pre-gyp" "^1.0.0"
+    nan "^2.15.0"
+    simple-get "^3.0.3"
+
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+color-name@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-support@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+  integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+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=
+
 cose-base@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a"
@@ -28,6 +120,11 @@ cose-base@^2.0.0:
   dependencies:
     layout-base "^2.0.0"
 
+cssfontparser@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3"
+  integrity sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=
+
 cytoscape-cise@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/cytoscape-cise/-/cytoscape-cise-1.0.0.tgz#29ac061c74e036441c0b5687e7ebc25e919d507c"
@@ -90,16 +187,84 @@ dagre@^0.8.5:
     graphlib "^2.1.8"
     lodash "^4.17.15"
 
+debug@4:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  dependencies:
+    ms "2.1.2"
+
+decompress-response@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
+  integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
+  dependencies:
+    mimic-response "^2.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=
+
+detect-libc@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
+  integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
+
 elkjs@^0.7.0:
   version "0.7.1"
   resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.7.1.tgz#4751c5e918a4988139baf7f214e010aea22de969"
   integrity sha512-lD86RWdh480/UuRoHhRcnv2IMkIcK6yMDEuT8TPBIbO3db4HfnVF+1lgYdQi99Ck0yb+lg5Eb46JCHI5uOsmAw==
 
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
 events@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
   integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
 
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+gauge@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
+  integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
+  dependencies:
+    aproba "^1.0.3 || ^2.0.0"
+    color-support "^1.1.2"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.1"
+    object-assign "^4.1.1"
+    signal-exit "^3.0.0"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
+    wide-align "^1.1.2"
+
+glob@^7.1.3:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+  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"
+
 graphlib@^2.1.8:
   version "2.1.8"
   resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
@@ -177,11 +342,50 @@ graphology@^0.24.1:
     events "^3.3.0"
     obliterator "^2.0.2"
 
+has-unicode@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+  integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
 heap@^0.2.6:
   version "0.2.7"
   resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc"
   integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==
 
+https-proxy-agent@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+  integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, 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==
+
+is-fullwidth-code-point@^3.0.0:
+  version "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==
+
+jest-canvas-mock@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz#947b71442d7719f8e055decaecdb334809465341"
+  integrity sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==
+  dependencies:
+    cssfontparser "^1.2.1"
+    moo-color "^1.0.2"
+
 klayjs@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/klayjs/-/klayjs-0.4.1.tgz#5bf9fadc7a3e44b94082bba501e7d803076dcfc2"
@@ -222,6 +426,52 @@ lodash@^4.17.15:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+make-dir@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
+mimic-response@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
+  integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
+
+minimatch@^3.0.4:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minipass@^3.0.0:
+  version "3.1.6"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+  integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
+  dependencies:
+    yallist "^4.0.0"
+
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mkdirp@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
 mnemonist@^0.39.0:
   version "0.39.0"
   resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.0.tgz#4c83dd22e8d9d05dfb721ff66a905fec4c460041"
@@ -229,17 +479,207 @@ mnemonist@^0.39.0:
   dependencies:
     obliterator "^2.0.1"
 
+moo-color@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.3.tgz#d56435f8359c8284d83ac58016df7427febece74"
+  integrity sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==
+  dependencies:
+    color-name "^1.1.4"
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nan@^2.15.0:
+  version "2.15.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
+  integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
+
+node-fetch@^2.6.7:
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+  integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+  dependencies:
+    whatwg-url "^5.0.0"
+
+nopt@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+  integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+  dependencies:
+    abbrev "1"
+
+npmlog@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
+  integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+  dependencies:
+    are-we-there-yet "^2.0.0"
+    console-control-strings "^1.1.0"
+    gauge "^3.0.0"
+    set-blocking "^2.0.0"
+
+object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
 obliterator@^2.0.1, obliterator@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.2.tgz#25f50dc92e1181371b9d8209d11890f1a3c2fc21"
   integrity sha512-g0TrA7SbUggROhDPK8cEu/qpItwH2LSKcNl4tlfBNT54XY+nOsqrs0Q68h1V9b3HOSpIWv15jb1lax2hAggdIg==
 
+once@^1.3.0, once@^1.3.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+  dependencies:
+    wrappy "1"
+
 pandemonium@^1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/pandemonium/-/pandemonium-1.5.0.tgz#93f35af555de1420022b341e730215c51c725be3"
   integrity sha512-9PU9fy93rJhZHLMjX+4M1RwZPEYl6g7DdWKGmGNhkgBZR5+tOBVExNZc00kzdEGMxbaAvWdQy9MqGAScGwYlcA==
 
+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=
+
+readable-stream@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+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==
+
+semver@^6.0.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.5:
+  version "7.3.7"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+  integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+  dependencies:
+    lru-cache "^6.0.0"
+
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+signal-exit@^3.0.0:
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+  integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+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==
+
+simple-get@^3.0.3:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
+  integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
+  dependencies:
+    decompress-response "^4.2.0"
+    once "^1.3.1"
+    simple-concat "^1.0.0"
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+tar@^6.1.11:
+  version "6.1.11"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
+  integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+  integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+util-deprecate@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
 web-worker@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da"
   integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==
+
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+  integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+whatwg-url@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+  integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
+wide-align@^1.1.2:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+  integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+  dependencies:
+    string-width "^1.0.2 || 2 || 3 || 4"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==