Repository: martinjm97/ENNUI Branch: master Commit: 49beaee37579 Files: 45 Total size: 463.4 KB Directory structure: gitextract_rmz9kxio/ ├── .gitignore ├── LICENSE.txt ├── README.md ├── build_prod.sh ├── index.html ├── npm-shrinkwrap.json ├── package.json ├── robots.txt ├── src/ │ ├── model/ │ │ ├── build_network.ts │ │ ├── code_generation.ts │ │ ├── data.ts │ │ ├── export_model.ts │ │ ├── graphs.ts │ │ ├── julia_skeleton.ts │ │ ├── mnist_model.ts │ │ ├── params_object.ts │ │ ├── python_skeleton.ts │ │ └── save_state_url.ts │ └── ui/ │ ├── app.ts │ ├── error.ts │ ├── model_templates.ts │ ├── shapes/ │ │ ├── activation.ts │ │ ├── activationlayer.ts │ │ ├── draggable.ts │ │ ├── layer.ts │ │ ├── layers/ │ │ │ ├── add.ts │ │ │ ├── batchnorm.ts │ │ │ ├── concatenate.ts │ │ │ ├── convolutional.ts │ │ │ ├── dense.ts │ │ │ ├── dropout.ts │ │ │ ├── flatten.ts │ │ │ ├── input.ts │ │ │ ├── maxpooling.ts │ │ │ └── output.ts │ │ ├── shape.ts │ │ ├── textbox.ts │ │ ├── wire.ts │ │ └── wireguide.ts │ ├── style.scss │ ├── utils.ts │ └── window.ts ├── tsconfig.json ├── tslint.json └── webpack.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ __pycache__ *.pyc src/ui/style.css built/* node_modules/ *.log dist/* src/model/test.py prod/* .vscode/ ================================================ FILE: LICENSE.txt ================================================ Copyright 2020 Jesse Michel, Stefan Grosser, Zachary Holbrook, and Rikhav Shah Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # ENNUI ENNUI is an Elegant Neural Network User Interface that allows users to: - Build neural network architectures with a drag and drop interface. - Train those networks on the browser. - Visualize the training process. - Export to Python. Thanks to Gil Strang, it's hosted at [https://math.mit.edu/ENNUI/](https://math.mit.edu/ENNUI/) # Installation After cloning the repo, to install dependencies, run: `npm install` To Build the app, run: `npm run build` For Continuous Build and Integration, run: `npm run watch` To use chrome with localhost and the CIFAR-10 Dataset, make sure to close all chrome windows and run the following command to launch chrome: 'path/to/chrome.exe --allow-file-access-from-files' # Code Structure ENNUI is frontend-only. The implementation is structed in two parts: - `ENNUI/src/ui` is home to the traditional frontend components such as the styling, the button logic, and the draggable components (e.g. the layers and activations). - `ENNUI/src/model` is the "backend" implementation supporting core functionality such as building neural networks, doing the code generation, and saving the state in the browser. ================================================ FILE: build_prod.sh ================================================ # Build npm run build # Create the folder if it doesn't exist folder="prod" if [ ! -d "$folder" ]; then mkdir $folder fi # Copy index.html cp ./index.html $folder # Fix the paths to style.css and bundle.js sed -i 's/src\/ui\///' $folder/index.html sed -i 's/dist\///' $folder/index.html # Copy style.css uglifycss ./src/ui/style.css > $folder/style.css # Copy favicon cp ./favicon.ico $folder # Uglify and copy bundle.js uglifyjs --compress --mangle --wrap -- dist/bundle.js > $folder/bundle.js cp -R ./dist/ $folder/ ================================================ FILE: index.html ================================================ ENNUI ~ Elegant Neural Network User Interface ~

ENNUI ~ Elegant Neural Network User Interface ~

ENNUI helps people learn about deep learning by building, training, and visualizing deep neural networks on the browser. It has an easy to use drag-and-drop interface. When you're ready to start coding you can export the network to produce code in Python or Julia!

About ENNUI

ENNUI provides several tools for all stages of deep learning development. The canvas gives space to design neural network architectures with a drag-and-drop interface. This design is easily sharable with friends and coworkers by exporting to a link.
Not only can you design neural networks, you can train them on several datasets: MNIST, CIFAR-10, and more! During training, you can track your network loss and accuracies in the Progress tab, as well as view of confusion matrix.
Once training is complete, ENNUI provides a suite of neural network visualization tools to better understand your architecture.
ENNUI is constantly updated with new features, so be sure to keep following!

Welcome to ENNUI
~ an elegant neural network user interface ~
Start Building

Explore Deep Learning

Developed by (ennui-devs@mit.edu)
Jesse Michel, Zack Holbrook, Stefan Grosser, Rikhav Shah
with advising from Hendrik Strobelt and Gilbert Strang.
First prototyped at HackMIT. Open-sourced on GitHub.
Train
Model Status
Training:
No
Accuracy:
N/A
Loss:
N/A
Validation Acc:
N/A
Validation Loss:
N/A
Share
Export to Python
Export to Julia
Copy model link
Parameters
Click on a layer to view and change its parameters.
================================================ FILE: npm-shrinkwrap.json ================================================ { "name": "ennui", "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { "@babel/highlight": "^7.8.3" } }, "@babel/highlight": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" }, "@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" }, "@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "requires": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" }, "@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" }, "@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" }, "@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" }, "@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@tensorflow/tfjs": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.5.1.tgz", "integrity": "sha512-WiE+JQ3ibr5LibGiBz6HWUqLJW8HiX6ywUSCA7ehZ67vFsw4mPuVjv0WEEUfD/l47PkXYVAmWd+RYOJiuZC7Eg==", "requires": { "@tensorflow/tfjs-converter": "1.5.1", "@tensorflow/tfjs-core": "1.5.1", "@tensorflow/tfjs-data": "1.5.1", "@tensorflow/tfjs-layers": "1.5.1" } }, "@tensorflow/tfjs-converter": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.5.1.tgz", "integrity": "sha512-M9tl2/ep8ntcZpmncHwKuvThsS7TaUWqJ9vJSgJmkazwTfAvlAJmZ8/p1miJ+m5sH1EJO4oTjiEmch6g8IA5IQ==" }, "@tensorflow/tfjs-core": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.5.1.tgz", "integrity": "sha512-N4fsi8mLsRwRs8UJN2cARB1rYFxyVXkLyZ4wOusiR976BwwZbCwQrTTSIPzPqYT3rwiexEUzm7sM6ZaDl5dpXA==", "requires": { "@types/offscreencanvas": "~2019.3.0", "@types/seedrandom": "2.4.27", "@types/webgl-ext": "0.0.30", "@types/webgl2": "0.0.4", "node-fetch": "~2.1.2", "seedrandom": "2.4.3" } }, "@tensorflow/tfjs-data": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.5.1.tgz", "integrity": "sha512-eu4X0tHS1Tng+cvMO9gkMhUWX/UZQ//VpiaZfQJfa3zvUgxw6s1MHJFb0JC1T1FOnEgDVriZ8G758ysJZOybog==", "requires": { "@types/node-fetch": "^2.1.2", "node-fetch": "~2.1.2" } }, "@tensorflow/tfjs-layers": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.5.1.tgz", "integrity": "sha512-DyuhifqflK+bdpBRLAj3RuWm1eTVe8yNX2+WH+W+wmhpjGg7Yagnar6/66JdS2h3WUFoiplCpZRAVMVw631E5g==" }, "@tensorflow/tfjs-vis": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-vis/-/tfjs-vis-0.4.2.tgz", "integrity": "sha512-WMe6Xr3WIeKm4lme2Hz4IRwPnObTOD/eyBUc5vTS2DIXGqK2N9KjzundW3DS2UOFXDicN85bEyHqq6xBaLsNyg==", "requires": { "d3-format": "^1.3.0", "d3-selection": "^1.3.0", "glamor": "^2.20.40", "glamor-tachyons": "^1.0.0-alpha.1", "preact": "^8.2.9", "vega-embed": "3.28.0", "vega-lib": "4.4.0", "vega-lite": "3.0.0-rc10" }, "dependencies": { "vega-lite": { "version": "3.0.0-rc10", "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-3.0.0-rc10.tgz", "integrity": "sha512-xgoOXmVdd2j89D6i44JHjozUy7Z4Mw9bcqFySzm77JDUV0BWLrnM61QmaS8ZwAZQbMcmdCTCJ//HgClH2gFZoQ==", "requires": { "fast-deep-equal": "^2.0.1", "json-stable-stringify": "^1.0.1", "json-stringify-pretty-compact": "^1.2.0", "tslib": "^1.9.3", "vega-event-selector": "^2.0.0", "vega-typings": "0.3.51", "vega-util": "^1.7.0", "yargs": "^12.0.5" } }, "vega-typings": { "version": "0.3.51", "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.3.51.tgz", "integrity": "sha512-8UJnlGIZLDYzlLgMJVHO8Yb8yU7pYeNGnW8J7nxgyXqurowovmPM9fV+V49vzbQnZl4/Qq14wGqm9yM7iqZl8g==", "requires": { "vega-util": "^1.7.0" } } } }, "@types/clone": { "version": "0.1.30", "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz", "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=" }, "@types/d3": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.7.2.tgz", "integrity": "sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw==", "requires": { "@types/d3-array": "^1", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-collection": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-voronoi": "*", "@types/d3-zoom": "*" } }, "@types/d3-array": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz", "integrity": "sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==" }, "@types/d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz", "integrity": "sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==", "requires": { "@types/d3-selection": "*" } }, "@types/d3-brush": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.10.tgz", "integrity": "sha512-J8jREATIrfJaAfhJivqaEKPnJsRlwwrOPje+ABqZFgamADjll+q9zaDXnYyjiGPPsiJEU+Qq9jQi5rECxIOfhg==", "requires": { "@types/d3-selection": "*" } }, "@types/d3-chord": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz", "integrity": "sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==" }, "@types/d3-collection": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz", "integrity": "sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==" }, "@types/d3-color": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz", "integrity": "sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw==" }, "@types/d3-contour": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.0.tgz", "integrity": "sha1-GkCLEh+l40H3FeMFUwPvMHn8frA=", "requires": { "@types/d3-array": "*", "@types/geojson": "*" } }, "@types/d3-dispatch": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz", "integrity": "sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==" }, "@types/d3-drag": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz", "integrity": "sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==", "requires": { "@types/d3-selection": "*" } }, "@types/d3-dsv": { "version": "1.0.36", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz", "integrity": "sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==" }, "@types/d3-ease": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.9.tgz", "integrity": "sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==" }, "@types/d3-fetch": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.1.5.tgz", "integrity": "sha512-o9c0ItT5/Gl3wbNuVpzRnYX1t3RghzeWAjHUVLuyZJudiTxC4f/fC0ZPFWLQ2lVY8pAMmxpV8TJ6ETYCgPeI3A==", "requires": { "@types/d3-dsv": "*" } }, "@types/d3-force": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==" }, "@types/d3-format": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz", "integrity": "sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==" }, "@types/d3-geo": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz", "integrity": "sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==", "requires": { "@types/geojson": "*" } }, "@types/d3-hierarchy": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz", "integrity": "sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==" }, "@types/d3-interpolate": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz", "integrity": "sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==", "requires": { "@types/d3-color": "*" } }, "@types/d3-path": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz", "integrity": "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==" }, "@types/d3-polygon": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz", "integrity": "sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==" }, "@types/d3-quadtree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz", "integrity": "sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==" }, "@types/d3-random": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz", "integrity": "sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==" }, "@types/d3-scale": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.1.1.tgz", "integrity": "sha512-kNTkbZQ+N/Ip8oX9PByXfDLoCSaZYm+VUOasbmsa6KD850/ziMdYepg/8kLg2plHzoLANdMqPoYQbvExevLUHg==", "requires": { "@types/d3-time": "*" } }, "@types/d3-scale-chromatic": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.3.1.tgz", "integrity": "sha512-Ny3rLbV5tnmqgW7w/poCcef4kXP8mHPo/p8EjTS5d9OUk8MlqAeRaM8eF7Vyv7QMLiIXNE94Pa1cMLSPkXQBoQ==" }, "@types/d3-selection": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz", "integrity": "sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==" }, "@types/d3-shape": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz", "integrity": "sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==", "requires": { "@types/d3-path": "*" } }, "@types/d3-time": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz", "integrity": "sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==" }, "@types/d3-time-format": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==" }, "@types/d3-timer": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz", "integrity": "sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==" }, "@types/d3-transition": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.5.tgz", "integrity": "sha512-4IexeQEmEk2u5/ZxqHPCiKxX+sn7uPsg+wb6zL3KLqj8jFlhcueAo3a5Tj1Z74VBeeeQjirdSFNtR87Gox/iwA==", "requires": { "@types/d3-selection": "*" } }, "@types/d3-voronoi": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz", "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==" }, "@types/d3-zoom": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz", "integrity": "sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==", "requires": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "@types/fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==" }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==" }, "@types/geojson": { "version": "7946.0.7", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" }, "@types/long": { "version": "3.0.32", "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" }, "@types/node": { "version": "13.1.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.7.tgz", "integrity": "sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg==" }, "@types/node-fetch": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.4.tgz", "integrity": "sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ==", "requires": { "@types/node": "*" } }, "@types/offscreencanvas": { "version": "2019.3.0", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" }, "@types/seedrandom": { "version": "2.4.27", "resolved": "http://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" }, "@types/webgl-ext": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" }, "@types/webgl2": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz", "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "requires": { "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", "@webassemblyjs/wast-parser": "1.8.5" } }, "@webassemblyjs/floating-point-hex-parser": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" }, "@webassemblyjs/helper-api-error": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" }, "@webassemblyjs/helper-buffer": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" }, "@webassemblyjs/helper-code-frame": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "requires": { "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" }, "@webassemblyjs/helper-module-context": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", "requires": { "@webassemblyjs/ast": "1.8.5", "mamacro": "^0.0.3" } }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", "@webassemblyjs/wasm-gen": "1.8.5" } }, "@webassemblyjs/ieee754": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" }, "@webassemblyjs/wasm-edit": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", "@webassemblyjs/helper-wasm-section": "1.8.5", "@webassemblyjs/wasm-gen": "1.8.5", "@webassemblyjs/wasm-opt": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/wasm-gen": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", "@webassemblyjs/ieee754": "1.8.5", "@webassemblyjs/leb128": "1.8.5", "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wasm-opt": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-buffer": "1.8.5", "@webassemblyjs/wasm-gen": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5" } }, "@webassemblyjs/wasm-parser": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-api-error": "1.8.5", "@webassemblyjs/helper-wasm-bytecode": "1.8.5", "@webassemblyjs/ieee754": "1.8.5", "@webassemblyjs/leb128": "1.8.5", "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wast-parser": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/floating-point-hex-parser": "1.8.5", "@webassemblyjs/helper-api-error": "1.8.5", "@webassemblyjs/helper-code-frame": "1.8.5", "@webassemblyjs/helper-fsm": "1.8.5", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/wast-parser": "1.8.5", "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=" }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "optional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" }, "dependencies": { "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" } } } }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { "inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { "inherits": "2.0.1" } } } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "optional": true }, "async-foreach": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "optional": true, "requires": { "file-uri-to-path": "1.0.0" } }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { "inherits": "~2.0.0" } }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" }, "bowser": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" } }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { "bn.js": "^4.1.1", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "create-hmac": "^1.1.2", "elliptic": "^6.0.0", "inherits": "^2.0.1", "parse-asn1": "^5.0.0" } }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "requires": { "pako": "~1.0.5" } }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "cacache": { "version": "12.0.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" } }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" }, "dependencies": { "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", "dev": true } } }, "canvas": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", "requires": { "nan": "^2.14.0", "node-pre-gyp": "^0.11.0", "simple-get": "^3.0.3" } }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" } }, "chownr": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, "chrome-trace-event": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { "tslib": "^1.9.0" } }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } } } }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" } }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-js": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/common-js/-/common-js-0.3.8.tgz", "integrity": "sha1-9DKJGLS6N2+YGtM6Gx+7ZhQSbss=" }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", "iferr": "^0.1.5", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" } }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", "create-ecdh": "^4.0.0", "create-hash": "^1.1.0", "create-hmac": "^1.1.0", "diffie-hellman": "^5.0.0", "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", "randombytes": "^2.0.0", "randomfill": "^1.0.3" } }, "css-in-js-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", "requires": { "hyphenate-style-name": "^1.0.2", "isobject": "^3.0.1" } }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { "array-find-index": "^1.0.1" } }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d3": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz", "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==", "requires": { "d3-array": "1", "d3-axis": "1", "d3-brush": "1", "d3-chord": "1", "d3-collection": "1", "d3-color": "1", "d3-contour": "1", "d3-dispatch": "1", "d3-drag": "1", "d3-dsv": "1", "d3-ease": "1", "d3-fetch": "1", "d3-force": "1", "d3-format": "1", "d3-geo": "1", "d3-hierarchy": "1", "d3-interpolate": "1", "d3-path": "1", "d3-polygon": "1", "d3-quadtree": "1", "d3-random": "1", "d3-scale": "2", "d3-scale-chromatic": "1", "d3-selection": "1", "d3-shape": "1", "d3-time": "1", "d3-time-format": "2", "d3-timer": "1", "d3-transition": "1", "d3-voronoi": "1", "d3-zoom": "1" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-array": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" }, "d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", "integrity": "sha1-zfILohDPu0N5WvM3Vohvs2ONqsk=" }, "d3-brush": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", "requires": { "d3-dispatch": "1", "d3-drag": "1", "d3-interpolate": "1", "d3-selection": "1", "d3-transition": "1" } }, "d3-chord": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", "integrity": "sha1-MJFX4/LbLHUvAoD+3TXyBnzLsV8=", "requires": { "d3-array": "1", "d3-path": "1" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, "d3-contour": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", "requires": { "d3-array": "^1.1.1" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-dispatch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" }, "d3-drag": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", "requires": { "d3-dispatch": "1", "d3-selection": "1" } }, "d3-dsv": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", "requires": { "commander": "2", "iconv-lite": "0.4", "rw": "1" } }, "d3-ease": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" }, "d3-fetch": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", "integrity": "sha1-lXyPvG1EgFmboZGxslGL+Gs+G+I=", "requires": { "d3-dsv": "1" } }, "d3-force": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", "requires": { "d3-collection": "1", "d3-dispatch": "1", "d3-quadtree": "1", "d3-timer": "1" } }, "d3-format": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" }, "d3-geo": { "version": "1.11.9", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", "requires": { "d3-array": "1" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-geo-projection": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.8.1.tgz", "integrity": "sha512-VObmT3vQQgU7IxkDwyIuOrWK4AS2OHyvucp1vHo98WE7DvAN+VcS3Pf/oKenszPfbMtHusOfQNBLEMyGHguvTg==", "requires": { "commander": "2", "d3-array": "1", "d3-geo": "^1.10.0", "resolve": "^1.1.10" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" }, "d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "requires": { "d3-color": "1" } }, "d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, "d3-polygon": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" }, "d3-quadtree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" }, "d3-random": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", "integrity": "sha1-KDO+fBJDYL+eLT/U8zhHz+bKspE=" }, "d3-scale": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", "d3-format": "1", "d3-interpolate": "1", "d3-time": "1", "d3-time-format": "2" }, "dependencies": { "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" } } }, "d3-scale-chromatic": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", "requires": { "d3-color": "1", "d3-interpolate": "1" } }, "d3-selection": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" }, "d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "requires": { "d3-path": "1" } }, "d3-time": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" }, "d3-time-format": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", "requires": { "d3-time": "1" } }, "d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" }, "d3-transition": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", "requires": { "d3-color": "1", "d3-dispatch": "1", "d3-ease": "1", "d3-interpolate": "1", "d3-selection": "^1.1.0", "d3-timer": "1" } }, "d3-voronoi": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" }, "d3-zoom": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", "requires": { "d3-dispatch": "1", "d3-drag": "1", "d3-interpolate": "1", "d3-selection": "1", "d3-transition": "1" } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "requires": { "mimic-response": "^2.0.0" } }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" }, "dragselect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/dragselect/-/dragselect-1.13.1.tgz", "integrity": "sha512-spfUz6/sNnlY4fF/OxPBwaKLa5hVz6V+fq5XhVuD+h47RAkA75TMkfvr4AoWUh5Ufq3V1oIAbfu+sjc9QbewoA==", "dev": true }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "elliptic": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" } }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", "tapable": "^1.0.0" }, "dependencies": { "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } } } }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "requires": { "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "requires": { "estraverse": "^4.1.0" } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "events": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "^2.0.4" } } } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fbjs": { "version": "0.8.17", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^0.7.18" } }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=" }, "file-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", "requires": { "loader-utils": "^1.0.2", "schema-utils": "^1.0.0" } }, "file-saver": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "optional": true }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "findup-sync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" } }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { "map-cache": "^0.2.2" } }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "requires": { "minipass": "^2.6.0" } }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, "dependencies": { "abbrev": { "version": "1.1.1", "bundled": true, "optional": true }, "ansi-regex": { "version": "2.1.1", "bundled": true, "optional": true }, "aproba": { "version": "1.2.0", "bundled": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", "bundled": true, "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { "version": "1.1.3", "bundled": true, "optional": true }, "code-point-at": { "version": "1.1.0", "bundled": true, "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, "optional": true }, "core-util-is": { "version": "1.0.2", "bundled": true, "optional": true }, "debug": { "version": "3.2.6", "bundled": true, "optional": true, "requires": { "ms": "^2.1.1" } }, "deep-extend": { "version": "0.6.0", "bundled": true, "optional": true }, "delegates": { "version": "1.0.0", "bundled": true, "optional": true }, "detect-libc": { "version": "1.0.3", "bundled": true, "optional": true }, "fs-minipass": { "version": "1.2.7", "bundled": true, "optional": true, "requires": { "minipass": "^2.6.0" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "glob": { "version": "7.1.6", "bundled": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "has-unicode": { "version": "2.0.1", "bundled": true, "optional": true }, "iconv-lite": { "version": "0.4.24", "bundled": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.3", "bundled": true, "optional": true, "requires": { "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "bundled": true, "optional": true }, "ini": { "version": "1.3.5", "bundled": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, "optional": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", "bundled": true, "optional": true }, "minimatch": { "version": "3.0.4", "bundled": true, "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, "optional": true }, "minipass": { "version": "2.9.0", "bundled": true, "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { "version": "1.3.3", "bundled": true, "optional": true, "requires": { "minipass": "^2.9.0" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.1.2", "bundled": true, "optional": true }, "needle": { "version": "2.4.0", "bundled": true, "optional": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { "version": "0.14.0", "bundled": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4.4.2" } }, "nopt": { "version": "4.0.1", "bundled": true, "optional": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, "npm-bundled": { "version": "1.1.1", "bundled": true, "optional": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, "npm-normalize-package-bin": { "version": "1.0.1", "bundled": true, "optional": true }, "npm-packlist": { "version": "1.4.7", "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, "npmlog": { "version": "4.1.2", "bundled": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, "optional": true }, "object-assign": { "version": "4.1.1", "bundled": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, "optional": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", "bundled": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, "optional": true }, "osenv": { "version": "0.1.5", "bundled": true, "optional": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { "version": "1.0.1", "bundled": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", "bundled": true, "optional": true }, "rc": { "version": "1.2.8", "bundled": true, "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "bundled": true, "optional": true } } }, "readable-stream": { "version": "2.3.6", "bundled": true, "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "rimraf": { "version": "2.7.1", "bundled": true, "optional": true, "requires": { "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, "optional": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, "optional": true }, "sax": { "version": "1.2.4", "bundled": true, "optional": true }, "semver": { "version": "5.7.1", "bundled": true, "optional": true }, "set-blocking": { "version": "2.0.0", "bundled": true, "optional": true }, "signal-exit": { "version": "3.0.2", "bundled": true, "optional": true }, "string-width": { "version": "1.0.2", "bundled": true, "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.1.1", "bundled": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "optional": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", "bundled": true, "optional": true }, "tar": { "version": "4.4.13", "bundled": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" } }, "util-deprecate": { "version": "1.0.2", "bundled": true, "optional": true }, "wide-align": { "version": "1.1.3", "bundled": true, "optional": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, "optional": true }, "yallist": { "version": "3.1.1", "bundled": true, "optional": true } } }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" } }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } } } }, "gaze": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { "globule": "^1.0.0" } }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glamor": { "version": "2.20.40", "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==", "requires": { "fbjs": "^0.8.12", "inline-style-prefixer": "^3.0.6", "object-assign": "^4.1.1", "prop-types": "^15.5.10", "through": "^2.3.8" } }, "glamor-tachyons": { "version": "1.0.0-alpha.1", "resolved": "https://registry.npmjs.org/glamor-tachyons/-/glamor-tachyons-1.0.0-alpha.1.tgz", "integrity": "sha512-C51lRkk206gkKUHRQIyNcZHv3Oj00SFFnV1RfI3kKhOQur9eavOABb09ZL2vE3ub8EMM0dOjDOS1Bg88MesAWw==", "requires": { "lodash": "^4.17.4" } }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "optional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "optional": true, "requires": { "is-extglob": "^2.1.0" } } } }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { "global-prefix": "^3.0.0" }, "dependencies": { "global-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } } } }, "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" } }, "globule": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", "minimatch": "~3.0.2" } }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" }, "dependencies": { "ajv": { "version": "6.12.5", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true } } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true } } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { "is-buffer": "^1.1.5" } } } }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "hyphenate-style-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "requires": { "minimatch": "^3.0.4" } }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", "dev": true, "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", "dev": true }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { "repeating": "^2.0.0" } }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inline-style-prefixer": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", "requires": { "bowser": "^1.7.3", "css-in-js-utils": "^2.0.0" } }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { "binary-extensions": "^1.0.0" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "^2.1.1" } }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { "isobject": "^3.0.1" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" }, "dependencies": { "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" } } } }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" } }, "json-stringify-pretty-compact": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.2.0.tgz", "integrity": "sha512-/11Pj1OyX814QMKO7K8l85SHPTr/KsFxHp8GE2zVa0BtJgGimDjXHfM3FhC7keQdWDea7+nXf+f1de7ATZcZkQ==" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "requires": { "invert-kv": "^2.0.0" } }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" }, "dependencies": { "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", "json5": "^1.0.1" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" } }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "requires": { "pify": "^4.0.1", "semver": "^5.6.0" } }, "mamacro": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "requires": { "p-defer": "^1.0.0" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { "object-visit": "^1.0.0" } }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", "loud-rejection": "^1.0.0", "map-obj": "^1.0.1", "minimist": "^1.1.3", "normalize-package-data": "^2.3.4", "object-assign": "^4.0.1", "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" } }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" } }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { "mime-db": "1.44.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==" }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "requires": { "minipass": "^2.9.0" } }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "^2.0.4" } } } }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" } }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", "fs-write-stream-atomic": "^1.0.8", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "needle": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" }, "node-gyp": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" }, "dependencies": { "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { "abbrev": "1" } }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, "tar": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.12", "inherits": "2" } } } }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", "buffer": "^4.3.0", "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", "readable-stream": "^2.3.3", "stream-browserify": "^2.0.1", "stream-http": "^2.7.2", "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "node-pre-gyp": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" } }, "node-sass": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "dev": true, "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", "cross-spawn": "^3.0.0", "gaze": "^1.0.0", "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", "nan": "^2.13.2", "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, "dependencies": { "cross-spawn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" } }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true } } }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true }, "npm-bundled": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "requires": { "npm-normalize-package-bin": "^1.0.1" } }, "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "npm-packlist": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { "isobject": "^3.0.0" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { "isobject": "^3.0.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" } }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { "error-ex": "^1.2.0" } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "optional": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "optional": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { "pinkie": "^2.0.0" } }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", "requires": { "find-up": "^3.0.0" } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "preact": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/preact/-/preact-8.5.3.tgz", "integrity": "sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw==" }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" } }, "protobufjs": { "version": "6.8.8", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.0", "@types/node": "^10.1.0", "long": "^4.0.0" }, "dependencies": { "@types/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" }, "@types/node": { "version": "10.17.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==" } } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" }, "dependencies": { "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } } } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" } }, "react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { "pinkie-promise": "^2.0.0" } } } }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "optional": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { "is-finite": "^1.0.0" } }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", "requires": { "path-parse": "^1.0.6" } }, "resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { "resolve-from": "^3.0.0" } }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" }, "dependencies": { "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } } } }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" } }, "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass-graph": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "dev": true, "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } }, "yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" }, "dependencies": { "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { "amdefine": ">=0.0.4" } } } }, "seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" }, "simple-get": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "requires": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=" }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "source-map-support": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" } } }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", "dev": true }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "requires": { "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", "requires": { "figgy-pudding": "^3.5.1" } }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } } } }, "stdout-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { "readable-stream": "^2.0.1" } }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" } }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { "get-stdin": "^4.0.1" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" } }, "terser": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" } } }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "dependencies": { "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "tfjs-cifar10-web": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tfjs-cifar10-web/-/tfjs-cifar10-web-1.1.1.tgz", "integrity": "sha512-tV1Hd7LpZUC+pz5ladNeYBV8D8d3QoCywJsKiTdfQ8oct0PzDn572RE1BeV2r/PXnmTplJh20/tHX1JPR12U1A==", "requires": { "@tensorflow/tfjs": "^0.12.0", "canvas": "^2.0.0-alpha.12" }, "dependencies": { "@tensorflow/tfjs": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-0.12.7.tgz", "integrity": "sha512-sGqnS7+Zj4SK6ap+fdFDGgddQf7l9RJBkWJc36frwP2F4LmFQQ5ED4+Wq7cBM1LzuyNq0p3pREWBbCfab0pnyw==", "requires": { "@tensorflow/tfjs-converter": "0.5.9", "@tensorflow/tfjs-core": "0.12.17", "@tensorflow/tfjs-layers": "0.7.5" }, "dependencies": { "@tensorflow/tfjs-converter": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-0.5.9.tgz", "integrity": "sha512-48sw17WffIoPYTN2gNZ5HWvjKLtQYXrSy+mqaZtiWaRYVjDzJdla6g7dPAL77MR2rxQAfVYMXg8GRDBmkzyBDw==", "requires": { "@types/long": "~3.0.32", "protobufjs": "~6.8.6" } }, "@tensorflow/tfjs-core": { "version": "0.12.17", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-0.12.17.tgz", "integrity": "sha512-CgFazQpGB21n1LRSxgyMwy0cN6WtuUPBP2W75zk6Rw+gFUXb8ZNh7fhn4nObjgKeIka36TI9MvT1FYrY+z150w==", "requires": { "@types/seedrandom": "~2.4.27", "@types/webgl-ext": "~0.0.29", "@types/webgl2": "~0.0.4", "seedrandom": "~2.4.3" } }, "@tensorflow/tfjs-layers": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-0.7.5.tgz", "integrity": "sha512-JIo4l0yEIfYi+quJG71wAeCP9tgXICg/MIOstowfCVGTHKh8oBVEm39bAI/zyTYYtFVLHeQSvY2KuRCN2h0nBg==" } } } } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "timers-browserify": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "requires": { "setimmediate": "^1.0.4" } }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } } } }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "topojson-client": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", "requires": { "commander": "2" } }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, "true-case-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { "glob": "^7.1.2" } }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "tslint-config-prettier": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", "dev": true }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", "dev": true, "requires": { "tslib": "^1.8.1" } }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { "version": "3.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz", "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==", "dev": true }, "ua-parser-js": { "version": "0.7.21", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" }, "uglifycss": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/uglifycss/-/uglifycss-0.0.29.tgz", "integrity": "sha512-J2SQ2QLjiknNGbNdScaNZsXgmMGI0kYNrXaDlr4obnPW9ni1jljb1NeEVWAiTgZ8z+EBWP2ozfT9vpy03rjlMQ==" }, "uglifyjs": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/uglifyjs/-/uglifyjs-2.4.11.tgz", "integrity": "sha1-NEDWTgRXWViVJEGOtkHGi7kNET4=" }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { "isarray": "1.0.0" } } } }, "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "optional": true }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { "punycode": "^2.1.0" } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "url-loader": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "requires": { "loader-utils": "^1.1.0", "mime": "^2.0.3", "schema-utils": "^1.0.0" } }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vega-canvas": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz", "integrity": "sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==" }, "vega-crossfilter": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-3.0.1.tgz", "integrity": "sha512-GNCP0k1otJKtE9SnYm1cDBqUfBvWTaxJ3/bdMpWvGNUtAdDBAlrtspDBTpwMu4MLNWbAy1zp9jN0ztCXBZF29Q==", "requires": { "d3-array": "^2.0.2", "vega-dataflow": "^4.1.0", "vega-util": "^1.7.0" } }, "vega-dataflow": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-4.1.0.tgz", "integrity": "sha512-LuXoN3LkYWNYTPeMiOgSlw2TZAWjmN46Q9HmHM8ClhXYAj+pYme3IPdtYn1OmcvWe4rKeiYgNYrtJCgTOvCepg==", "requires": { "vega-loader": "^3.1.0", "vega-util": "^1.7.0" } }, "vega-embed": { "version": "3.28.0", "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-3.28.0.tgz", "integrity": "sha512-qIHNKPk7rwuID8/dHthXPMQrEhA6AjLiiVqD3Ols8Ff80GLOgXggjxwwyAI8DrKhOVNFbQwsTgx5E8cH0X5y6w==", "requires": { "d3-selection": "^1.3.2", "json-stringify-pretty-compact": "^1.2.0", "semver": "^5.6.0", "vega-lib": "^4.4.0", "vega-lite": "^3.0.0-rc10 || ^2.6.0", "vega-schema-url-parser": "^1.1.0", "vega-themes": "^2.2.0", "vega-tooltip": "^0.15.0" } }, "vega-encode": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-3.2.2.tgz", "integrity": "sha512-Hmk+ReH6R1wTnz56gWyk8CnzgAzq11QYkrEzw794MMY2l61EG3sX9veyZ9AdtDufOq9oDa58/kfgk65UD9A+sA==", "requires": { "d3-array": "^2.0.2", "d3-format": "^1.3.2", "d3-interpolate": "^1.3.2", "vega-dataflow": "^4.1.0", "vega-scale": "^2.5.0", "vega-util": "^1.7.0" } }, "vega-event-selector": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.2.tgz", "integrity": "sha512-Uv72vBfM0lrlI2belKHFMZuVnW2uJl2ShqWPwGSXPVe6p+PzgqoPJYC8A/i5N8B54UA4UMDzlbBeo3x7q2W9Yg==" }, "vega-expression": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.3.tgz", "integrity": "sha512-sME1+45BToTGsftb1Q6Ubs2iRYEoXkD2NRGnJuKS9YJ2ITzZwPHF/jy2kHW3iLpuNjj54meaO7HMQ/hUKrciUw==", "requires": { "vega-util": "^1.11.0" } }, "vega-force": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-3.0.0.tgz", "integrity": "sha512-Uar26RDxDQEpIdWBIFKnOr6/B30RU8/2qBtoiux1C3goZIWBRkXNlCR5kMDkll8Mg60deD6ynflsXXNwyGS69w==", "requires": { "d3-force": "^1.1.0", "vega-dataflow": "^4.0.0", "vega-util": "^1.7.0" } }, "vega-geo": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-3.1.1.tgz", "integrity": "sha512-EltBQmid6DZ7d4iArgTnsGRsx4ZaHrwvaegq6iIwWp7GHtJ8i+8bzPFfHo1pBuRVmHG4ZA2NH+cNaW2IIgWcPg==", "requires": { "d3-array": "^2.0.2", "d3-contour": "^1.3.2", "d3-geo": "^1.11.3", "vega-dataflow": "^4.1.0", "vega-projection": "^1.2.0", "vega-util": "^1.7.0" } }, "vega-hierarchy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-3.1.0.tgz", "integrity": "sha512-zPxOsQbswVDMfn9JdDG0ihZA4qhQL5WJxBsSRFsMeuyDTFuE6biBInpm/g0QDGmHMF2EOY4AwD2WRyF+jAyTqw==", "requires": { "d3-collection": "^1.0.7", "d3-hierarchy": "^1.1.8", "vega-dataflow": "^4.0.4", "vega-util": "^1.7.0" } }, "vega-lib": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/vega-lib/-/vega-lib-4.4.0.tgz", "integrity": "sha512-bfOsO5wks+ctnJ94fIPWH/B0qocdFs4WZ8teIgjF7m5XE+EVln+1nq9Z+sV7wdw7vftzGg0GAx9UH/kJxyopKg==", "requires": { "vega-crossfilter": "^3.0.1", "vega-dataflow": "^4.1.0", "vega-encode": "^3.2.2", "vega-event-selector": "^2.0.0", "vega-expression": "^2.4.0", "vega-force": "^3.0.0", "vega-geo": "^3.1.1", "vega-hierarchy": "^3.1.0", "vega-loader": "^3.1.0", "vega-parser": "^3.9.0", "vega-projection": "^1.2.0", "vega-runtime": "^3.2.0", "vega-scale": "^2.5.1", "vega-scenegraph": "^3.2.3", "vega-statistics": "^1.2.3", "vega-transforms": "^2.3.1", "vega-typings": "*", "vega-util": "^1.7.0", "vega-view": "^3.4.1", "vega-view-transforms": "^2.0.3", "vega-voronoi": "^3.0.0", "vega-wordcloud": "^3.0.0" } }, "vega-lite": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-3.4.0.tgz", "integrity": "sha512-RJg9uBNh5g0hA8xTzAcALUfNx0cEq7E7xx+vxPEGSMgI8z+A5KlE9u4jUx6nKu7Mjg1qZO8WOyWCmBS1kdFWPg==", "requires": { "@types/clone": "~0.1.30", "@types/fast-json-stable-stringify": "^2.0.0", "clone": "~2.1.2", "fast-deep-equal": "~2.0.1", "fast-json-stable-stringify": "~2.0.0", "json-stringify-pretty-compact": "~2.0.0", "tslib": "~1.10.0", "vega-event-selector": "~2.0.0", "vega-expression": "~2.6.0", "vega-typings": "0.7.2", "vega-util": "~1.10.0", "yargs": "~13.3.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "json-stringify-pretty-compact": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } }, "vega-typings": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.7.2.tgz", "integrity": "sha512-BReB2qRERA/Ke+QoxKDQ7fES25A9Q3qKRm1CJxwvpLGhAl4k5cGDORx6yW+J3rFHMzpJlmdRM+kb489EuphxZQ==", "requires": { "vega-util": "^1.10.0" } }, "vega-util": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.10.0.tgz", "integrity": "sha512-fTGnTG7FhtTG9tiYDL3k5s8YHqB71Ml5+aC9B7eaBygeB8GKXBrcbTXLOzoCRxT3Jr5cRhr99PMBu0AkqmhBog==" }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } }, "yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "vega-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-3.1.0.tgz", "integrity": "sha512-FD9KJdPxBOa+fTnjC2dfY5+kB05hXyVOfjIkssmgyyhELJPp2FwclcF4mVy7Ay1E8fUHY3GgbwSE5jL8k4pYUg==", "requires": { "d3-dsv": "^1.0.10", "d3-time-format": "^2.1.3", "node-fetch": "^2.3.0", "topojson-client": "^3.0.0", "vega-util": "^1.7.0" }, "dependencies": { "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" } } }, "vega-parser": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-3.9.0.tgz", "integrity": "sha512-/fdPt5wcZgbPi0zwzJsBgi/k2GO3s53j7kJUYFGff75+wLJ2n/XtLCU295Wo7+cGCfkCZs0FfYKWa8AJrQZiag==", "requires": { "d3-array": "^2.0.2", "d3-color": "^1.2.3", "d3-format": "^1.3.2", "d3-geo": "^1.11.3", "d3-time-format": "^2.1.3", "vega-dataflow": "^4.1.0", "vega-event-selector": "^2.0.0", "vega-expression": "^2.4.0", "vega-scale": "^2.5.1", "vega-scenegraph": "^3.2.3", "vega-statistics": "^1.2.3", "vega-util": "^1.7.0" } }, "vega-projection": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.4.0.tgz", "integrity": "sha512-Prb/E41PqZT5b+46rHv6BZLDsXMe+NFClHxJ9NbwW7mntz8aMGAHiYolVa/M2KuTLbsXVgDAPxk/aA9tbQ0SSg==", "requires": { "d3-geo": "^1.11.9", "d3-geo-projection": "^2.7.1" } }, "vega-runtime": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-3.2.0.tgz", "integrity": "sha512-aoWqH+U5tiByj3cIGZsTDPMTb10tUN2nm4zWa3Z7lOUilbw/+gEaOuy1qvr4VrVhUShsnytudED4OpQNUkKy3Q==", "requires": { "vega-dataflow": "^4.1.0", "vega-util": "^1.7.0" } }, "vega-scale": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-2.5.1.tgz", "integrity": "sha512-EOpUDOjTAD7DhXglyOquXTzXFXjnNvrGyMDCOsfRL/XUTsbjYYNkdl0Q30c9fVN1I+H65lMz52xwN16yxwMuTw==", "requires": { "d3-array": "^2.0.2", "d3-interpolate": "^1.3.2", "d3-scale": "^2.1.2", "d3-scale-chromatic": "^1.3.3", "d3-time": "^1.0.10", "vega-util": "^1.7.0" } }, "vega-scenegraph": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-3.2.3.tgz", "integrity": "sha512-L4mZ6LpEKvW5Q0c8gyqozGuoY5miJI4DiRipiAG0BQ6rB67tK+8qlaTfslX4tNBz88mu+CyVO9ZjNW/M4nBI3w==", "requires": { "d3-path": "^1.0.7", "d3-shape": "^1.2.2", "vega-canvas": "^1.1.0", "vega-loader": "^3.0.1", "vega-util": "^1.7.0" } }, "vega-schema-url-parser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==" }, "vega-statistics": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.2.tgz", "integrity": "sha512-G6rvZ50MqnmiN1fGqDnFoCLWFwBCYt3nCucXu3zWov7A1/lsatvbDKYeSlVlnvT9OHtv4L+3pRpepFh5IhXKFg==", "requires": { "d3-array": "^2.4.0" } }, "vega-themes": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.6.0.tgz", "integrity": "sha512-TO9xs+xJcHD4YEQSd3G/SiLAxJyXltsgQM2scK7ZLJrPZ8bhkEdqBJWOhIQlxH7OOrUBf/RCtyUDynDTTP5WEw==" }, "vega-tooltip": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.15.0.tgz", "integrity": "sha512-xfac+5I7YR1ZKfip2i9xlEHuNrl5YpQnZAmTc9dzQcnkoo5MmGVIhH01tEGOr8keVC9UbYU1AREezwv8Mpajhw==", "requires": { "vega-util": "^1.7.1" } }, "vega-transforms": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-2.3.1.tgz", "integrity": "sha512-jvDz33ohZiP6cN74quEvesHr0sbSMMQ69ZZqgL6cRDHBqfiuHPhZofBKWDXE1nEWDmJqTEyvg0gsnA8vpHzpjQ==", "requires": { "d3-array": "^2.0.2", "vega-dataflow": "^4.1.0", "vega-statistics": "^1.2.3", "vega-util": "^1.7.0" } }, "vega-typings": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.12.0.tgz", "integrity": "sha512-K+IoUTTtXW3E1Qhr/y+JgLRxy476viAm6DeM8IiVrA8vvuLA3FTzHaeI7TCnaWEwk9xxLJBtdVKKC5FGbp0Nyw==", "requires": { "vega-util": "^1.12.1" } }, "vega-util": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.12.2.tgz", "integrity": "sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw==" }, "vega-view": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-3.4.1.tgz", "integrity": "sha512-hT9Bj9qRCGz+4umid8tFuADyUF7xOHTQmeu18XtRgEkNOtTALlDYLmCSpcGkP1N6eeZm3aRWBtkUz/XE7/6d+Q==", "requires": { "d3-array": "^2.0.2", "d3-timer": "^1.0.9", "vega-dataflow": "^4.1.0", "vega-parser": "^3.9.0", "vega-runtime": "^3.2.0", "vega-scenegraph": "^3.2.3", "vega-util": "^1.7.0" } }, "vega-view-transforms": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-2.0.3.tgz", "integrity": "sha512-m42sP2G72KIIEhbno5P3wYXuGe4C5fj0ztfg1TrSEmGsIHOqoehRvte/1e9q/dV+1rB3TqfcWXgQVEDHCFLEvQ==", "requires": { "vega-dataflow": "^4.0.4", "vega-scenegraph": "^3.2.3", "vega-util": "^1.7.0" } }, "vega-voronoi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-3.0.0.tgz", "integrity": "sha512-ZkQw4UprxqiS3IjrdLOoQq1oEeH0REqWonf7Wz5zt2pKDHyMPlFX89EueoDYOKnfQjk9/7IiptBDK1ruAbDNiQ==", "requires": { "d3-voronoi": "^1.1.2", "vega-dataflow": "^4.0.0", "vega-util": "^1.7.0" } }, "vega-wordcloud": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-3.0.0.tgz", "integrity": "sha512-/2F09L2tNTQ8aqK/ZLjd7m+fYwJR8/waE8YWuexLZob4+4BEByzqFfRMATE39ZpdTHOreCEQ5uUKyvv0qA6O0A==", "requires": { "vega-canvas": "^1.0.1", "vega-dataflow": "^4.0.0", "vega-scale": "^2.1.1", "vega-statistics": "^1.2.1", "vega-util": "^1.7.0" } }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "watchpack": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.0" }, "dependencies": { "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "optional": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "optional": true }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "optional": true, "requires": { "fill-range": "^7.0.1" } }, "chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.4.0" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "optional": true, "requires": { "to-regex-range": "^5.0.1" } }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "optional": true }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "optional": true, "requires": { "is-glob": "^4.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "optional": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "optional": true }, "readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "optional": true, "requires": { "picomatch": "^2.2.1" } }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "optional": true, "requires": { "is-number": "^7.0.0" } } } }, "watchpack-chokidar2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", "optional": true, "requires": { "chokidar": "^2.1.8" } }, "webpack": { "version": "4.41.5", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", "acorn": "^6.2.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", "mkdirp": "^0.5.1", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" } }, "webpack-cli": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", "dev": true, "requires": { "chalk": "2.4.2", "cross-spawn": "6.0.5", "enhanced-resolve": "4.1.0", "findup-sync": "3.0.0", "global-modules": "2.0.0", "import-local": "2.0.0", "interpret": "1.2.0", "loader-utils": "1.2.3", "supports-color": "6.1.0", "v8-compile-cache": "2.0.3", "yargs": "13.2.4" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", "tapable": "^1.0.0" } }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.0" } }, "yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" } } }, "whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { "string-width": "^1.0.2 || 2" } }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { "errno": "~0.1.7" } }, "wrap-ansi": { "version": "2.1.0", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" } }, "yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } ================================================ FILE: package.json ================================================ { "name": "ennui", "version": "0.1.0", "description": "Neural nework visualizer.", "main": "app.ts", "dependencies": { "@tensorflow/tfjs": "^1.5.1", "@tensorflow/tfjs-vis": "^0.4.0", "@types/d3": "^5.7.2", "@types/file-saver": "^2.0.1", "common-js": "^0.3.8", "d3": "^5.15.0", "file-loader": "^3.0.1", "file-saver": "^2.0.2", "tfjs-cifar10-web": "^1.1.1", "uglifycss": "0.0.29", "uglifyjs": "^2.4.11", "url-loader": "^1.1.2", "webpack": "^4.41.5" }, "devDependencies": { "dragselect": "^1.13.1", "node-sass": "^4.14.1", "prettier": "^1.19.1", "tslint": "^5.20.1", "tslint-config-prettier": "^1.18.0", "typescript": "^3.7.4", "webpack-cli": "^3.3.10" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "scss": "node-sass src/ui -o src/ui", "scss-watch": "node-sass --watch src/ui -o src/ui", "ts-watch": "tsc --skipLibCheck --watch", "webpack-watch": "webpack --watch --mode development", "build": "tsc --skipLibCheck && webpack --mode development && node-sass src/ui -o src/ui", "watch": "tsc --skipLibCheck && webpack --mode development && node-sass src/ui -o src/ui && tsc --skipLibCheck --watch & webpack --watch --mode development & node-sass --watch src/ui -o src/ui" }, "repository": { "type": "git", "url": "https://github.mit.edu/jmmichel/ClientENNUI.git" }, "author": "", "license": "MIT" } ================================================ FILE: robots.txt ================================================ User-agent: * Disallow: ================================================ FILE: src/model/build_network.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { displayError } from "../ui/error"; import { Layer } from "../ui/shapes/layer"; import { Input } from "../ui/shapes/layers/input"; /** * Wrap errors from networkDAG * @param input an input layer that is the root of the computational graph */ export function buildNetworkDAG(input: Input): tf.LayersModel { const toposorted = topologicalSort(input); return networkDAG(toposorted); } /** * Wrap model generation and produce a summary. * @param toposorted topologically sorted list of layers */ function networkDAG(toposorted: Layer[]): tf.LayersModel { const model = generateTfjsModel(toposorted); // tslint:disable-next-line:no-console console.log(model.summary()); return model; } /** * Clone a full computational graph * @param input an input layer that is the root of the computational graph * @param newInput the input that will be the root of the cloned graph */ export function cloneNetwork(input: Input, newInput: Input): void { // Initialize queues, dags, and parents (visited) const oldId2Clone: Map = new Map(); oldId2Clone.set(input.uid, newInput); const queue: Layer[] = [input]; const visited: Set = new Set(); let newLayer: Layer; while (queue.length !== 0) { const current = queue.shift(); // Clone layer if (current !== input) { if (!(current.uid in oldId2Clone)) { newLayer = current.clone(); oldId2Clone.set(current.uid, newLayer); } else { newLayer = oldId2Clone.get(current.uid); } // Add in cloned parent/child relations for (const p of current.parents) { if (!(p.uid in oldId2Clone)) { oldId2Clone.set(p.uid, p.clone()); } const newParent = oldId2Clone.get(p.uid); newParent.addChild(newLayer); newLayer.addParent(newParent); } } else { newLayer = newInput; } // Continue BFS for (const child of current.children) { if (!visited.has(child)) { queue.push(child); visited.add(child); } } } } /** * Topologically sort a graph of layers that are rooted at the input. * @param input an input layer that is the root of the computational graph * @param showErrors decide whether or not to surface errors to the UI */ export function topologicalSort(input: Input, showErrors: boolean = true): Layer[] { // Kahn's algorithm const sorted: Layer[] = []; const visited: Set = new Set(); const frontier: Layer[] = [input]; // This is to detect if we have a branch that doesn't start from input const potentialBranch: Set = new Set(); while (frontier.length > 0) { const layer = frontier.pop(); visited.add(layer); sorted.push(layer); if (potentialBranch.has(layer.uid)) { potentialBranch.delete(layer.uid); } for (const child of layer.children) { // Check not a cycle const childIndex = sorted.indexOf(child); if (childIndex >= 0 && childIndex < sorted.indexOf(layer)) { displayError(new Error("Cannot have backwards edges")); } // Check if we've already visited all parents let canAdd = true; for (const parent of child.parents) { canAdd = visited.has(parent); if (!canAdd) { potentialBranch.add(parent.uid); break; } } // All dependencies are added then add child if (canAdd) { frontier.push(child); } } } // Either there are layers with no parents (other than input), there is a cycle, or output is never reached if (sorted[sorted.length - 1].layerType !== "Output" && showErrors) { if (potentialBranch.size > 0) { displayError(new Error("All layers must have input as an ancestor.")); } else { displayError(new Error("Something is wrong with your network architecture.")); } } return sorted; } /** * Creates corresponding tfjs model. * @param sorted topologically sorted list of layers */ export function generateTfjsModel(sorted: Layer[]): tf.LayersModel { sorted.forEach((layer) => layer.generateTfjsLayer()); const input = sorted[0].getTfjsLayer(); const output = sorted[sorted.length - 1].getTfjsLayer(); return tf.model({ inputs: input, outputs: output }); } ================================================ FILE: src/model/code_generation.ts ================================================ import { displayError } from "../ui/error"; import { ActivationLayer } from "../ui/shapes/activationlayer"; import { Layer } from "../ui/shapes/layer"; import { juliaSkeleton } from "./julia_skeleton"; import { pythonSkeleton } from "./python_skeleton"; /** * Creates corresponding Python code. * @param sorted topologically sorted list of layers */ export function generatePython(sorted: Layer[]): string { let pythonScript: string = ""; for (const layer of sorted) { const layerstring = layer.lineOfPython(); let applystring = ""; // Nothing to apply if no parents (input) if (layer.parents.size === 1) { applystring = `(x${layer.parents.values().next().value.uid})`; } else if (layer.parents.size > 1) { applystring = `([${[...layer.parents].map((p) => "x" + p.uid).join(", ")}])`; } pythonScript += `x${layer.uid} = ` + layerstring + applystring + "\n"; // TODO: Move this to BatchNorm and generalize layerstring to an array if (layer.layerType === "BatchNorm" && (layer as ActivationLayer).activation != null) { if (this.activation != null && this.activation.activationType !== "relu") { displayError(new Error("Batch Normalization does not support activations other than ReLu")); } pythonScript += `x${layer.uid} = ` + "ReLU()" + `(x${layer.uid})` + "\n"; } } pythonScript += `model = Model(inputs=x${sorted[0].uid}, outputs=x${sorted[sorted.length - 1].uid})`; return pythonSkeleton(pythonScript); } /** * Creates corresponding Julia code. * @param sorted topologically sorted list of layers */ export function generateJulia(sorted: Layer[]): string { let juliaInitialization: string = ""; let juliaScript: string = ""; for (const layer of sorted) { juliaInitialization += layer.initLineOfJulia(); juliaScript += layer.lineOfJulia(); } return juliaSkeleton(juliaInitialization, juliaScript); } ================================================ FILE: src/model/data.ts ================================================ // Adapted from https://github.com/tensorflow/tfjs-examples/blob/master/mnist/data.js import * as tf from "@tensorflow/tfjs"; import { Rank, Tensor } from "@tensorflow/tfjs"; import { Cifar10 } from "tfjs-cifar10-web"; const NUM_DATASET_ELEMENTS = 65000; export const NUM_TRAIN_ELEMENTS = 55000; // const NUM_TEST_ELEMENTS = NUM_DATASET_ELEMENTS - NUM_TRAIN_ELEMENTS; const MNIST_IMAGES_SPRITE_PATH = "https://storage.googleapis.com/learnjs-data/model-builder/mnist_images.png"; const MNIST_LABELS_PATH = "https://storage.googleapis.com/learnjs-data/model-builder/mnist_labels_uint8"; /** * A class that serves as a schema for loading image data. */ export abstract class ImageData { public readonly IMAGE_HEIGHT: number; public readonly IMAGE_WIDTH: number; public readonly IMAGE_CHANNELS: number; public readonly IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS; public readonly NUM_CLASSES: number; public pythonName: string; public dataLoaded: boolean = false; public readonly classStrings: string[] = null; protected trainImages: Tensor; protected testImages: Tensor; protected trainLabels: Tensor; protected testLabels: Tensor; protected datasetName: string; public abstract async load(): Promise; /** * Get all training data as a data tensor and a labels tensor. * * @returns * xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`. * labels: The one-hot encoded labels tensor, of shape `[numTrainExamples, NUM_CLASSES]`. */ public getTrainData(numExamples: number = 15000): {xs: Tensor, labels: Tensor} { let xs = tf.reshape(this.trainImages, [this.trainImages.size / this.IMAGE_SIZE, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); let labels = tf.reshape(this.trainLabels, [this.trainLabels.size / this.NUM_CLASSES, this.NUM_CLASSES]); if (numExamples != null) { xs = xs.slice([0, 0, 0, 0], [numExamples, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); labels = labels.slice([0, 0], [numExamples, this.NUM_CLASSES]); } return {xs, labels}; } /** * Get all test data as a data tensor a a labels tensor. * * @param {number} numExamples Optional number of examples to get. If not provided, * all test examples will be returned. * @returns * xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`. * labels: The one-hot encoded labels tensor, of shape `[numTestExamples, NUM_CLASSES]`. */ public getTestData(numExamples: number = 1500): {xs: Tensor, labels: Tensor} { let xs = tf.reshape(this.testImages, [this.testImages.size / this.IMAGE_SIZE, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); let labels = tf.reshape(this.testLabels, [this.testLabels.size / this.NUM_CLASSES, this.NUM_CLASSES]); if (numExamples != null) { xs = xs.slice([0, 0, 0, 0], [numExamples, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); labels = labels.slice([0, 0], [numExamples, this.NUM_CLASSES]); } return {xs, labels}; } /** * Returns test examples with the desired label. * * @param {number} numExamples number of examples to get. * @returns xs: The data tensor, of shape `[numTrainExamples, IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_CHANNELS]`. * labels: The one-hot encoded labels tensor, of shape `[numTestExamples, NUM_CLASSES]`. */ public async getTestDataWithLabel(numExamples: number, label: string): Promise<{xs: Tensor, labels: Tensor}> { if (label === "all") { return this.getTestData(numExamples); } let {xs, labels} = this.getTestData(); // select only the numbers with the given label const classLabels = labels.argMax(1).arraySync() as number[]; const mask = tf.equal(classLabels, parseInt(label, 10)); xs = await tf.booleanMaskAsync(xs, mask) as Tensor; labels = await tf.booleanMaskAsync(labels, mask) as Tensor; xs = xs.slice([0, 0, 0, 0], [numExamples, xs.shape[1], xs.shape[2], xs.shape[3]]) as Tensor; labels = labels.slice([0, 0], [numExamples, labels.shape[1]]) as Tensor; return {xs, labels}; } protected toggleLoadingOverlay(): void { if (document.getElementById("loadingDataTab").style.display === "none") { document.getElementById("datasetLoadingName").innerText = this.datasetName; document.getElementById("loadingDataTab").style.display = "block"; } else { document.getElementById("loadingDataTab").style.display = "none"; } } } /** * A class that fetches the sprited CIFAR dataset and provide data as * Tensors. */ export class Cifar10Data extends ImageData { public static get Instance(): ImageData { return this.instance || (this.instance = new this()); } private static instance: Cifar10Data; public IMAGE_HEIGHT: number = 32; public IMAGE_WIDTH: number = 32; public IMAGE_CHANNELS: number = 3; public IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS; public NUM_CLASSES: number = 10; public datasetName: string = "CIFAR-10"; public pythonName: string = "cifar10"; public readonly classStrings: string[] = ["Airplane", "Automobile", "Bird", "Cat", "Deer", "Dog", "Frog", "Horse", "Ship", "Truck"]; public async load(): Promise { if (this.dataLoaded) { return; } this.toggleLoadingOverlay(); const data = new Cifar10(); await data.load(); const {xs: trainX, ys: trainY} = data.nextTrainBatch(15000); const {xs: testX, ys: testY} = data.nextTestBatch(1500); this.trainImages = trainX as unknown as Tensor; this.trainLabels = trainY as unknown as Tensor; this.testImages = testX as unknown as Tensor; this.testLabels = testY as unknown as Tensor; this.dataLoaded = true; document.getElementById("loadingDataTab").style.display = "none"; } } /** * A class that fetches the sprited MNIST dataset and provide data as * Tensors. */ export class MnistData extends ImageData { public static get Instance(): ImageData { return this.instance || (this.instance = new this()); } private static instance: MnistData; public IMAGE_HEIGHT: number = 28; public IMAGE_WIDTH: number = 28; public IMAGE_CHANNELS: number = 1; public IMAGE_SIZE: number = this.IMAGE_HEIGHT * this.IMAGE_WIDTH * this.IMAGE_CHANNELS; public NUM_CLASSES: number = 10; public datasetName: string = "MNIST"; public pythonName: string = "mnist"; public async load(): Promise { // Make a request for the MNIST sprited image. if (this.dataLoaded) { return; } this.toggleLoadingOverlay(); const img = new Image(); const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); const imgRequest = new Promise((resolve, _) => { img.crossOrigin = ""; img.onload = () => { img.width = img.naturalWidth; img.height = img.naturalHeight; const datasetBytesBuffer = new ArrayBuffer(NUM_DATASET_ELEMENTS * this.IMAGE_SIZE * 4); const chunkSize = 5000; canvas.width = img.width; canvas.height = chunkSize; for (let i = 0; i < NUM_DATASET_ELEMENTS / chunkSize; i++) { const datasetBytesView = new Float32Array( datasetBytesBuffer, i * this.IMAGE_SIZE * chunkSize * 4, this.IMAGE_SIZE * chunkSize); ctx.drawImage( img, 0, i * chunkSize, img.width, chunkSize, 0, 0, img.width, chunkSize); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); for (let j = 0; j < imageData.data.length / 4; j++) { // All channels hold an equal value since the image is grayscale, so // just read the red channel. datasetBytesView[j] = imageData.data[j * 4] / 255; } } const dataImages = new Float32Array(datasetBytesBuffer); resolve(dataImages); }; img.src = MNIST_IMAGES_SPRITE_PATH; }); const labelsRequest = fetch(MNIST_LABELS_PATH); const [datasetImages, labelsResponse] = await Promise.all([imgRequest, labelsRequest]); const datasetLabels = new Uint8Array(await labelsResponse.arrayBuffer()); // Slice the the images and labels into train and test sets. const trainImages = datasetImages.slice(0, this.IMAGE_SIZE * NUM_TRAIN_ELEMENTS); this.trainImages = tf.tensor4d(trainImages, [trainImages.length / this.IMAGE_SIZE, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); const testImages = datasetImages.slice(this.IMAGE_SIZE * NUM_TRAIN_ELEMENTS); this.testImages = tf.tensor4d(testImages, [testImages.length / this.IMAGE_SIZE, this.IMAGE_HEIGHT, this.IMAGE_WIDTH, this.IMAGE_CHANNELS]); const trainLabels = datasetLabels.slice(0, this.NUM_CLASSES * NUM_TRAIN_ELEMENTS); this.trainLabels = tf.tensor2d(trainLabels, [trainImages.length / this.IMAGE_SIZE, this.NUM_CLASSES]); const testLabels = datasetLabels.slice(this.NUM_CLASSES * NUM_TRAIN_ELEMENTS); this.testLabels = tf.tensor2d(testLabels, [testImages.length / this.IMAGE_SIZE, this.NUM_CLASSES]); this.dataLoaded = true; document.getElementById("loadingDataTab").style.display = "none"; } } export let dataset: ImageData = MnistData.Instance; export function changeDataset(newDataset: string): void { switch (newDataset) { case "mnist": dataset = MnistData.Instance; break; case "cifar": dataset = Cifar10Data.Instance; break; } // Set the image visualizations divs with class name identifiers Array.from(document.getElementById("classes").getElementsByClassName("option")).forEach((element, i) => { if (i !== 0) { // Skip the first since it represents 'Any' class element.innerHTML = (i - 1) + ( dataset.classStrings != null ? ` (${dataset.classStrings[i]})` : ""); } }); } ================================================ FILE: src/model/export_model.ts ================================================ import { saveAs } from "file-saver"; import { IDraggableData } from "../ui/app"; import { displayError } from "../ui/error"; import { Activation, Relu, Sigmoid, Tanh } from "../ui/shapes/activation"; import { ActivationLayer } from "../ui/shapes/activationlayer"; import { ILayerJson, Layer } from "../ui/shapes/layer"; import { Add } from "../ui/shapes/layers/add"; import { BatchNorm } from "../ui/shapes/layers/batchnorm"; import { Concatenate } from "../ui/shapes/layers/concatenate"; import { Conv2D } from "../ui/shapes/layers/convolutional"; import { Dense } from "../ui/shapes/layers/dense"; import { Dropout } from "../ui/shapes/layers/dropout"; import { Flatten } from "../ui/shapes/layers/flatten"; import { Input } from "../ui/shapes/layers/input"; import { MaxPooling2D } from "../ui/shapes/layers/maxpooling"; import { Output } from "../ui/shapes/layers/output"; import { Point } from "../ui/shapes/shape"; import { IHyperparameterData } from "./params_object"; /** * Schema for serialized networks. */ export interface ISerializedNetwork { graph: ILayerJson[]; hyperparameters: IHyperparameterData; } /** * Check that there is a path from the input to the output. * @param svgData the input nn architecture */ export function hasPathToOutput(svgData: IDraggableData): boolean { const queue: Layer[] = [svgData.input]; const visited: Set = new Set(); const layersFromInput: Set = new Set(); while (queue.length !== 0) { const current = queue.shift(); layersFromInput.add(current); // check each connections of the node for (const child of current.children) { if (!visited.has(child)) { queue.push(child); visited.add(child); } } } return layersFromInput.has(svgData.output); } /** * Convert the nn to a json blob for storage. * @param svgData the input nn architecture */ export function graphToJson(svgData: IDraggableData): ISerializedNetwork { // Initialize queues, dags, and parents (visited) const queue: Layer[] = [svgData.input]; const visited: Set = new Set(); const layersjson: ILayerJson[] = new Array(); while (queue.length !== 0) { const current = queue.shift(); layersjson.push(current.toJson()); // check each connections of the node for (const child of current.children) { if (!visited.has(child)) { queue.push(child); visited.add(child); } } } const serializedNet: ISerializedNetwork = { graph: layersjson, hyperparameters: setHyperparameterData(), }; return serializedNet; } /** * Takes the hyperparemeters from the html and assigns them to the global model. */ function setHyperparameterData(): IHyperparameterData { let learningRate: number; let batchSize: number; let optimizerId: string; let epochs: number; let lossId: string; const hyperparams = document.getElementsByClassName("hyperparamvalue"); for (const hyperparam of hyperparams) { const value = ( document.getElementById(hyperparam.id) as HTMLInputElement).value; switch (hyperparam.id) { case "learningRate": learningRate = Number(value); break; case "epochs": epochs = parseInt(value, 10); break; case "batchSize": batchSize = parseInt(value, 10); break; } } for (const elmt of document.getElementsByClassName("selected")) { if (elmt.hasAttribute("data-trainType")) { optimizerId = elmt.id; } else if (elmt.hasAttribute("data-lossType")) { lossId = elmt.id; } } return {batchSize, epochs, learningRate, lossId, optimizerId}; } /** * Deserialize a `serializedNet` into svgData. * @param svgData an empty structure for `Layer` instances * @param serializedNet a blob of all of the json */ export function stateFromJson(svgData: IDraggableData, serializedNet: ISerializedNetwork): IDraggableData { const hyperparams: IHyperparameterData = serializedNet.hyperparameters; setHyperparams(hyperparams); const layersJson: ILayerJson[] = serializedNet.graph; return graphFromJson(svgData, layersJson); } /** * Set hyperparameters from serialized data. * @param hyperparamData a container for all of the hyperparameter data */ function setHyperparams(hyperparamData: IHyperparameterData): void { const hyperparams = document.getElementsByClassName("hyperparamvalue"); for (const hyperparam of hyperparams) { const paramName = document.getElementById(hyperparam.id as string) as HTMLInputElement; paramName.value = (hyperparamData as any)[hyperparam.id].toString(); } document.getElementById("defaultOptimizer").classList.remove("selected"); document.getElementById(hyperparamData.optimizerId).classList.add("selected"); document.getElementById("defaultLoss").classList.remove("selected"); document.getElementById(hyperparamData.lossId).classList.add("selected"); } /** * Populate `svgData` from a serialize nn architecture in `layersJson`. * @param svgData empty empty structure blob to be filled * @param layersJson a json blob of all of the nn architecture */ function graphFromJson(svgData: IDraggableData, layersJson: ILayerJson[]): IDraggableData { // Make each of the objects without parents and children const uidToObject: Map = new Map(); for (const l of layersJson) { const layer = createLayerInstanceFromName(svgData, l); uidToObject.set(l.id, layer); } // Add in all of the parents, children, and activations for (const l of layersJson) { const layer: Layer = uidToObject.get(l.id); for (const childId of l.children_ids) { layer.addChild(uidToObject.get(childId)); } for (const parentId of l.parent_ids) { layer.addParent(uidToObject.get(parentId)); } layer.setParams(l.params); if (l.params.activation != null) { createActivationInstanceFromName(svgData, layer as ActivationLayer, l.params.activation); } } return svgData; } /** * Make an `Activation` instance from it's name, adding it to svgData, and attaching it to the given layer. * @param svgData the input nn architecture * @param layer layer to attach the activation to * @param activation_name the name of an `Activation` to be created */ function createActivationInstanceFromName(svgData: IDraggableData, layer: ActivationLayer, activationName: string): Activation { let activation: Activation; switch (activationName) { case "relu": activation = new Relu(); break; case "sigmoid": activation = new Sigmoid(); break; case "tanh": activation = new Tanh(); break; default: displayError(new Error(`The specified activation "${activationName}" was not recognized. `)); } layer.addActivation(activation); svgData.draggable.push(activation); return activation; } /** * Make a `Layer` instance from it's name and add it to svgData. * @param svgData the input nn architecture * @param lj a json blob of all of the layers */ function createLayerInstanceFromName(svgData: IDraggableData, lj: ILayerJson): Layer { // Create an instance from the instance name. let layer: Layer; const location = new Point(lj.xPosition, lj.yPosition); switch (lj.layer_name) { case "Input": layer = new Input(); layer.setPosition(location); svgData.input = layer as Input; break; case "Output": layer = new Output(); layer.setPosition(location); svgData.output = layer as Output; break; default: switch (lj.layer_name) { case "MaxPooling2D": layer = new MaxPooling2D(location); break; case "Dense": layer = new Dense(location); break; case "Conv2D": layer = new Conv2D(location); break; case "Concatenate": layer = new Concatenate(location); break; case "Flatten": layer = new Flatten(location); break; case "BatchNorm": layer = new BatchNorm(location); break; case "Dropout": layer = new Dropout(location); break; case "Add": layer = new Add(location); break; default: displayError(new Error(`The specified layer "${lj}" was not recognized. `)); } svgData.draggable.push(layer); break; } return layer; } /** * Download a file given the content and name. * @param content content to add to the file * @param filename name of the file to be created */ export function download(content: string, filename: string): void { const blob = new Blob([content], { type: "text/plain;charset=utf-8", }); saveAs(blob, filename); } ================================================ FILE: src/model/graphs.ts ================================================ import * as tf from "@tensorflow/tfjs"; import * as tfvis from "@tensorflow/tfjs-vis"; import { tabSelected } from "../ui/app"; import { dataset } from "./data"; import { model } from "./params_object"; const GRAPH_FONT_SIZE: number = 14; const NUM_CLASSES: number = 10; const testExamples: number = 50; /** * Show predictions on a number of test examples. */ export async function showPredictions(): Promise { if (tabSelected() === "visualizationTab" && dataset.dataLoaded) { let label: string = null; const options = document.getElementById("classes").getElementsByClassName("option"); for (const option of options) { if (option.classList.contains("selected")) { label = option.getAttribute("data-optionValue"); break; } } dataset.getTestDataWithLabel(testExamples, label).then(({xs, labels}) => { // Code wrapped in a tf.tidy() function callback will have their tensors freed // from GPU memory after execution without having to call dispose(). // The tf.tidy callback runs synchronously. tf.tidy(() => { const output = model.architecture.predict(xs) as tf.Tensor; // tf.argMax() returns the indices of the maximum values in the tensor along // a specific axis. Categorical classification tasks like this one often // represent classes as one-hot vectors. One-hot vectors are 1D vectors with // one element for each output class. All values in the vector are 0 // except for one, which has a value of 1 (e.g. [0, 0, 0, 1, 0]). The // output from model.predict() will be a probability distribution, so we use // argMax to get the index of the vector element that has the highest // probability. This is our prediction. // (e.g. argmax([0.07, 0.1, 0.03, 0.75, 0.05]) == 3) // dataSync() synchronously downloads the tf.tensor values from the GPU so // that we can use them in our normal CPU JavaScript code // (for a non-blocking version of this function, use data()). const axis = 1; const newLabels = Array.from(labels.argMax(axis).dataSync()); const predictions = Array.from(output.argMax(axis).dataSync()); showTestResults({xs, labels}, predictions, newLabels); }); }); } } // TOOD: Remove this peice of problematic global state. let confusionValues: any = []; for (let i = 0; i < NUM_CLASSES; i++) { const arr = new Array(NUM_CLASSES); arr.fill(0, 0, NUM_CLASSES); confusionValues.push(arr); } export function showConfusionMatrix(): void { if (tabSelected() === "progressTab" && dataset.dataLoaded) { const {xs, labels} = dataset.getTestData(1000); tf.tidy(() => { const output = model.architecture.predict(xs) as tf.Tensor; const fixedLabels = labels.argMax(1) as tf.Tensor; const predictions = output.argMax(1) as tf.Tensor; tfvis.metrics.confusionMatrix(fixedLabels, predictions, NUM_CLASSES).then((confusionVals) => { confusionValues = confusionVals; renderConfusionMatrix(); }); }); } } export function setupTestResults(): void { const imagesElement = document.getElementById("images"); imagesElement.innerHTML = ""; for (let i = 0; i < testExamples; i++) { const div = document.createElement("div"); div.className = "pred-container"; const canvas = document.createElement("canvas"); canvas.width = dataset.IMAGE_WIDTH; canvas.height = dataset.IMAGE_HEIGHT; canvas.className = "prediction-canvas"; const ctx = canvas.getContext("2d"); ctx.rect(0, 0, 1000, 5000); ctx.fillStyle = "#888"; ctx.fill(); const pred = document.createElement("div"); pred.className = `pred pred-none`; pred.innerText = `pred: -`; div.appendChild(pred); div.appendChild(canvas); imagesElement.appendChild(div); } } export function showTestResults(batch: {xs: tf.Tensor, labels: tf.Tensor}, predictions: number[], labels: number[]): void { const imagesElement = document.getElementById("images"); imagesElement.innerHTML = ""; for (let i = 0; i < testExamples; i++) { const image = batch.xs.slice([i, 0], [1, batch.xs.shape[1]]); const div = document.createElement("div"); div.className = "pred-container"; const canvas = document.createElement("canvas"); canvas.className = "prediction-canvas"; draw(image.flatten(), canvas); const pred = document.createElement("div"); const prediction = predictions[i]; const label = labels[i]; const correct = prediction === label; pred.className = `pred ${(correct ? "pred-correct" : "pred-incorrect")}`; pred.innerText = `pred: ${prediction}`; div.appendChild(pred); div.appendChild(canvas); imagesElement.appendChild(div); } } // TOOD: Remove this piece of problematic global state. let lossValues: Array> = [[], []]; export function plotLoss(batchNum: number, loss: number, set: string): void { const series = set === "train" ? 0 : 1; // Set the first validation loss as the first training loss if (series === 0 && lossValues[1].length === 0) { lossValues[1].push({x: batchNum, y: loss}); } lossValues[series].push({x: batchNum, y: loss}); if (tabSelected() === "progressTab") { renderLossPlot(); } } export function renderLossPlot(): void { const lossContainer = document.getElementById("loss-canvas"); tfvis.render.linechart( {values: lossValues, series: ["train", "validation"]}, lossContainer, { xLabel: "Batch #", yLabel: "Loss", // tslint:disable-next-line: object-literal-sort-keys width: canvasWidth() / 2, height: canvasHeight() / 2, fontSize: GRAPH_FONT_SIZE, }); } export function resetPlotValues(): void { // set initial accuracy values to 0,0 for validation accuracyValues = [[], [{x: 0, y: 0}]]; lossValues = [[], []]; } let accuracyValues = [[], [{x: 0, y: 0}]]; export function plotAccuracy(epochs: number, accuracy: number, set: string): void { const series = set === "train" ? 0 : 1; accuracyValues[series].push({x: epochs, y: accuracy}); if (tabSelected() === "progressTab") { renderAccuracyPlot(); } } export function renderAccuracyPlot(): void { const accuracyContainer = document.getElementById("accuracy-canvas"); tfvis.render.linechart( {values: accuracyValues, series: ["train", "validation"]}, accuracyContainer, { xLabel: "Batch #", yLabel: "Accuracy", // tslint:disable-next-line: object-literal-sort-keys width: canvasWidth() / 2, height: canvasHeight() / 2, yAxisDomain: [0, 1], fontSize: GRAPH_FONT_SIZE, }); } function renderConfusionMatrix(): void { const confusionMatrixElement = document.getElementById("confusion-matrix-canvas"); tfvis.render.confusionMatrix({ labels: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], values: confusionValues , }, confusionMatrixElement, { fontSize: GRAPH_FONT_SIZE, shadeDiagonal: false, }); } function canvasWidth(): number { const columnGap = parseInt(getComputedStyle(document.getElementById("progressTab")).gridColumnGap, 10); return document.getElementById("middle").clientWidth - columnGap; } function canvasHeight(): number { const verticalPadding = parseInt(getComputedStyle(document.getElementById("progressTab")).padding, 10); const height = document.getElementById("middle").clientHeight - 2 * verticalPadding; return height; } export function setupPlots(): void { renderLossPlot(); renderAccuracyPlot(); renderConfusionMatrix(); } export function draw(image: tf.Tensor, canvas: HTMLCanvasElement): void { const [width, height] = [dataset.IMAGE_HEIGHT, dataset.IMAGE_WIDTH]; canvas.width = width; canvas.height = height; const ctx = canvas.getContext("2d"); const imageData = new ImageData(width, height); const data = image.dataSync(); for (let i = 0; i < height * width; ++i) { const j = i * 4; if (dataset.IMAGE_CHANNELS === 3) { const k = i * 3; imageData.data[j + 0] = data[k + 0] * 255; imageData.data[j + 1] = data[k + 1] * 255; imageData.data[j + 2] = data[k + 2] * 255; imageData.data[j + 3] = 255; } else { imageData.data[j + 0] = data[i] * 255; imageData.data[j + 1] = data[i] * 255; imageData.data[j + 2] = data[i] * 255; imageData.data[j + 3] = 255; } } ctx.putImageData(imageData, 0, 0); } ================================================ FILE: src/model/julia_skeleton.ts ================================================ import { setModelHyperparameters } from "../ui/app"; import { model } from "./params_object"; export function juliaSkeleton(initializationCode: string, modelCode: string): string { setModelHyperparameters(); return `using Flux, Statistics using Flux: onehotbatch, onecold, crossentropy, mse, throttle, @treelike using MLDatasets: MNIST, CIFAR10 using Base.Iterators: repeated, partition using LightGraphs trainX, trainY = MNIST.traindata() unsqueeze3(x) = reshape(x, (size(x, 1), size(x, 2), 1, size(x, 3))) trainX, trainY = unsqueeze3(trainX), onehotbatch(trainY, 0:9) batch_size = ${model.params.batchSize} # Partition into batches train = [(trainX[:,:,:,i], trainY[:,i]) for i in partition(1:50000, batch_size)] train = gpu.(train) # Prepare test set (first 10,000 images) tX, tY = MNIST.testdata() tX = unsqueeze3(tX) |> gpu tY = onehotbatch(tY, 0:9) |> gpu struct Network inits::Vector nodes::Dict{Int, Any} graph::DiGraph shapes::Dict{Int, Any} data::Dict{Int, Any} end Flux.children(net::Network) = values(net.nodes) Flux.mapchildren(f, net::Network) = map(f, values(net.nodes)) insert!(net, node) = (push!(net.inits, node); add_vertex!(net.graph); length(net.inits)) connect!(net, n1, n2) = add_edge!(net.graph, n1, n2) net = Network(Vector(), Dict(), SimpleDiGraph(), Dict(), Dict()) ############################# Architecture made by Ennui # Initialize the network ${initializationCode} # Build the graph ${modelCode} ############################# # Initialize the network with the appropriate shapes # This is achived by doing a forward pass with a single batch function init(net, data) worklist = topological_sort_by_dfs(net.graph) root = first(worklist) for work in worklist if work == root inputs = data node = net.inits[work](size(inputs)) net.data[work] = node(inputs) net.shapes[work] = size(net.data[work]) else input_ids = inneighbors(net.graph, work) if (size(input_ids, 1) > 1) node = net.inits[work] net.data[work] = node(map((x)->net.data[x], input_ids)) net.shapes[work] = size(net.data[work]) else node = net.inits[work](net.shapes[input_ids[1]]) net.data[work] = node(net.data[input_ids[1]]) net.shapes[work] = size(net.data[work]) end end net.nodes[work] = node end end init(net, train[1][1]) function forward(net, data) worklist = topological_sort_by_dfs(net.graph) root = first(worklist) for work in worklist if work == root net.data[work] = net.nodes[work](data) else input_ids = inneighbors(net.graph, work) if (size(input_ids, 1) > 1) net.data[work] = net.nodes[work](map((x)->net.data[x], input_ids)) else net.data[work] = net.nodes[work](net.data[input_ids[1]]) end end end net.data[size(worklist, 1)] end loss(x, y) = ${model.params.getJuliaLoss()}(forward(net, x), y) accuracy(x, y) = mean(onecold(forward(net, x)) .== onecold(y)) evalcb = throttle(() -> @show(accuracy(tX, tY)), 10) opt = ${model.params.getJuliaOptimizer()}(${model.params.learningRate}) for i in 1:6 Flux.train!(loss, params(net), train, opt, cb = evalcb) end `; } ================================================ FILE: src/model/mnist_model.ts ================================================ // Adapted from https://github.com/tensorflow/tfjs-examples/tree/master/mnist import * as tf from "@tensorflow/tfjs"; import {plotAccuracy, plotLoss, resetPlotValues, setupPlots, setupTestResults, showConfusionMatrix, showPredictions} from "./graphs"; import {dataset} from "./data"; import { model } from "./params_object"; /** * Compile and train the given model. * * @param {*} model The model to */ export async function train(): Promise { // Set up all of the plots resetPlotValues(); setupPlots(); setupTestResults(); await dataset.load(); const onIteration = () => showPredictions(); const optimizer = model.params.getOptimizer(); model.architecture.compile({ loss: model.params.loss, metrics: ["accuracy"], optimizer, }); const batchSize = model.params.batchSize; const validationSplit = 0.15; const trainEpochs = model.params.epochs; // We'll keep a buffer of loss and accuracy values over time. let trainBatchCount: number = 0; let prevTrainBatchCount: number = 0; let totalLoss: number = 0; let totalAccuracy: number = 0; const plotLossFrequency: number = 25; const trainData = dataset.getTrainData(); const testData = dataset.getTestData(); const totalNumBatches = Math.ceil(trainData.xs.shape[0] * (1 - validationSplit) / batchSize) * trainEpochs; await model.architecture.fit(trainData.xs, trainData.labels, { batchSize, callbacks: { onBatchEnd: async (batch: number, logs: tf.Logs) => { trainBatchCount++; const accBox = document.getElementById("ti_acc"); const lossBox = document.getElementById("ti_loss"); const trainBox = document.getElementById("ti_training"); accBox.children[1].innerHTML = String(Number((100 * logs.acc).toFixed(2))); lossBox.children[1].innerHTML = String(Number((logs.loss).toFixed(2))); trainBox.children[1].innerHTML = String((trainBatchCount / totalNumBatches * 100).toFixed(1) + "%"); // For logging training in console. // console.log( // `Training... (` + // `${(trainBatchCount / totalNumBatches * 100).toFixed(1)}%` + // ` complete). To stop training, refresh or close page.`); totalLoss += logs.loss; totalAccuracy += logs.acc; if (batch % plotLossFrequency === 0) { // Compute the average loss for the last plotLossFrequency iterations plotLoss(trainBatchCount, totalLoss / (trainBatchCount - prevTrainBatchCount), "train"); plotAccuracy(trainBatchCount, totalAccuracy / (trainBatchCount - prevTrainBatchCount), "train"); prevTrainBatchCount = trainBatchCount; totalLoss = 0; totalAccuracy = 0; } if (batch % 60 === 0) { onIteration(); } await tf.nextFrame(); }, onEpochEnd: async (_: number, logs: tf.Logs) => { const valAcc = logs.val_acc; const valLoss = logs.val_loss; const accBox = document.getElementById("ti_vacc"); const lossBox = document.getElementById("ti_vloss"); accBox.children[1].innerHTML = String(Number((100 * valAcc).toFixed(2))); lossBox.children[1].innerHTML = String(Number((valLoss).toFixed(2))); plotLoss(trainBatchCount, logs.val_loss, "validation"); plotAccuracy(trainBatchCount, logs.val_acc, "validation"); showConfusionMatrix(); onIteration(); await tf.nextFrame(); }, }, epochs: trainEpochs, validationSplit, }); const testResult = model.architecture.evaluate(testData.xs, testData.labels) as Array>; const vaccBox = document.getElementById("ti_vacc"); const vlossBox = document.getElementById("ti_vloss"); vaccBox.children[1].innerHTML = String(Number((100 * testResult[1].dataSync()[0] ).toFixed(2))); vlossBox.children[1].innerHTML = String(Number((testResult[0].dataSync()[0]).toFixed(2))); } ================================================ FILE: src/model/params_object.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { displayError } from "../ui/error"; /** All the hyperparameters for the network */ export interface IHyperparameterData { learningRate: number; batchSize: number; optimizerId: string; epochs: number; lossId: string; } class NetworkParameters { public learningRate: number = 0.01; public batchSize: number = 64; public optimizer: string = "sgd"; public epochs: number = 6; public loss: string = "categoricalCrossentropy"; private paramNames: Set = new Set(["optimizer", "loss"]); public isParam(param: string): boolean { return this.paramNames.has(param); } public getOptimizer(): tf.Optimizer { switch (this.optimizer) { case "sgd": return tf.train.sgd(this.learningRate); case "rmsprop": return tf.train.rmsprop(this.learningRate); case "adagrad": return tf.train.adagrad(this.learningRate); case "adam": return tf.train.adam(this.learningRate); default: throw new Error("Undefined optimizer!"); } } public getPythonLoss(): string { return this.loss.split(/(?=[A-Z])/).join("_").toLowerCase(); } public getPythonOptimizer(): string { switch (this.optimizer) { case "sgd": return "SGD"; case "rmsprop": return "RMSprop"; case "adagrad": return "Adagrad"; case "adam": return "Adam"; default: throw new Error("Undefined optimizer!"); } } public getJuliaLoss(): string { switch (this.loss) { case "categoricalCrossentropy": return "crossentropy"; case "hinge": displayError(new Error("Hinge loss is not yet implemented in Julia. ")); case "meanSquaredError": return "mse"; case "meanAbsoluteError": return "((pred, y) -> mean(abs.(pred .- y)))"; default: throw new Error("Undefined loss!"); } } public getJuliaOptimizer(): string { switch (this.optimizer) { case "sgd": return "Descent"; case "rmsprop": return "RMSProp"; case "adagrad": return "ADAGrad"; case "adam": return "ADAM"; default: throw new Error("Undefined optimizer!"); } } } /** * Create a singleton model. */ class Model { private static instance: Model; public params: NetworkParameters = new NetworkParameters(); public architecture: tf.LayersModel = null; private constructor() {} public static get Instance(): Model { return this.instance || (this.instance = new this()); } } export const model = Model.Instance; ================================================ FILE: src/model/python_skeleton.ts ================================================ import { setModelHyperparameters } from "../ui/app"; import { dataset } from "./data"; import { model } from "./params_object"; export function pythonSkeleton(modelCode: string): string { setModelHyperparameters(); return `from __future__ import print_function import keras from keras.datasets import ${dataset.pythonName} from keras.models import Model from keras.layers import Dense, Dropout, Flatten, Input, Concatenate, BatchNormalization, Add from keras.layers import Conv2D, MaxPooling2D, ReLU from keras import backend as K batch_size = ${model.params.batchSize} num_classes = ${dataset.NUM_CLASSES} epochs = ${model.params.epochs} # input image dimensions img_rows, img_cols, channels = ${dataset.IMAGE_HEIGHT}, ${dataset.IMAGE_WIDTH}, ${dataset.IMAGE_CHANNELS} # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = ${dataset.pythonName}.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape[0], channels, img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], channels, img_rows, img_cols) input_shape = (channels, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, channels) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, channels) input_shape = (img_rows, img_cols, channels) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) ############################# Architecture made by Ennui ${modelCode} ############################# model.compile(loss=keras.losses.${model.params.getPythonLoss()}, optimizer=keras.optimizers.${model.params.getPythonOptimizer()}(lr=${model.params.learningRate}), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) `; } ================================================ FILE: src/model/save_state_url.ts ================================================ import { IDraggableData } from "../ui/app"; import { defaultTemplate, resetWorkspace } from "../ui/model_templates"; import { Input } from "../ui/shapes/layers/input"; import { Output } from "../ui/shapes/layers/output"; import { ISerializedNetwork, stateFromJson } from "./export_model"; export function storeNetworkInUrl(state: ISerializedNetwork): string { // To encode in URL return encodeURI(JSON.stringify(state)); } /** * Load a network from a URL if possible. Otherwise, load the default workspace. */ export function loadStateIfPossible(): IDraggableData { let svgData: IDraggableData = { draggable : [], input: null, output: null, }; const urlParams: string = window.location.hash; try { resetWorkspace(svgData); if (urlParams.length > 1) { const network: ISerializedNetwork = JSON.parse(decodeURI(urlParams.slice(1))); // Serialize the model if it exists svgData = stateFromJson(svgData, network); } else { svgData.input = new Input(); svgData.output = new Output(); defaultTemplate(svgData); } } catch (err) { svgData.input = new Input(); svgData.output = new Output(); defaultTemplate(svgData); throw err; } // Used for getting positions of each draggable in terms of percents of svg canvas // useful if creating a new template // let canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById("svg")); // let width = canvasBoundingBox.width; // let height = canvasBoundingBox.height; // for (let draggable of svgData.draggable) { // let pos = draggable.getPosition() // console.log(pos.x / width, pos.y / height, draggable.getHoverText()) // } history.replaceState(null, null, " "); return svgData; } ================================================ FILE: src/ui/app.ts ================================================ import * as d3 from "d3"; import { buildNetworkDAG, topologicalSort } from "../model/build_network"; import { generateJulia, generatePython } from "../model/code_generation"; import { changeDataset } from "../model/data"; import { download, graphToJson } from "../model/export_model"; import { setupPlots, setupTestResults, showPredictions } from "../model/graphs"; import { train } from "../model/mnist_model"; import { model } from "../model/params_object"; import { loadStateIfPossible, storeNetworkInUrl } from "../model/save_state_url"; import { clearError, displayError } from "./error"; import { blankTemplate, defaultTemplate, resnetTemplate } from "./model_templates"; import { Activation, Relu, Sigmoid, Tanh } from "./shapes/activation"; import { ActivationLayer } from "./shapes/activationlayer"; import { Draggable } from "./shapes/draggable"; import { Layer } from "./shapes/layer"; import { Add } from "./shapes/layers/add"; import { BatchNorm } from "./shapes/layers/batchnorm"; import { Concatenate } from "./shapes/layers/concatenate"; import { Conv2D } from "./shapes/layers/convolutional"; import { Dense } from "./shapes/layers/dense"; import { Dropout } from "./shapes/layers/dropout"; import { Flatten } from "./shapes/layers/flatten"; import { Input } from "./shapes/layers/input"; import { MaxPooling2D } from "./shapes/layers/maxpooling"; import { Output } from "./shapes/layers/output"; import { TextBox } from "./shapes/textbox"; import { WireGuide } from "./shapes/wireguide"; import { copyTextToClipboard } from "./utils"; import { windowProperties } from "./window"; export interface IDraggableData { draggable: Draggable[]; input: Input; output: Output; } export let svgData: IDraggableData = { draggable: [], input: null, output: null, }; document.addEventListener("DOMContentLoaded", () => { // This function runs when the DOM is ready, i.e. when the document has been parsed setupPlots(); setupTestResults(); setupOptionOnClicks(); setupIndividualOnClicks(); const categoryElements = document.getElementsByClassName("categoryTitle") as HTMLCollectionOf; for (const elmt of categoryElements) { makeCollapsable(elmt); } window.addEventListener("resize", resizeMiddleSVG); window.addEventListener("resize", setupPlots); resizeMiddleSVG(); window.onkeyup = (event: KeyboardEvent) => { switch (event.key) { case "Escape": if (windowProperties.selectedElement) { windowProperties.selectedElement.unselect(); windowProperties.selectedElement = null; } break; case "Delete": if (document.getElementsByClassName("focusParam").length === 0) { deleteSelected(); } break; case "Backspace": if (document.getElementsByClassName("focusParam").length === 0) { deleteSelected(); } break; case "Enter": break; } }; windowProperties.wireGuide = new WireGuide(); windowProperties.shapeTextBox = new TextBox(); d3.select("#svg").on("mousemove", () => { if (windowProperties.selectedElement instanceof Layer) { windowProperties.wireGuide.moveToMouse(); } }); svgData = loadStateIfPossible(); // Select the input block when we load the page svgData.input.select(); }); function addOnClickToOptions(categoryId: string, func: (optionValue: string, element: HTMLElement) => void): void { for (const element of document.getElementById(categoryId).getElementsByClassName("option")) { element.addEventListener("click", () => { func(element.getAttribute("data-optionValue"), element as HTMLElement); }); } } function setupOptionOnClicks(): void { addOnClickToOptions("tabselector", (tabType) => switchTab(tabType)); addOnClickToOptions("layers", (layerType) => appendItem(layerType)); addOnClickToOptions("activations", (activationType) => appendItem(activationType)); addOnClickToOptions("templates", (templateType) => createTemplate(templateType)); addOnClickToOptions("educationLayers", (articleType) => { document.getElementById("education" + articleType).scrollIntoView(true); }); addOnClickToOptions("educationStory", (articleType) => { document.getElementById("education" + articleType).scrollIntoView(true); }); addOnClickToOptions("classes", (_, element) => { selectOption("classes", element); if (model.architecture != null) { showPredictions(); } }); addOnClickToOptions("optimizers", (optimizerType, element) => { selectOption("optimizers", element); model.params.optimizer = optimizerType; }); addOnClickToOptions("losses", (lossType, element) => { selectOption("losses", element); model.params.loss = lossType; }); } function selectOption(optionCategoryId: string, optionElement: HTMLElement): void { for (const option of document.getElementById(optionCategoryId).getElementsByClassName("option")) { option.classList.remove("selected"); } optionElement.classList.add("selected"); } function createTemplate(template: string): void { switch (template) { case "blank": blankTemplate(svgData); break; case "default": defaultTemplate(svgData); break; case "resnet": resnetTemplate(svgData); break; } } function appendItem(itemType: string): void { const item: Draggable = new ({ add: Add, batchnorm: BatchNorm, concatenate: Concatenate, conv2D: Conv2D, dense: Dense, dropout: Dropout, flatten: Flatten, maxPooling2D: MaxPooling2D, relu: Relu, sigmoid: Sigmoid, tanh: Tanh, } as any)[itemType](); svgData.draggable.push(item); } function setupIndividualOnClicks(): void { document.getElementById("exportPython").addEventListener("click", () => { changeDataset(svgData.input.getParams().dataset); const filename = svgData.input.getParams().dataset + "_model.py"; download(generatePython(topologicalSort(svgData.input)), filename); }); document.getElementById("exportJulia").addEventListener("click", () => { changeDataset(svgData.input.getParams().dataset); if (svgData.input.getParams().dataset === "cifar") { displayError(new Error("Julia Export does not support CIFAR10, use MNIST instead.")); } else { const filename = svgData.input.getParams().dataset + "_model.jl"; download(generateJulia(topologicalSort(svgData.input)), filename); } }); document.getElementById("copyModel").addEventListener("click", () => { changeDataset(svgData.input.getParams().dataset); // TODO change dataset should happen when the dataset changes const state = graphToJson(svgData); const baseUrl: string = window.location.href; const urlParam: string = storeNetworkInUrl(state); copyTextToClipboard(baseUrl + "#" + urlParam); }); document.getElementById("train").addEventListener("click", trainOnClick); document.getElementById("informationEducation").addEventListener("click", () => { document.getElementById("informationOverlay").style.display = "none"; switchTab("education"); }); document.getElementById("informationOverlay").addEventListener("click", () => { document.getElementById("informationOverlay").style.display = "none"; }); document.getElementById("x").addEventListener("click", () => clearError()); document.getElementById("svg").addEventListener("click", (event) => { // Only click if there is a selected element, and the clicked element is an SVG Element, and its id is "svg" // It does this to prevent unselecting if we click on a layer block or other svg shape if (windowProperties.selectedElement && event.target instanceof SVGElement && event.target.id === "svg") { windowProperties.selectedElement.unselect(); windowProperties.selectedElement = null; } }); } function deleteSelected(): void { if (windowProperties.selectedElement) { windowProperties.selectedElement.delete(); windowProperties.selectedElement = null; } } async function trainOnClick(): Promise { // Only train if not already training const training = document.getElementById("train"); if (!training.classList.contains("train-active")) { clearError(); changeDataset(svgData.input.getParams().dataset); // TODO change dataset should happen when the dataset changes // Grab hyperparameters setModelHyperparameters(); const trainingBox = document.getElementById("ti_training"); trainingBox.children[1].innerHTML = "Yes"; training.innerHTML = "Training"; training.classList.add("train-active"); try { model.architecture = buildNetworkDAG(svgData.input); await train(); } catch (error) { displayError(error); } finally { training.innerHTML = "Train"; training.classList.remove("train-active"); trainingBox.children[1].innerHTML = "No"; } } } function resizeMiddleSVG(): void { const originalSVGWidth = 1000; const svgWidth = document.getElementById("middle").clientWidth; const svgHeight = document.getElementById("middle").clientHeight; const ratio = svgWidth / originalSVGWidth; const xTranslate = (svgWidth - originalSVGWidth) / 2; const yTranslate = Math.max(0, (svgHeight * ratio - svgHeight) / 2); // Modify initialization heights for random locations for layers/activations so they don't appear above the svg const yOffsetDelta = yTranslate / ratio - windowProperties.svgYOffset; ActivationLayer.defaultInitialLocation.y += yOffsetDelta; Activation.defaultLocation.y += yOffsetDelta; windowProperties.svgYOffset = yTranslate / ratio; windowProperties.svgTransformRatio = ratio; document.getElementById("svg").setAttribute("transform", `translate(${xTranslate}, 0) scale(${ratio}, ${ratio}) `); // Call crop position on each draggable to ensure it is within the new canvas boundary if (svgData.input != null) { svgData.input.cropPosition(); svgData.input.moveAction(); } if (svgData.output != null) { svgData.output.cropPosition(); svgData.output.moveAction(); } svgData.draggable.forEach((elem) => { elem.cropPosition(); elem.moveAction(); }); } function toggleExpanderTriangle(categoryTitle: Element): void { categoryTitle.getElementsByClassName("expander")[0].classList.toggle("expanded"); } function makeCollapsable(elmt: Element): void { elmt.addEventListener("click", () => { toggleExpanderTriangle(elmt); const arr = Array.prototype.slice.call(elmt.parentElement.children).slice(1); if (elmt.getAttribute("data-expanded") === "false") { for (const sib of arr) { if (sib.id !== "defaultparambox") { sib.style.display = "block"; } } elmt.setAttribute("data-expanded", "true"); } else { for (const sib of arr) { sib.style.display = "none"; } elmt.setAttribute("data-expanded", "false"); } }); } /** * Takes the hyperparemeters from the html and assigns them to the global model */ export function setModelHyperparameters(): void { let temp: number = 0; const hyperparams = document.getElementsByClassName("hyperparamvalue"); for (const hp of hyperparams) { const name: string = hp.id; temp = Number(( document.getElementById(name) as HTMLInputElement).value); if (temp < 0 || temp == null) { const error: Error = Error("Hyperparameters should be positive numbers."); displayError(error); return; } switch (name) { case "learningRate": model.params.learningRate = temp; break; case "epochs": model.params.epochs = Math.trunc(temp); break; case "batchSize": model.params.batchSize = Math.trunc(temp); break; } } } export function tabSelected(): string { if (document.getElementById("networkTab").style.display !== "none") { return "networkTab"; } else if (document.getElementById("progressTab").style.display !== "none") { return "progressTab"; } else if (document.getElementById("visualizationTab").style.display !== "none") { return "visualizationTab"; } else if (document.getElementById("educationTab").style.display !== "none") { return "educationTab"; } else { throw new Error("No tab selection found"); } } function switchTab(tabType: string): void { // Hide all tabs document.getElementById("networkTab").style.display = "none"; document.getElementById("progressTab").style.display = "none"; document.getElementById("visualizationTab").style.display = "none"; document.getElementById("educationTab").style.display = "none"; // Hide all menus document.getElementById("networkMenu").style.display = "none"; document.getElementById("progressMenu").style.display = "none"; document.getElementById("visualizationMenu").style.display = "none"; document.getElementById("educationMenu").style.display = "none"; // Hide all paramshells document.getElementById("networkParamshell").style.display = "none"; document.getElementById("progressParamshell").style.display = "none"; document.getElementById("visualizationParamshell").style.display = "none"; document.getElementById("educationParamshell").style.display = "none"; // Unselect all tabs document.getElementById("network").classList.remove("tab-selected"); document.getElementById("progress").classList.remove("tab-selected"); document.getElementById("visualization").classList.remove("tab-selected"); document.getElementById("education").classList.remove("tab-selected"); // Display only the selected tab document.getElementById(tabType + "Tab").style.display = null; document.getElementById(tabType).classList.add("tab-selected"); document.getElementById(tabType + "Menu").style.display = null; document.getElementById(tabType + "Paramshell").style.display = null; document.getElementById("paramshell").style.display = null; document.getElementById("menu").style.display = null; // document.getElementById("menu_expander").style.display = null; switch (tabType) { case "network": resizeMiddleSVG(); break; case "progress": setupPlots(); break; case "visualization": showPredictions(); break; case "education": document.getElementById("paramshell").style.display = "none"; break; } // Give border radius to top and bottom neighbors if (document.getElementsByClassName("top_neighbor_tab-selected").length > 0) { document.getElementsByClassName("top_neighbor_tab-selected")[0].classList .remove("top_neighbor_tab-selected"); document.getElementsByClassName("bottom_neighbor_tab-selected")[0].classList .remove("bottom_neighbor_tab-selected"); } const tabMapping = ["blanktab", "network", "progress", "visualization", "middleblanktab", "education", "bottomblanktab"]; const index = tabMapping.indexOf(tabType); document.getElementById(tabMapping[index - 1]).classList.add("top_neighbor_tab-selected"); document.getElementById(tabMapping[index + 1]).classList.add("bottom_neighbor_tab-selected"); } ================================================ FILE: src/ui/error.ts ================================================ export function displayError(error: Error): void { document.getElementById("error").style.display = null; document.getElementById("errorMessage").innerHTML = error.message; document.getElementById("error").title = error.message; throw error; } export function clearError(): void { document.getElementById("error").style.display = "none"; } ================================================ FILE: src/ui/model_templates.ts ================================================ import { IDraggableData } from "./app"; import { Activation, Relu } from "./shapes/activation"; import { ActivationLayer } from "./shapes/activationlayer"; import { Layer } from "./shapes/layer"; import { Add } from "./shapes/layers/add"; import { BatchNorm } from "./shapes/layers/batchnorm"; import { Concatenate } from "./shapes/layers/concatenate"; import { Conv2D } from "./shapes/layers/convolutional"; import { Dense } from "./shapes/layers/dense"; import { Dropout } from "./shapes/layers/dropout"; import { Flatten } from "./shapes/layers/flatten"; import { MaxPooling2D } from "./shapes/layers/maxpooling"; import { Point } from "./shapes/shape"; import { getSvgOriginalBoundingBox } from "./utils"; import { windowProperties } from "./window"; export function resetWorkspace(svgData: IDraggableData): void { // Deselect current element if (windowProperties.selectedElement != null) { windowProperties.selectedElement.unselect(); } // Set input and output locations if (svgData.input != null) { svgData.input.setPosition(svgData.input.defaultLocation); svgData.input.wires.forEach((w) => w.delete()); } if (svgData.output != null) { svgData.output.setPosition(svgData.output.defaultLocation); } // Remove all other layers for (const layer of svgData.draggable) { layer.delete(); } // Clear the current list of draggables svgData.draggable = []; } export function defaultTemplate(svgData: IDraggableData): void { resetWorkspace(svgData); // Initialize each of the layers and activations const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement); const convStartingPosition = new Point(canvasBoundingBox.width / 4, canvasBoundingBox.height / 2.5); const flatStartingPosition = new Point(canvasBoundingBox.width / 1.75, canvasBoundingBox.height / 2.5); const denseStartingPosition = new Point(canvasBoundingBox.width * 5 / 6.5, canvasBoundingBox.height / 2.5); const conv: ActivationLayer = new Conv2D(convStartingPosition); const convRelu: Activation = new Relu(convStartingPosition); const flat: Layer = new Flatten(flatStartingPosition); const dense: ActivationLayer = new Dense(denseStartingPosition); const denseRelu: Activation = new Relu(denseStartingPosition); // Add relationships among layers and activations svgData.input.addChild(conv); conv.addChild(flat); conv.addActivation(convRelu); flat.addChild(dense); dense.addChild(svgData.output); dense.addActivation(denseRelu); // Store the new network svgData.draggable.push(conv); svgData.draggable.push(dense); svgData.draggable.push(flat); svgData.draggable.push(convRelu); svgData.draggable.push(denseRelu); } export function blankTemplate(svgData: IDraggableData): void { resetWorkspace(svgData); } export function resnetTemplate(svgData: IDraggableData): void { resetWorkspace(svgData); // Initialize each of the layers and activations const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement); const width = canvasBoundingBox.width; const height = canvasBoundingBox.height; const conv0Pos = new Point(width * 0.26, height * 0.57); const conv1Pos = new Point(width * 0.26, height * 0.372); const conv2Pos = new Point(width * 0.404, height * 0.372); const conv3Pos = new Point(width * 0.404, height * 0.78); const conv4Pos = new Point(width * 0.537, height * 0.78); const add1Pos = new Point(width * 0.387, height * 0.547); const add2Pos = new Point(width * 0.521, height * 0.547); const flattenPos = new Point(width * 0.708, height * 0.606); const densePos = new Point(width * 0.702, height * 0.566); const dropoutPos = new Point(width * 0.778, height * 0.477); const conv0: ActivationLayer = new Conv2D(conv0Pos); const conv1: ActivationLayer = new Conv2D(conv1Pos); const conv2: ActivationLayer = new Conv2D(conv2Pos); const conv3: ActivationLayer = new Conv2D(conv3Pos); const conv4: ActivationLayer = new Conv2D(conv4Pos); const conv1Relu: Activation = new Relu(conv1Pos); const conv3Relu: Activation = new Relu(conv3Pos); const add1: ActivationLayer = new Add(add1Pos); const add2: ActivationLayer = new Add(add2Pos); const add1Relu: Activation = new Relu(add1Pos); const add2Relu: Activation = new Relu(add2Pos); const flatten: Flatten = new Flatten(flattenPos); const dense: ActivationLayer = new Dense(densePos); const denseRelu: Activation = new Relu(densePos); const dropout: Layer = new Dropout(dropoutPos); // Add activations to layers conv1.addActivation(conv1Relu); conv3.addActivation(conv3Relu); add1.addActivation(add1Relu); add2.addActivation(add2Relu); dense.addActivation(denseRelu); // Add relationships among layers and activations svgData.input.addChild(conv0); conv0.addChild(add1); conv0.addChild(conv1); conv1.addChild(conv2); conv2.addChild(add1); add1.addChild(conv3); add1.addChild(add2); conv3.addChild(conv4); conv4.addChild(add2); add2.addChild(flatten); flatten.addChild(dense); dense.addChild(dropout); dropout.addChild(svgData.output); // Store the new network svgData.draggable.push(conv0); svgData.draggable.push(conv1); svgData.draggable.push(conv2); svgData.draggable.push(conv3); svgData.draggable.push(conv4); svgData.draggable.push(add1); svgData.draggable.push(add2); svgData.draggable.push(flatten); svgData.draggable.push(dense); svgData.draggable.push(dropout); svgData.draggable.push(conv1Relu); svgData.draggable.push(conv3Relu); svgData.draggable.push(add1Relu); svgData.draggable.push(add2Relu); svgData.draggable.push(denseRelu); } export function complexTemplate(svgData: IDraggableData): void { resetWorkspace(svgData); // Initialize each of the layers and activations const canvasBoundingBox = getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement); const width = canvasBoundingBox.width; const height = canvasBoundingBox.height; const convStartingPosition = new Point(width / 3.5, height / 3); const denseStartingPosition = new Point(width * 3 / 4, height / 2); const conv2StartingPosition = new Point(width / 3.5, height * 2 / 3); const batchStartingPosition = new Point(width / 2.5, height * 2 / 3); const maxpoolingStartingPosition = new Point(width / 2.5, height / 3); const concatStartingPosition = new Point(width * 2 / 3, height / 1.9); const flat1StartingPosition = new Point(width / 1.7, height / 2.2); const flat2StartingPosition = new Point(width / 1.7, height * 2 / 3); const conv: ActivationLayer = new Conv2D(convStartingPosition); const convRelu: Activation = new Relu(convStartingPosition); const dense: ActivationLayer = new Dense(denseStartingPosition); const denseRelu: Activation = new Relu(denseStartingPosition); const conv2: ActivationLayer = new Conv2D(conv2StartingPosition); const maxpooling: MaxPooling2D = new MaxPooling2D(maxpoolingStartingPosition); const concat: Concatenate = new Concatenate(concatStartingPosition); const batch: ActivationLayer = new BatchNorm(batchStartingPosition); const batchRelu2: Activation = new Relu(batchStartingPosition); const flat1: Flatten = new Flatten(flat1StartingPosition); const flat2: Flatten = new Flatten(flat2StartingPosition); // Add relationships among layers and activations // in -> conv, in -> conv2 svgData.input.addChild(conv); svgData.input.addChild(conv2); // conv -> maxpool conv.addChild(maxpooling); conv.addActivation(convRelu); // maxpooling -> flat1 maxpooling.addChild(flat1); // conv2 -> batch conv2.addChild(batch); // batch -> flat2 batch.addChild(flat2); batch.addActivation(batchRelu2); // concat -> dense concat.addChild(dense); // flat1 -> concat flat1.addChild(concat); // flat2 -> concat flat2.addChild(concat); // dense -> out dense.addActivation(denseRelu); dense.addChild(svgData.output); // Store the new network svgData.draggable.push(conv); svgData.draggable.push(conv2); svgData.draggable.push(dense); svgData.draggable.push(maxpooling); svgData.draggable.push(convRelu); svgData.draggable.push(batchRelu2); svgData.draggable.push(concat); svgData.draggable.push(flat1); svgData.draggable.push(flat2); svgData.draggable.push(batch); } ================================================ FILE: src/ui/shapes/activation.ts ================================================ import { windowProperties } from "../window"; import { ActivationLayer } from "./activationlayer"; import { Draggable } from "./draggable"; import { Point } from "./shape"; export abstract class Activation extends Draggable { public static defaultLocation: Point = new Point(50, 150); public layer: ActivationLayer = null; public abstract activationType: string; public body: d3.Selection; constructor(color: string, defaultLocation: Point) { super(defaultLocation); this.body = this.svgComponent.append("path") .attr("d", "M0 0 h10 v10 h8 v20 h-26 v-20 h8 v-10 Z") .style("fill", color) .style("cursor", "pointer"); this.makeDraggable(); } public select(): void { super.select(); this.body.style("stroke", "yellow").style("stroke-width", "2"); } public unselect(): void { super.unselect(); this.body.style("stroke", null).style("stroke-width", null); } public delete(): void { // Remove the activation from the layer then delete the activation. if (this.layer != null) { this.layer.removeActivation(); this.layer = null; } super.delete(); } public moveAction(): void { let closestLayer: ActivationLayer; let minDist = Infinity; if (this.layer == null) { // Find the closest layer and its distances for (const activationLayer of windowProperties.activationLayers) { const dist = activationLayer.getPosition().distance(this.getPosition()); if (dist < minDist) { minDist = dist; closestLayer = activationLayer; } } } else { closestLayer = this.layer; minDist = this.layer.getPosition().distance(this.getPosition()); } // Snap activations if they are close enough const snappingDistance = 20; if (minDist < snappingDistance) { // if snap happens remove old connection if (this.layer != null) { this.layer.removeActivation(); this.layer = null; } closestLayer.addActivation(this); this.layer = closestLayer; this.draggedX = this.layer.draggedX; this.draggedY = this.layer.draggedY; } else if (this.layer != null) { // otherwise, if we unsnap update as appropriate this.layer.removeActivation(); this.layer = null; } } } export class Relu extends Activation { public activationType: string = "relu"; constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) { super("#B29F9C", defaultLocation); this.svgComponent.append("path").attr("d", "M-5 20 l10 0 l7 -7") .style("stroke", "black") .style("stroke-width", 3) .style("fill", "none") .style("cursor", "pointer"); } public getHoverText(): string { return "relu"; } } export class Sigmoid extends Activation { public activationType: string = "sigmoid"; constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) { super("#F2A878", defaultLocation); this.svgComponent.append("path").attr("d", "M -3 20 Q 5 20 5 17 Q 5 14 13 14 ") .style("stroke", "black") .style("stroke-width", 3) .style("fill", "none") .style("cursor", "pointer"); } public getHoverText(): string { return "sigmoid"; } } export class Tanh extends Activation { public activationType: string = "tanh"; constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) { super("#A3A66D", defaultLocation); this.svgComponent.append("path").attr("d", "M -4 26 Q 5 26 5 20 Q 5 14 14 14 ") .style("stroke", "black") .style("stroke-width", 3) .style("fill", "none") .style("cursor", "pointer"); } public getHoverText(): string { return "tanh"; } } export class Softmax extends Activation { public activationType: string = "softmax"; constructor(defaultLocation: Point = Point.randomPoint(50, 50, Activation.defaultLocation)) { super("#FFFFFF", defaultLocation); // TODO: curvature and color are wrong this.svgComponent.append("path").attr("d", "M -4 26 Q 5 26 5 20 Q 5 14 14 14 ") .style("stroke", "black") .style("stroke-width", 3) .style("fill", "none") .style("cursor", "pointer"); } public getHoverText(): string { return "softmax"; } } ================================================ FILE: src/ui/shapes/activationlayer.ts ================================================ import { displayError } from "../error"; import { windowProperties } from "../window"; import { Activation } from "./activation"; import { Draggable } from "./draggable"; import { ILayerJson, Layer } from "./layer"; import { Point, Shape } from "./shape"; /** * Layers that can have an activation attached to them. */ export abstract class ActivationLayer extends Layer { public static defaultInitialLocation: Point = new Point(100, 100); public activation: Activation = null; // Note: The activation will snap to the 0,0 point of an ActivationLayer constructor(block: Shape[], defaultLocation: Point = new Point(100, 100)) { super(block, defaultLocation); // Keep track of activationLayers in global state for activation snapping windowProperties.activationLayers.add(this); } public moveAction(): void { super.moveAction(); if (this.activation != null) { const p = this.getPosition(); this.activation.setPosition(p); this.activation.draggedX = this.draggedX; this.activation.draggedY = this.draggedY; } } public raiseGroup(): void { super.raiseGroup(); if (this.activation != null) { this.activation.raiseGroup(); } } public delete(): void { super.delete(); // Remove this layer from global state windowProperties.activationLayers.delete(this); if (this.activation != null) { this.activation.delete(); this.removeActivation(); } } public outerBoundingBox(): {top: number, bottom: number, left: number, right: number} { const bbox = super.outerBoundingBox(); if (this.activation != null) { const nodeBbox = Draggable.nodeBoundingBox(this.activation.svgComponent.node()); bbox.top = Math.min(nodeBbox.top, bbox.top); bbox.bottom = Math.max(nodeBbox.bottom, bbox.bottom); bbox.left = Math.min(nodeBbox.left, bbox.left); bbox.right = Math.max(nodeBbox.right, bbox.right); } return bbox; } public addActivation(activation: Activation): void { if (this.activation != null && this.activation !== activation) { this.activation.delete(); } this.activation = activation; this.activation.layer = this; this.activation.setPosition(this.getPosition()); this.activation.draggedX = this.draggedX; this.activation.draggedY = this.draggedY; } public getActivationText(): string { return this.activation != null ? this.activation.activationType : null; } public removeActivation(): void { this.activation = null; } public toJson(): ILayerJson { const json = super.toJson(); if (this.activation != null) { json.params.activation = this.activation.activationType; } return json; } public generateTfjsLayer(): void { const parameters = this.parameterDefaults; const config = this.getParams(); for (const param of Object.keys(config)) { parameters[param] = config[param]; } if (this.activation != null) { parameters.activation = this.activation.activationType; } let parent: Layer = null; if (this.parents.size > 1) { displayError(new Error("Must use a concatenate when a layer has multiple parents")); } for (const p of this.parents) { parent = p; break; } // Concatenate layers handle fan-in this.tfjsLayer = this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer()); } } ================================================ FILE: src/ui/shapes/draggable.ts ================================================ import * as d3 from "d3"; import { getSvgOriginalBoundingBox } from "../utils"; import { windowProperties } from "../window"; import { Point } from "./shape"; export abstract class Draggable { protected static nodeBoundingBox(node: SVGGraphicsElement): {top: number, bottom: number, left: number, right: number} { const nodeBbox = node.getBBox(); return {bottom: nodeBbox.y + nodeBbox.height, left: nodeBbox.x, right: nodeBbox.x + nodeBbox.width, top: nodeBbox.y}; } public readonly wireGuidePresent: boolean = false; public draggedX: number = null; // Use these to let draggables return to user dragged position after cropping public draggedY: number = null; public svgComponent: d3.Selection; protected moveTimeout: any; protected hoverText: any = d3.select("body") .append("div") .style("position", "absolute") .style("font-weight", "bold") .style("padding", "6px") .style("background", "rgba(0, 0, 0, 0.8)") .style("color", "#eee") .style("border-radius", "2px") .style("display", "none") .style("font-family", "Helvetica") .style("user-select", "none") .text(this.getHoverText()); constructor(defaultLocation: Point = new Point(50, 100)) { this.svgComponent = d3.select("#svg") .append("g") .attr("transform", "translate(" + defaultLocation.x + "," + defaultLocation.y + ")") .on("click", () => { this.select(); window.clearTimeout(this.moveTimeout); this.hoverText.style("visibility", "hidden"); }) .on("contextmenu", () => { window.clearTimeout(this.moveTimeout); this.hoverText.style("visibility", "hidden"); }) .on("mousemove", () => { this.hoverText.style("visibility", "hidden"); clearTimeout(this.moveTimeout); this.moveTimeout = setTimeout(() => { this.hoverText.style("display", ""); this.hoverText.style("visibility", "visible"); }, 280); this.hoverText.style("top", (d3.event.pageY - 40) + "px") .style("left", (d3.event.pageX - 30) + "px"); }) .on("mouseout", () => { clearTimeout(this.moveTimeout); this.hoverText.style("visibility", "hidden"); }); this.makeDraggable(); this.draggedX = defaultLocation.x; this.draggedY = defaultLocation.y; } public makeDraggable(): void { let firstDrag = true; // Fix the offset from the mouse by calculating the distance from the mouse // to the center of the object upon mousedown let mousePosRelativeToCenter: Point; this.svgComponent.on("mousedown", function(): void { const coords = d3.mouse(this); mousePosRelativeToCenter = new Point(coords[0], coords[1]); }); const dragThings = () => { clearTimeout(this.moveTimeout); this.hoverText.style("visibility", "hidden"); if (firstDrag) { // Since touch drags don't activate the mousedown event, // catch touch drags here, even though there might be a slight offset if (mousePosRelativeToCenter == null) { const coords = d3.mouse(this.svgComponent.node()); mousePosRelativeToCenter = new Point(coords[0], coords[1]); } // Perform on drag start here instead of using on("start", ...) // since d3 calls drag starts weirdly (on mousedown, // instead of after actually dragging a little bit) this.raise(); firstDrag = false; } this.draggedX = d3.event.x - mousePosRelativeToCenter.x; this.draggedY = d3.event.y - mousePosRelativeToCenter.y; this.setPosition(new Point(this.draggedX, this.draggedY)); this.cropPosition(); this.moveAction(); // Dragging seems to force mousemove event to be ignored. Since we // use the mousemove event on the svg to move the wire guide, just do that // here unless we find a way to not ignore the mousemove event. windowProperties.wireGuide.moveToMouse(); }; const dragHandler = d3.drag().touchable(true).clickDistance(4) .on("drag", dragThings) .on("end", () => {firstDrag = true; mousePosRelativeToCenter = null; }); this.svgComponent.call(dragHandler); } // Special behavior when being dragged e.g. activations snap to Layers public moveAction(): void { return; } // Bring in front of the other UI elements public raise(): void { this.svgComponent.raise(); } public raiseGroup(): void { this.svgComponent.raise(); } // The text to display when hovering over an object public getHoverText(): string { return ""; } public select(): void { if (windowProperties.selectedElement != null) { if (windowProperties.selectedElement === this) { return; } windowProperties.selectedElement.unselect(); } windowProperties.selectedElement = this; this.raise(); this.svgComponent.selectAll("rect").style("stroke", "yellow").style("stroke-width", "2"); if (this.wireGuidePresent) { windowProperties.wireGuide.moveToMouse(); windowProperties.wireGuide.show(); } } public unselect(): void { if (windowProperties.selectedElement === this) { windowProperties.selectedElement = null; windowProperties.wireGuide.hide(); } this.svgComponent.selectAll("rect").style("stroke", null).style("stroke-width", null); } public delete(): void { this.unselect(); this.svgComponent.remove(); this.hoverText.remove(); } public center(): Point { const bbox = this.svgComponent.node().getBBox(); return new Point(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2); } public outerBoundingBox(): {top: number, bottom: number, left: number, right: number} { const bbox = Draggable.nodeBoundingBox(this.svgComponent.nodes()[0]); for (const node of this.svgComponent.nodes().slice(1)) { const nodeBbox = Draggable.nodeBoundingBox(node); bbox.top = Math.min(nodeBbox.top, bbox.top); bbox.bottom = Math.max(nodeBbox.bottom, bbox.bottom); bbox.left = Math.min(nodeBbox.left, bbox.left); bbox.right = Math.max(nodeBbox.right, nodeBbox.right); } return bbox; } public getPosition(): Point { const transformation = this.svgComponent.attr("transform"); const numArr = transformation.substring( transformation.indexOf("(") + 1 , transformation.indexOf(")") ) .split(",").map((value) => Number(value)); return new Point(numArr[0], numArr[1]); } public cropPosition(): void { const canvasBoundingBox = getSvgOriginalBoundingBox( document.getElementById("svg") as any as SVGSVGElement); const componentBBox = this.outerBoundingBox(); const bottomBoundary = (canvasBoundingBox.height - componentBBox.bottom) - windowProperties.svgYOffset; this.setPosition(new Point( Math.min( Math.max(-componentBBox.left, this.draggedX), canvasBoundingBox.width - componentBBox.right), Math.min( Math.max(-componentBBox.top + windowProperties.svgYOffset, this.draggedY), bottomBoundary))); } public setPosition(position: Point): void { this.svgComponent.attr("transform", "translate(" + position.x + "," + position.y + ")"); } } ================================================ FILE: src/ui/shapes/layer.ts ================================================ import * as tf from "@tensorflow/tfjs"; import * as d3 from "d3"; import { generateTfjsModel, topologicalSort } from "../../model/build_network"; import { changeDataset } from "../../model/data"; import { svgData } from "../app"; import { displayError } from "../error"; import { parseString } from "../utils"; import { windowProperties } from "../window"; import { Draggable } from "./draggable"; import { Point, Shape } from "./shape"; import { Wire } from "./wire"; export interface ILayerJson { layer_name: string; id: number; children_ids: number[]; parent_ids: number[]; params: any; xPosition: number; yPosition: number; } // TODO params for entering things in UI for layer properties export abstract class Layer extends Draggable { public static getNextID(): number { const id = Layer.nextID; Layer.nextID += 1; return id; } private static nextID: number = 0; // a global id counter for labeling layers public layerType: string = ""; // A string indicating layer type for each layer used for serialization public parameterDefaults: { [key: string]: any }; // tfjs keys for layer parameters to input values public children: Set = new Set(); // Predecessors (closer to the input layer) public parents: Set = new Set(); // Successors (closer to the output layer) public wires: Set = new Set(); // The line objects connecting this layer to other layers public uid: number; // Each layer gets a unique ID public shape: number[]; // The shape/dimensions of the layer. public readonly outputWiresAllowed: boolean = true; public readonly wireGuidePresent: boolean = true; protected tfjsLayer: tf.SymbolicTensor; protected readonly tfjsEmptyLayer: any; protected paramBox: HTMLElement; private selectText: any = d3.select("body") .append("div") .style("position", "absolute") .style("padding", "6px") .style("background", "rgba(0, 0, 0, 0.8)") .style("color", "#eee") .style("border-radius", "2px") .style("display", "none") .style("font-family", "Helvetica") .style("user-select", "none"); private block: Shape[]; constructor(block: Shape[], defaultLocation: Point) { super(defaultLocation); this.uid = Layer.nextID; Layer.nextID += 1; this.block = block; for (const rect of this.block) { this.svgComponent.call(rect.svgAppender.bind(rect)); } this.paramBox = document.createElement("div"); this.paramBox.className = "parambox"; this.paramBox.style.visibility = "hidden"; this.paramBox.style.position = "absolute"; document.getElementById("paramtruck").appendChild(this.paramBox); this.svgComponent.on("click", () => { this.select(); window.clearTimeout(this.moveTimeout); this.hoverText.style("visibility", "hidden"); }); this.populateParamBox(); } public abstract lineOfPython(): string; public abstract getHoverText(): string; public abstract clone(): Layer; public moveAction(): void { for (const wire of this.wires) { wire.updatePosition(); } if (windowProperties.selectedElement === this) { windowProperties.shapeTextBox.setPosition(this.getPosition()); } } public raise(): void { this.wires.forEach((w) => w.raiseGroup()); this.parents.forEach((p) => p.raiseGroup()); this.children.forEach((c) => c.raiseGroup()); this.raiseGroup(); } public select(): void { const currSelected = windowProperties.selectedElement; if (currSelected != null && currSelected !== this && currSelected instanceof Layer && currSelected.outputWiresAllowed) { currSelected.addChild(this); } super.select(); document.getElementById("defaultparambox").style.display = "none"; this.paramBox.style.visibility = "visible"; this.svgComponent.selectAll("path").style("stroke", "yellow").style("stroke-width", "2"); this.svgComponent.selectAll(".outerShape").style("stroke", "yellow").style("stroke-width", "2"); const bbox = this.outerBoundingBox(); windowProperties.shapeTextBox.setOffset(new Point((bbox.left + bbox.right) / 2, bbox.bottom + 25)); windowProperties.shapeTextBox.setText("[" + this.layerShape().toString() + "]"); windowProperties.shapeTextBox.setPosition(this.getPosition()); windowProperties.shapeTextBox.show(); } public unselect(): void { super.unselect(); document.getElementById("defaultparambox").style.display = null; this.paramBox.style.visibility = "hidden"; this.svgComponent.selectAll("path").style("stroke", null).style("stroke-width", null); this.svgComponent.selectAll(".outerShape").style("stroke", null).style("stroke-width", null); this.selectText.style("visibility", "hidden"); windowProperties.shapeTextBox.hide(); } /** * Add a child layer of this node (successor). * @param child the layer pointed to by the given wire */ public addChild(child: Layer): void { if (!this.children.has(child) && !child.children.has(this)) { this.children.add(child); child.parents.add(this); const newWire = new Wire(this, child); this.wires.add(newWire); child.wires.add(newWire); } } /** * Add a parent layer of this node (predecessor). * @param parent the layer pointed to by the given wire */ public addParent(parent: Layer): void { parent.addChild(this); } public delete(): void { super.delete(); this.wires.forEach((w) => w.delete()); // deleting wires should delete layer connection sets } public toJson(): ILayerJson { return { children_ids: Array.from(this.children, (child) => child.uid), id: this.uid, layer_name: this.layerType, params: this.getJSONParams(), parent_ids: Array.from(this.parents, (parent) => parent.uid), xPosition: this.getPosition().x, yPosition: this.getPosition().y, }; } public getJSONParams(): { [key: string]: any } { const params: { [key: string]: any } = {}; const defaultParams = this.parameterDefaults; for (const line of this.paramBox.children) { const name = line.children[0].getAttribute("data-name"); if (line.children[1].className === "select") { const selectElement: HTMLSelectElement = line.children[1].children[0] as HTMLSelectElement; params[name] = selectElement.options[selectElement.selectedIndex].value; } else { const value = ( line.children[1] as HTMLInputElement).value; // Need to not parse as integer for float parameters if ((defaultParams[name].toString()).indexOf(".") >= 0) { params[name] = parseFloat(value); } else { params[name] = parseString(value); } } } return params; } public getParams(): { [key: string]: any; } { const params: { [key: string]: any } = {}; const defaultParams = this.parameterDefaults; for (const line of this.paramBox.children) { const name = line.children[0].getAttribute("data-name"); if (line.children[1].className === "select") { const selectElement: HTMLSelectElement = line.children[1].children[0] as HTMLSelectElement; params[name] = selectElement.options[selectElement.selectedIndex].value; } else { const value = ( line.children[1] as HTMLInputElement).value; // Need to not parse as integer for float parameters if ((defaultParams[name].toString()).indexOf(".") >= 0) { params[name] = parseFloat(value); } else { params[name] = parseString(value); } } } return params; } public setParams(params: Map): void { for (const line of this.paramBox.children) { const name = line.children[0].getAttribute("data-name"); if (line.children[1].className === "select") { const selectElement: HTMLSelectElement = line.children[1].children[0] as HTMLSelectElement; // Get index with the correct value and select it for (let i = 0; i < selectElement.options.length; i++) { if (selectElement.options.item(i).value === params.get(name)) { selectElement.selectedIndex = i; break; } } } else { ( line.children[1] as HTMLInputElement).value = params.get(name); } } } /** * Make parent -> this become parent -> layer -> this. * @param layer a layer that will become the new parent * @param parent a parent of this */ public addParentLayerBetween(layer: Layer, parent: Layer): void { parent.children.delete(this); parent.children.add(layer); layer.parents.add(parent); layer.children.add(this); this.parents.delete(parent); this.parents.add(layer); } /** * Make parents -> this become parents -> layer -> this. * @param parent a parent of this */ public addParentLayer(layer: Layer): void { for (const parent of this.parents) { parent.children.delete(this); parent.children.add(layer); } layer.parents = new Set([...layer.parents, ...this.parents]); layer.children.add(this); this.parents.clear(); this.parents.add(layer); } /** * Make new child -> this become this -> newChild -> old children. * @param newChild a new child of this */ public addChildLayerBetween(newChild: Layer): void { for (const child of this.children) { newChild.addChild(child); child.parents.delete(this); } this.children.clear(); this.addChild(newChild); newChild.addParent(this); } public getTfjsLayer(): tf.SymbolicTensor { return this.tfjsLayer; } public generateTfjsLayer(): void { // TODO change defaults to class level const parameters = this.getParams(); let parent: Layer = null; for (const p of this.parents) { parent = p; break; } // Concatenate layers handle fan-in if (this.parents.size > 1) { displayError(new Error("Must use a concatenate when a layer has multiple parents")); } this.tfjsLayer = this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer()); } public layerShape(): number[] { // Computes all of the predecessors to determine shape if (this.layerType === "Input") { changeDataset(svgData.input.getParams().dataset); } try { generateTfjsModel(topologicalSort(svgData.input, false)); return this.getTfjsLayer().shape; } catch (err) { // Hide errors while building the network return null; } } public initLineOfJulia(): string { return ""; } public lineOfJulia(): string { let connections = ""; for (const child of this.children) { connections += `connect!(net, x${this.uid}, x${child.uid})\n`; } return connections; } public hasParentType(type: any ): boolean { for (const p of this.parents) { if (p instanceof type) { return true; } } return false; } protected abstract populateParamBox(): void; protected focusing(): void { for (const line of this.paramBox.children) { ( line.children[1] as HTMLInputElement).onfocus = this.toggleFocus.bind(line.children[1]); ( line.children[1] as HTMLInputElement).onblur = this.toggleFocus.bind(line.children[1]); } } private toggleFocus(textField: any): void { textField.target.classList.toggle("focusParam"); } } ================================================ FILE: src/ui/shapes/layers/add.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { displayError } from "../../error"; import { ActivationLayer } from "../activationlayer"; import { Line, PathShape, Point } from "../shape"; export class Add extends ActivationLayer { public layerType: string = "Add"; public parameterDefaults: { [key: string]: any } = {}; public readonly tfjsEmptyLayer: any = tf.layers.add; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("m10,10 v-10 h-10 v10 a30,30 0 1,1 10,0Z", "#73A665"), new Line(new Point(-10, -20), new Point(20, -20), 5, "#040"), new Line(new Point(5, -35), new Point(5, -5), 5, "#040")], defaultLocation); // Path for Layer plus: m15,10 h-5 v-10 h-10 v10 h-5 v-20 h-20 v-20 h20 v-20 h20 v20 h20 v20 h-20 v20Z } public populateParamBox(): void { return; } public getHoverText(): string { return "Add"; } public lineOfPython(): string { return `Add()`; } public initLineOfJulia(): string { displayError(Error("Export to Julia does not support Add Layers")); throw Error; } public generateTfjsLayer(): void { // Concatenate layers handle fan-in const parents = []; for (const parent of this.parents) { parents.push(parent.getTfjsLayer()); } this.tfjsLayer = this.tfjsEmptyLayer().apply(parents) as tf.SymbolicTensor; } public clone(): Add { const newLayer = new Add(); return newLayer; } } ================================================ FILE: src/ui/shapes/layers/batchnorm.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { SymbolicTensor } from "@tensorflow/tfjs"; import { displayError } from "../../error"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { PathShape, Point } from "../shape"; export class BatchNorm extends ActivationLayer { public static readonly blockSize: number = 50; public layerType: string = "BatchNorm"; public parameterDefaults: { [key: string]: any } = {momentum: 0.99}; protected tfjsEmptyLayer: any = tf.layers.batchNormalization; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("M-10 -90 L 20 -60 v70 h-10 v-10 h-10 v10 h-10 v-100 Z", "#CFB53B")], defaultLocation); } public populateParamBox(): void { const line1 = document.createElement("div"); line1.className = "paramline"; const name1 = document.createElement("div"); name1.className = "paramname"; name1.innerHTML = "Momentum:"; name1.setAttribute("data-name", "momentum"); const value1 = document.createElement("input"); value1.className = "paramvalue layerparamvalue"; value1.value = "0.99"; line1.appendChild(name1); line1.appendChild(value1); this.paramBox.append(line1); this.focusing(); } public getHoverText(): string { return "BatchNorm"; } public lineOfPython(): string { const params = this.getParams(); return `BatchNormalization(momentum=${params.momentum})`; } public initLineOfJulia(): string { // displayError(new Error('Batch Normalization is not yet supported for Julia.')); const params = this.getParams(); const activation = this.getActivationText(); const activationText = activation == null ? "" : `, ${activation}`; return `x${this.uid} = insert!(net, (shape) -> BatchNorm(shape[3]${activationText},` + `momentum=Float32(${params.momentum})))\n`; } public clone(): BatchNorm { const newBN: BatchNorm = new BatchNorm(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)); newBN.activation = this.activation; newBN.paramBox = this.paramBox; return newBN; } public generateTfjsLayer(): void { const parameters: { [key: string]: any } = {momentum: 0.99}; const config = this.getParams(); for (const param of Object.keys(config)) { parameters[param] = config[param]; } let parent: Layer = null; for (const p of this.parents) { parent = p; break; } // Concatenate layers handle fan-in this.tfjsLayer = this.tfjsEmptyLayer(parameters).apply(parent.getTfjsLayer()) as SymbolicTensor; if (this.activation != null) { if (this.activation.activationType !== "relu") { displayError(new Error("Batch Normalization does not support activations other than ReLu")); } this.tfjsLayer = tf.layers.reLU().apply(this.tfjsLayer) as SymbolicTensor; } } } ================================================ FILE: src/ui/shapes/layers/concatenate.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { PathShape, Point } from "../shape"; export class Concatenate extends Layer { public layerType: string = "Concatenate"; public parameterDefaults: { [key: string]: any } = {}; public readonly tfjsEmptyLayer: any = tf.layers.concatenate; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("M-23 -120 h23 v120 h-23 v-120 Z", "#F27493"), new PathShape("M-23 -81 h23 v2 h-23 v-2 Z", "rgba(20, 20, 20, 0.3)"), new PathShape("M-23 -41 h23 v2 h-23 v-2 Z", "rgba(20, 20, 20, 0.3)")], defaultLocation); } public populateParamBox(): void {return; } public getHoverText(): string { return "Concatenate"; } public lineOfPython(): string { return `Concatenate()`; } public initLineOfJulia(): string { return `x${this.uid} = insert!(net, (x) -> vcat(x...))\n`; } public generateTfjsLayer(): void { // Concatenate layers handle fan-in const parents = []; for (const parent of this.parents) { parents.push(parent.getTfjsLayer()); } this.tfjsLayer = this.tfjsEmptyLayer().apply(parents) as tf.SymbolicTensor; } public clone(): Concatenate { const newLayer = new Concatenate(); // newLayer.paramBox = this.paramBox return newLayer; } } ================================================ FILE: src/ui/shapes/layers/convolutional.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { PathShape, Point, Rectangle } from "../shape"; export class Conv2D extends ActivationLayer { public static readonly blockSize: number = 50; public layerType: string = "Conv2D"; public parameterDefaults: { [key: string]: any } = { filters: 16, kernelRegularizer: "none", kernelSize: [3, 3], padding: "same", regScale: 0.1, strides: [1, 1], }; protected tfjsEmptyLayer: any = tf.layers.conv2d; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new Rectangle(new Point(-54, -80), Conv2D.blockSize, Conv2D.blockSize, "#3B6B88"), new Rectangle(new Point(-37, -60), Conv2D.blockSize, Conv2D.blockSize, "#3B7B88"), new PathShape("M-20 -40 h50 v50 h-20 v-10 h-10 v10 h-20 v-50 Z", "#3B8B88")], defaultLocation); } public populateParamBox(): void { const line1 = document.createElement("div"); line1.className = "paramline"; const name1 = document.createElement("div"); name1.className = "paramname"; name1.innerHTML = "Filters:"; name1.setAttribute("data-name", "filters"); const value1 = document.createElement("input"); value1.className = "paramvalue layerparamvalue"; value1.value = "16"; line1.appendChild(name1); line1.appendChild(value1); this.paramBox.append(line1); const line2 = document.createElement("div"); line2.className = "paramline"; const name2 = document.createElement("div"); name2.className = "paramname"; name2.innerHTML = "Kernel size:"; name2.setAttribute("data-name", "kernelSize"); const value2 = document.createElement("input"); value2.className = "paramvalue layerparamvalue"; value2.value = "3, 3"; line2.appendChild(name2); line2.appendChild(value2); this.paramBox.append(line2); const line3 = document.createElement("div"); line3.className = "paramline"; const name3 = document.createElement("div"); name3.className = "paramname"; name3.innerHTML = "Stride:"; name3.setAttribute("data-name", "strides"); const value3 = document.createElement("input"); value3.className = "paramvalue layerparamvalue"; value3.value = "1, 1"; line3.appendChild(name3); line3.appendChild(value3); this.paramBox.append(line3); // Dataset input box // TODO: separate this logic out. const line4 = document.createElement("div"); line4.className = "paramline selectline"; const name4 = document.createElement("div"); name4.className = "paramname"; name4.innerHTML = "Norm:"; name4.setAttribute("data-name", "kernelRegularizer"); const selectDiv = document.createElement("div"); selectDiv.className = "select"; const arrow = document.createElement("div"); arrow.className = "select__arrow"; const select = document.createElement("select"); select.className = "parameter-select"; for (const value of [["none", "None"], ["l1", "L1"], ["l2", "L2"]]) { const option = document.createElement("option"); option.value = value[0]; option.innerHTML = value[1]; select.appendChild(option); } line4.appendChild(name4); line4.appendChild(selectDiv); selectDiv.appendChild(select); selectDiv.appendChild(arrow); this.paramBox.append(line4); const line5 = document.createElement("div"); line5.className = "paramline"; const name5 = document.createElement("div"); name5.className = "paramname"; name5.innerHTML = "Scale:"; name5.setAttribute("data-name", "regScale"); const value5 = document.createElement("input"); value5.className = "paramvalue layerparamvalue"; value5.value = "0.1"; line5.appendChild(name5); line5.appendChild(value5); this.paramBox.append(line5); line5.classList.add("hidden_div"); select.addEventListener("change", () => { if (select.value !== "none" && line5.classList.contains("hidden_div")) { line5.classList.toggle("hidden_div"); } if (select.value === "none" && !line5.classList.contains("hidden_div")) { line5.classList.add("hidden_div"); } }); this.focusing(); } public getHoverText(): string { return "Conv"; } public lineOfPython(): string { const params = this.getParams(); const activation = this.getActivationText(); const activationText = activation == null ? "" : `, activation='${activation}'`; return `Conv2D(${params.filters}, (${params.kernelSize}),` + `strides=(${params.strides})${activationText}, padding='same')`; } public initLineOfJulia(): string { const params = this.getParams(); const activation = this.getActivationText(); const activationText = activation == null ? "" : `, ${activation}`; return `x${this.uid} = insert!(net, (shape) -> Conv((${params.kernelSize}),` + `shape[3] =>${params.filters}${activationText}, stride=(${params.strides})))\n`; } public clone(): Conv2D { const newConv: Conv2D = new Conv2D(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)); newConv.activation = this.activation; newConv.paramBox = this.paramBox; return newConv; } public getParams(): { [key: string]: any } { const parameters = super.getParams(); const scale = parameters.regScale; delete parameters.regScale; switch (parameters.kernelRegularizer) { case "none": delete parameters.kernelRegularizer; case "l1": parameters.kernelRegularizer = tf.regularizers.l1({l1: scale}); case "l2": parameters.kernelRegularizer = tf.regularizers.l2({l2: scale}); } return parameters; } } ================================================ FILE: src/ui/shapes/layers/dense.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { PathShape, Point } from "../shape"; export class Dense extends ActivationLayer { public layerType: string = "Dense"; public parameterDefaults: { [key: string]: any } = {units: 32}; public readonly tfjsEmptyLayer: any = tf.layers.dense; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("M-8 -90 h26 v100 h-8 v-10 h-10 v10 h-8 v-100 Z", "#F7473B")], defaultLocation); } public populateParamBox(): void { const line = document.createElement("div"); line.className = "paramline"; const name = document.createElement("div"); name.className = "paramname"; name.innerHTML = "Units:"; name.setAttribute("data-name", "units"); const value = document.createElement("input"); value.className = "paramvalue layerparamvalue"; value.value = "32"; line.appendChild(name); line.appendChild(value); this.paramBox.append(line); this.focusing(); } public getHoverText(): string { return "Dense"; } public lineOfPython(): string { const params = this.getParams(); const activation = this.getActivationText(); const activationText = activation == null ? "" : `, activation='${activation}'`; return `Dense(${params.units}${activationText})`; } public initLineOfJulia(): string { const params = this.getParams(); const activation = this.getActivationText(); const activationText = activation == null ? "" : `, ${activation}`; return `x${this.uid} = insert!(net, (shape) -> Dense(shape[1], ${params.units}${activationText}))\n`; } public clone(): Dense { const newLayer = new Dense(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)); newLayer.paramBox = this.paramBox; newLayer.activation = this.activation; return newLayer; } } ================================================ FILE: src/ui/shapes/layers/dropout.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { PathShape, Point } from "../shape"; export class Dropout extends Layer { public layerType: string = "Dropout"; public parameterDefaults: { [key: string]: any } = {rate: 0.5}; public readonly tfjsEmptyLayer: any = tf.layers.dropout; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("M0 0 h60 v60 h-60 v-60 Z", "#99BCE0"), new PathShape("M18 0 h4 v60 h-4 v-60 Z", "rgba(20, 20, 20, 0.2)"), new PathShape("M38 0 h4 v60 h-4 v-60 Z", "rgba(20, 20, 20, 0.2)"), new PathShape("M0 18 v4 h60 v-4 h-60 Z", "rgba(20, 20, 20, 0.2)"), new PathShape("M0 38 v4 h60 v-4 h-60 Z", "rgba(20, 20, 20, 0.2)")], defaultLocation); } public populateParamBox(): void { const line = document.createElement("div"); line.className = "paramline"; const name = document.createElement("div"); name.className = "paramname"; name.innerHTML = "Rate:"; name.setAttribute("data-name", "rate"); const value = document.createElement("input"); value.className = "paramvalue layerparamvalue"; value.value = "0.5"; line.appendChild(name); line.appendChild(value); this.paramBox.append(line); this.focusing(); } public getHoverText(): string { return "Dropout"; } public lineOfPython(): string { const params = this.getParams(); return `Dropout(rate=${params.rate})`; } public initLineOfJulia(): string { const params = this.getParams(); return `x${this.uid} = insert!(net, (shape) -> Dropout(${params.rate}))\n`; } public clone(): Dropout { const newLayer = new Dropout(); newLayer.paramBox = this.paramBox; return newLayer; } } ================================================ FILE: src/ui/shapes/layers/flatten.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { PathShape, Point } from "../shape"; export class Flatten extends Layer { public layerType: string = "Flatten"; public parameterDefaults: { [key: string]: any } = {}; public readonly tfjsEmptyLayer: any = tf.layers.flatten; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new PathShape("M-90 -90 h15 v-30 h15 v100 h-15 v-30 h-15 v-40 Z", "#AA222F")], defaultLocation); } public populateParamBox(): void {return; } public getHoverText(): string { return "Flatten"; } public lineOfPython(): string { return `Flatten()`; } public initLineOfJulia(): string { return `x${this.uid} = insert!(net, (shape) -> (x) -> reshape(x, :, size(x, 4)))\n`; } public clone(): Flatten { return new Flatten(); } } ================================================ FILE: src/ui/shapes/layers/input.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { dataset } from "../../../model/data"; import { getSvgOriginalBoundingBox } from "../../utils"; import { Layer } from "../layer"; import { Point, Rectangle } from "../shape"; export class Input extends Layer { public layerType: string = "Input"; public parameterDefaults: { [key: string]: any } = {}; public readonly tfjsEmptyLayer: any = tf.input; public defaultLocation: Point = new Point(100, getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).height / 2); constructor() { super([new Rectangle(new Point(0, 0), 40, 40, "#806CB7")], new Point(100, getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).height / 2)); } public getHoverText(): string { return "Input"; } public delete(): void { this.unselect(); } public populateParamBox(): void { // Dataset input box // TODO: separate this logic out. const line = document.createElement("div"); line.className = "paramline selectline"; const name = document.createElement("div"); name.className = "paramname"; name.innerHTML = "Dataset:"; name.setAttribute("data-name", "dataset"); const selectDiv = document.createElement("div"); selectDiv.className = "select"; const arrow = document.createElement("div"); arrow.className = "select__arrow"; const select = document.createElement("select"); select.className = "parameter-select"; for (const value of [["mnist", "MNIST"], ["cifar", "Cifar-10"]]) { const option = document.createElement("option"); option.value = value[0]; option.innerHTML = value[1]; select.appendChild(option); } line.appendChild(name); line.appendChild(selectDiv); selectDiv.appendChild(select); selectDiv.appendChild(arrow); this.paramBox.append(line); this.focusing(); } public generateTfjsLayer(): void { // TODO make this a member variable this.tfjsLayer = this.tfjsEmptyLayer({shape: [ dataset.IMAGE_HEIGHT, dataset.IMAGE_WIDTH, dataset.IMAGE_CHANNELS]}); } public lineOfPython(): string { // Relies on an input_shape being defined in the python skeleton return `Input(shape=input_shape)`; } public initLineOfJulia(): string { return `x${this.uid} = insert!(net, (shape) -> x -> x)\n`; } public clone(): Input { const newLayer = new Input(); return newLayer; } } ================================================ FILE: src/ui/shapes/layers/maxpooling.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { Point, Rectangle } from "../shape"; export class MaxPooling2D extends Layer { public static readonly blockSize: number = 30; public layerType: string = "MaxPooling2D"; public parameterDefaults: { [key: string]: any } = {poolSize: [2, 2], strides: [2, 2]}; public readonly tfjsEmptyLayer: any = tf.layers.maxPool2d; constructor(defaultLocation: Point = Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)) { super([new Rectangle(new Point(-44, -60), MaxPooling2D.blockSize, MaxPooling2D.blockSize, "#F76034"), new Rectangle(new Point(-27, -40), MaxPooling2D.blockSize, MaxPooling2D.blockSize, "#F77134"), new Rectangle(new Point(-10, -20), MaxPooling2D.blockSize, MaxPooling2D.blockSize, "#F78234")], defaultLocation); } public populateParamBox(): void { const line = document.createElement("div"); line.className = "paramline"; const name = document.createElement("div"); name.className = "paramname"; name.innerHTML = "Pool size:"; name.setAttribute("data-name", "poolSize"); const value = document.createElement("input"); value.className = "paramvalue layerparamvalue"; value.value = "2, 2"; line.appendChild(name); line.appendChild(value); this.paramBox.append(line); const line2 = document.createElement("div"); line2.className = "paramline"; const name2 = document.createElement("div"); name2.className = "paramname"; name2.innerHTML = "Strides:"; name2.setAttribute("data-name", "strides"); const value2 = document.createElement("input"); value2.className = "paramvalue layerparamvalue"; value2.value = "2, 2"; line2.appendChild(name2); line2.appendChild(value2); this.paramBox.append(line2); this.focusing(); } public getHoverText(): string { return "Maxpool"; } public lineOfPython(): string { const params = this.getParams(); return `MaxPooling2D(pool_size=(${params.poolSize}), strides=(${params.strides}))`; } public initLineOfJulia(): string { const params = this.getParams(); return `x${this.uid} = insert!(net, (shape) -> (x) -> maxpool(x, (${params.poolSize})))\n`; } public clone(): MaxPooling2D { const newLayer = new MaxPooling2D(Point.randomPoint(100, 40, ActivationLayer.defaultInitialLocation)); newLayer.paramBox = this.paramBox; return newLayer; } } ================================================ FILE: src/ui/shapes/layers/output.ts ================================================ import * as tf from "@tensorflow/tfjs"; import { displayError } from "../../error"; import { getSvgOriginalBoundingBox } from "../../utils"; import { ActivationLayer } from "../activationlayer"; import { Layer } from "../layer"; import { Point, Rectangle } from "../shape"; export class Output extends ActivationLayer { public layerType: string = "Output"; public parameterDefaults: { [key: string]: any } = {units: 10, activation: "softmax"}; public readonly tfjsEmptyLayer: any = tf.layers.dense ; public readonly outputWiresAllowed: boolean = false; public readonly wireGuidePresent: boolean = false; public defaultLocation: Point = new Point( getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).width - 100, getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).height / 2); private juliaFinalLineId: number = null; constructor() { super([new Rectangle(new Point(-8, -90), 30, 200, "#806CB7")], new Point(getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).width - 100, getSvgOriginalBoundingBox(document.getElementById("svg") as any as SVGSVGElement).height / 2)); } public getHoverText(): string { return "Output"; } public delete(): void { this.unselect(); } public populateParamBox(): void {return; } public lineOfPython(): string { return `Dense(10, activation='softmax')`; } public initLineOfJulia(): string { let init = `x${this.uid} = insert!(net, (shape) -> Dense(shape[1], 10))\n`; if (this.juliaFinalLineId == null) { this.juliaFinalLineId = Layer.getNextID(); } init += `x${this.juliaFinalLineId} = insert!(net, (shape) -> (x) -> softmax(x))`; return init; } public lineOfJulia(): string { const connections = super.lineOfJulia(); return connections + `connect!(net, x${this.uid}, x${this.juliaFinalLineId})`; } public clone(): Output { const newLayer = new Output(); newLayer.paramBox = this.paramBox; return newLayer; } public addChild(_: Layer): void { displayError(new Error("Output cannot have children. ")); } } ================================================ FILE: src/ui/shapes/shape.ts ================================================ import * as d3 from "d3"; export abstract class Shape { public color: string; public location: Point; public svgComponent: d3.Selection; constructor(location: Point, color: string) { this.color = color; this.location = location; } public abstract svgAppender(selection: d3.Selection): void; } export class PathShape extends Shape { public path: string; constructor(path: string, color: string) { super(new Point(0, 0), color); this.path = path; } public svgAppender(selection: d3.Selection): void { this.svgComponent = selection.append("path") .attr("d", this.path) .attr("x", this.location.x) .attr("y", this.location.y) .style("fill", this.color) .style("cursor", "pointer"); } } export class Rectangle extends Shape { public width: number; public height: number; constructor(location: Point, width: number, height: number, color: string) { super(location, color); this.width = width; this.height = height; } public svgAppender(selection: d3.Selection): void { this.svgComponent = selection.append("rect") .attr("x", this.location.x) .attr("y", this.location.y) .attr("width", this.width) .attr("height", this.height) .style("fill", this.color) .style("cursor", "pointer"); } } export class Circle extends Shape { public radius: number; private outerShape: boolean; constructor(location: Point, radius: number, color: string, outerShape: boolean = false) { super(location, color); this.radius = radius; this.outerShape = outerShape; } public svgAppender(selection: d3.Selection): void { this.svgComponent = selection.append("circle") .attr("cx", this.location.x) .attr("cy", this.location.y) .attr("r", this.radius) .style("fill", this.color) .style("cursor", "pointer"); if (this.outerShape) { this.svgComponent.attr("class", "outerShape"); } } } export class Line extends Shape { public endPoint: Point; public lineWidth: number; constructor(location: Point, endPoint: Point, lineWidth: number, color: string) { super(location, color); this.endPoint = endPoint; this.lineWidth = lineWidth; } public svgAppender(selection: d3.Selection): void { this.svgComponent = selection.append("line") .attr("x1", this.location.x) .attr("y1", this.location.y) .attr("x2", this.endPoint.x) .attr("y2", this.endPoint.y) .style("stroke-width", this.lineWidth) .style("stroke", this.color) .style("cursor", "pointer"); } } export class Point { public static randomPoint(width: number, height: number, initial: Point): Point { return new Point(Math.random() * width + initial.x, Math.random() * height + initial.y); } public x: number; public y: number; constructor(x: number, y: number) { this.x = x; this.y = y; } public distance(other: Point): number { return Math.sqrt((this.x - other.x) ** 2 + (this.y - other.y) ** 2); } public add(other: Point): Point { return new Point(this.x + other.x, this.y + other.y); } public minus(other: Point): Point { return new Point(this.x - other.x, this.y - other.y); } public angleTo(other: Point): number { return Math.atan2(other.y - this.y, other.x - this.x) * 180 / Math.PI; // angle for tangent } public midpoint(other: Point): Point { return new Point((this.x + other.x) / 2, (this.y + other.y) / 2); } } ================================================ FILE: src/ui/shapes/textbox.ts ================================================ import * as d3 from "d3"; import { Point } from "./shape"; export class TextBox { private group: d3.Selection; private textElement: d3.Selection; private offset: Point; constructor() { this.group = d3.select("#svg").append("g") .attr("transform", "translate(5, 50)") .style("display", "none"); this.group.append("rect") .attr("x", -50) .attr("y", -15) .attr("width", 100) .attr("height", 30) .attr("rx", 3) .attr("fill", "rgb(0,0,0,0.8)"); this.textElement = this.group.append("text") .attr("font-family", "Helvetica") .attr("alignment-baseline", "middle") .attr("text-anchor", "middle") .attr("font-size", 16) .attr("fill", "#eeeeee"); } public show(): void { this.group.style("display", null); this.group.raise(); } public hide(): void { this.group.style("display", "none"); } public raise(): void { this.group.raise(); } public setText(text: string): void { this.textElement.text(text); // TODO get text width and set rectangle to be large enough } public setOffset(offset: Point): void { this.offset = offset; } public setPosition(position: Point): void { this.raise(); this.group.attr("transform", `translate(${position.x + this.offset.x}, ${position.y + this.offset.y})`); } } ================================================ FILE: src/ui/shapes/wire.ts ================================================ import * as d3 from "d3"; import { windowProperties } from "../window"; import { Layer } from "./layer"; export class Wire { public readonly wireGuidePresent: boolean = false; private source: Layer; private dest: Layer; private line: d3.Selection; private triangle: d3.Selection; private group: d3.Selection; constructor(source: Layer, dest: Layer) { this.source = source; this.dest = dest; const sourceCenter = this.source.getPosition().add(this.source.center()); const destCenter = this.dest.getPosition().add(this.dest.center()); this.group = d3.select("#svg") .append("g"); this.line = this.group.append("line") .attr("x1", sourceCenter.x) .attr("y1", sourceCenter.y) .attr("x2", destCenter.x) .attr("y2", destCenter.y) .style("stroke", "black") .style("stroke-width", 6) .style("cursor", "pointer"); this.triangle = this.group.append("polygon") .attr("points", "0,16, 20,0, 0,-16") .style("cursor", "pointer"); this.updatePosition(); this.source.raise(); this.dest.raise(); this.line.on("click", () => {this.select(); }); this.triangle.on("click", () => {this.select(); }); } public raise(): void { this.group.raise(); this.source.raiseGroup(); this.dest.raiseGroup(); } public raiseGroup(): void { this.group.raise(); } public select(): void { if (windowProperties.selectedElement != null) { if (windowProperties.selectedElement === this) { return; } windowProperties.selectedElement.unselect(); } windowProperties.selectedElement = this; this.raise(); this.line.style("stroke", "yellow"); this.triangle.style("fill", "yellow"); } public unselect(): void { this.line.style("stroke", "black"); this.triangle.style("fill", "black"); } public delete(): void { this.line.remove(); this.triangle.remove(); this.source.children.delete(this.dest); this.dest.parents.delete(this.source); this.source.wires.delete(this); this.dest.wires.delete(this); } public updatePosition(): void { const sourceCenter = this.source.getPosition().add(this.source.center()); const destCenter = this.dest.getPosition().add(this.dest.center()); const midPoint = sourceCenter.midpoint(destCenter); this.line.attr("x1", sourceCenter.x) .attr("y1", sourceCenter.y) .attr("x2", destCenter.x) .attr("y2", destCenter.y); this.triangle.attr("transform", "translate(" + midPoint.x + "," + midPoint.y + ")rotate(" + sourceCenter.angleTo(destCenter) + ")"); } } ================================================ FILE: src/ui/shapes/wireguide.ts ================================================ import * as d3 from "d3"; import { windowProperties } from "../window"; import { Draggable } from "./draggable"; export class WireGuide { private dashedLine: d3.Selection; private circle: d3.Selection; constructor() { this.dashedLine = d3.select("#svg").append("line") .attr("x1", 0) .attr("y1", 0) .attr("x2", 0) .attr("y2", 0) .style("stroke", "black") .style("stroke-width", 6) .style("stroke-dasharray", ("8, 8")) .style("display", "none") .style("pointer-events", "none"); this.circle = d3.select("#svg").append("circle") .attr("cx", 0) .attr("cy", 0) .attr("r", 10) .style("fill", "black") .style("stroke-width", "4") .style("display", "none") .style("pointer-events", "none"); } public show(): void { this.dashedLine.style("display", null); this.circle.style("display", null); this.dashedLine.raise(); this.circle.raise(); } public hide(): void { this.dashedLine.style("display", "none"); this.circle.style("display", "none"); } public raise(): void { this.dashedLine.raise(); this.circle.raise(); } public moveToMouse(): void { this.raise(); if (windowProperties.selectedElement != null && windowProperties.selectedElement.wireGuidePresent && windowProperties.selectedElement instanceof Draggable) { const sourceCenter = windowProperties.selectedElement.getPosition() .add(windowProperties.selectedElement.center()); // Catch the error when there the mouse does not yet have a relative position let endCoords; try { endCoords = d3.mouse( d3.select("#svg").node() as any); } catch (error) { endCoords = [0, 0]; } this.dashedLine.attr("x1", sourceCenter.x) .attr("y1", sourceCenter.y) .attr("x2", endCoords[0]) .attr("y2", endCoords[1]); this.circle.attr("cx", sourceCenter.x) .attr("cy", sourceCenter.y); } } } ================================================ FILE: src/ui/style.scss ================================================ $color-menu-bg: #E5E5FC; body { margin: 0px; overflow: hidden; } #main { width:100%; height:100%; background-color: #D3D3DE; /* border: solid 3px #555; */ } #tabselector { width: 50px; height: 100%; float:left; //background-color: #A8A8BD; background-color: $color-menu-bg; font-size:22px; font-family: Helvetica; user-select:none; } #menu { width: 160px; height: calc(100% - 15px); float:left; background-color: $color-menu-bg; font-size:22px; font-family: Helvetica; user-select:none; padding: 7.5px 10px; display: block; } #menu_expander { width:10px; height:100%; float:left; margin-left: -10px; } #menu_expander_handle { width: 200%; height:30px; margin-top:calc(50vh - 15px); cursor: pointer; } #menu_expander_handle > svg { height: 30px; width: 20px; } #right_menu_expander { width: 10px; height: 100%; float: right; background: #E5E5FC; margin-right: -10px; } #right_menu_expander_handle { width: 200%; height:30px; margin-top:calc(50vh - 15px); cursor: pointer; float:right; } #right_menu_expander_handle > svg { height: 30px; width: 20px; } #paramshell { width: 180px; height: 100%; float:right; background-color: $color-menu-bg; font-size:18px; font-family: Helvetica; user-select:none; padding-left: 10px; padding-right: 10px; display: block; } #blanktab { min-height: calc(25% - 100px); width: 100%; background-color: #A8A8BD; } #middleblanktab { min-height: calc(75% - 200px); width: 100%; vertical-align: middle; background-color: #A8A8BD; float:left; } #bottomblanktab { width: 100%; height: 100%; vertical-align: middle; background-color: #A8A8BD; float:left; } .icon{ padding-top: 23; padding-left: 1; } .tab:hover { background-color: #C7C7E0; } .category{ padding-bottom: 15px; width:100%; } .categoryTitle { background: #555; text-align: center; height:35px; line-height: 35px; color: #eee; font-size:22px; font-family: Helvetica; cursor: pointer; } .categoryTitleText { position:relative; float:left; margin-left:10px; margin-top:2px; } .trainbox { text-align: center; margin-top: 20px; width:180px; height:70px; line-height: 50px; font-size:22px; font-family: Helvetica; } .train { background: #447344; color: #eee; text-align:center; height:50px; line-height:50px; font-size:24px; font-family: Helvetica; border-radius: 6px; cursor:pointer; } .train:hover { background-color: #00008B; } .train-active { background: #00008B; } .expander { float:right; margin-top:5px; margin-right:5px; } .expanded{ float:right; margin-top:5px; margin-right:5px; transform: rotate(180deg) } .bottomCategory{ position: absolute; bottom: 10px; width: 160px; padding-bottom: 15px; } .category{ padding-bottom: 20px; width:100%; } .parambox{ width:calc(197px - 20px); padding-left: 10px; padding-right:10px; padding-top: 20px; text-align: center; } .paramline{ width:100%; text-align:left; height:30px; line-height:30px; font-size:22px; font-family: Helvetica; background-color: transparent; user-select:none; } .paramname{ text-align:left; height:100%; font-size:16px; font-family: Helvetica; background-color: transparent; user-select:none; float:left; } .layerparamvalue { margin-top: 5px } .paramvalue{ width:30%; text-align:center; height:20px; font-size:16px; font-family: Helvetica; margin-right: 10px; float:right; } .option:hover { background-color: #ccc; } .select-option { width:calc(100% - 20px); text-align: left; border-bottom: 1px solid gray; height:30px; line-height:30px; font-size:18px; font-family: Helvetica; cursor:pointer; padding: 10px 10px 0px 10px; background-color: transparent; user-select:none; &:hover { background-color: #ccc; } } .tab-option { vertical-align: middle; line-height: 70px; width: 50px; height: 70px; text-align: center; float:left; font-size:22px; font-family: Helvetica; cursor:pointer; user-select:none; background-color: #A8A8BD; } .tab-selected { background-color: $color-menu-bg; } .last-dropdown { border-bottom: 0px; } .right-option { width:calc(100% - 30px); padding: 10px 0px 0px 10px; margin: 0px 10px 0px 10px; } div.option.selected { background-color: #C4B7D1; } div.top_neighbor_tab-selected { border-bottom-right-radius: 5px; } div.bottom_neighbor_tab-selected { border-top-right-radius: 5px; } .option-dropdown { width:calc(100% - 20px); text-align: left; border-bottom: 1px solid gray; height:30px; line-height:30px; font-size:18px; font-family: Helvetica; cursor:pointer; padding: 10px 10px 0px 10px; background-color: transparent; user-select:none; position: relative; display: inline-block; } .dropdown-content { border-radius: 6px; float: right; display: none; position: fixed; min-width: 160px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1; background-color: $color-menu-bg; border: 1px solid rgba(128, 128, 128, 0.5); } .left { left: 218px; margin-top: -11px; } .option-dropdown:hover .dropdown-content {display: block;} .toggle { width: calc(100% - 10px); height: 30px; line-height: 30px; padding-top: 10px; padding-left:5px; padding-right:5px; } .toggleOption { float:left; width: calc(50% - 10px); text-align: center; height: 100%; cursor: pointer; margin-left: 5px; margin-right: 5px } #middle { position: relative; float: left; width : calc(100% - 430px); height: 100%; } #svg { width: 1000px; height: 100%; background: #e3e3eE; } #networkTab { width: 100%; height: 100%; overflow: hidden; } #progressTab { width: calc(100% - 20px); grid-column-gap: 20px; box-sizing: border-box; padding: 10px; height: calc(100% - 20px); display: grid; grid-template-columns: 1fr 2fr; grid-template-rows: 1fr 1fr; } #visualizationTab { width: 100%; height: 100%; } #images { display: grid; grid-template-columns: repeat(10, 1fr); grid-template-rows: repeat(6, 1fr); width: 100%; height: 100%; } .informationRow { display: flex; } .informationColumn { font-size: 36; cursor: pointer; float: left; width: 49%; padding-top: 2%; padding-bottom: 2%; background-color: rgba(168,168,189,0.85); } .informationBlankColumn { float: left; height: 10%; width: 2%; } .informationColumn:hover { background-color: rgba(168,168,189,0.5); } a.overlayLinks { color: lightblue; } #informationOverlay { position: fixed; padding: 4%; text-align: center; color: $color-menu-bg; font-size: 48; width: 92%; height: 100%; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0,0,0,0.85); cursor: pointer; font-family: Helvetica; z-index: 9999; } #loadingDataTab { position: fixed; padding: 5%; text-align: center; color: $color-menu-bg; font-size: 48; width: 90%; height: 85%; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0,0,0,0.8); cursor: pointer; font-family: Helvetica; z-index: 9999; } #footer { position: fixed; bottom: 0; width: 100%; z-index: 99; margin-left: 48%; } #acknowledgements { text-align: center; font-size: 18; display: inline-block; padding: 3%; cursor: pointer; font-family: Helvetica; } #informationBody { text-align: center; color: $color-menu-bg; font-size: 24; font-family: Helvetica; padding-bottom: 3%; } #educationTab { width: 90%; height: 100%; background: #F1FAFF; padding-left: 5%; padding-right: calc(5% + 200px); padding-top: 3%; overflow-y : auto; } .educationTitle { font-size: 40; text-align: center; padding-top: 30px; padding-bottom: 10px; font-family: Helvetica; font-weight: bolder; } .educationSection { font-size: 30; line-height: 1.7em; font-family: Helvetica; font-weight: bold; } .educationContent { font-size: 18; word-wrap: break-word; line-height: 1.7em; font-family: Helvetica; } .educationVideo { // margin-right: 5%; // object-fit: contain; padding: 20px; width: 40%; height: 34%; display: table; margin: 0 auto; // text-align: left; overflow:hidden !important; } .educationImage { padding-top: 15px; // padding: 20px; // width: 40%; // height: 34%; display: table; margin: 0 auto; // text-align: left; overflow:hidden !important; } .educationAuthor{ font-size: 14; font-family: Helvetica; text-align: center; padding-bottom: 10px; } #error { width: 200px; position: absolute; padding: 20px 5px 5px 5px; bottom: 10px; right: 20px; background-color: #dca7a7; border-style: solid; border-width: 3px; border-color: #555; } #x { position: absolute; top: 0px; right: 0px; cursor: pointer; } #errorMessage { height: 80px; overflow: hidden; text-overflow: ellipsis; } .modelLink { margin: 0 auto; position: relative; text-align: center; padding-bottom: 15px; top: 50%; transform: translateY(-50%); } label { display: inline-block; width: 250px; padding: 6px 0 6px 0; } .canvases { display: inline-block; } #loss-canvas { grid-column: 1; grid-row: 1; } #accuracy-canvas { grid-column: 1; grid-row: 2; } #confusion-matrix-canvas { grid-column: 2 / span 3; grid-row: 1 / span 2; } .prediction-canvas { width: 100%; } .pred { font-size: 1.2vw; line-height: 1.5vw; width: 100%; font-family: Helvetica; text-align: center; } .pred-correct { background-color: #79BD8F; } .pred-none { background-color: #aaa; } .pred-incorrect { background-color: #FF6138 } .pred-container { display: inline-block; margin: 13%; } .selectline { margin-bottom: 10px; } .select { position: relative; display: inline-block; margin-bottom: 0px; width: 50%; margin-right: 10px; float: right; } .select select { display: inline-block; width: 100%; cursor: pointer; padding: 7px 10px; outline: 0; border: 0; border-radius: 0; background: #ccc; color: #000; appearance: none; -webkit-appearance: none; -moz-appearance: none; } .select select::-ms-expand { display: none; } .select select:hover, .select select:focus { color: #000; background: #bbb; } .select select:disabled { opacity: 0.5; pointer-events: none; } .select__arrow { position: absolute; top: 12px; right: 15px; width: 0; height: 0; pointer-events: none; border-style: solid; border-width: 8px 5px 0 5px; border-color: #000 transparent transparent transparent; } .select select:hover ~ .select__arrow, .select select:focus ~ .select__arrow { border-top-color: #000; } .select select:disabled ~ .select__arrow { border-top-color: #000; } .hidden_div { display: none; } ================================================ FILE: src/ui/utils.ts ================================================ export function copyTextToClipboard(text: string): void { // https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript const textArea = document.createElement("textarea"); // // *** This styling is an extra step which is likely not required. *** // // Why is it here? To ensure: // 1. the element is able to have focus and selection. // 2. if element was to flash render it has minimal visual impact. // 3. less flakyness with selection and copying which **might** occur if // the textarea element is not visible. // // The likelihood is the element won't even render, not even a flash, // so some of these are just precautions. However in IE the element // is visible whilst the popup box asking the user for permission for // the web page to copy to the clipboard. // // Place in top-left corner of screen regardless of scroll position. textArea.style.position = "fixed"; textArea.style.top = "0"; textArea.style.left = "0"; // Ensure it has a small width and height. Setting to 1px / 1em // doesn't work as this gives a negative w/h on some browsers. textArea.style.width = "2em"; textArea.style.height = "2em"; // We don't need padding, reducing the size if it does flash render. textArea.style.padding = "0"; // Clean up any borders. textArea.style.border = "none"; textArea.style.outline = "none"; textArea.style.boxShadow = "none"; // Avoid flash of white box if rendered for any reason. textArea.style.background = "transparent"; textArea.value = text; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand("copy"); } finally { document.body.removeChild(textArea); } } export function parseString(s: string): number | number[] { if (s.indexOf(",") === -1) { return Number(s); } s = s.replace("(", "").replace(")", "").replace("[", "").replace("]", ""); return s.split(",").map((x) => Number(x)); } export function getSvgOriginalBoundingBox(svg: SVGSVGElement): {width: number, height: number} { const width = svg.width.baseVal.value; const height = svg.height.baseVal.value; return {width, height}; } ================================================ FILE: src/ui/window.ts ================================================ import { ActivationLayer } from "./shapes/activationlayer"; import { Draggable } from "./shapes/draggable"; import { TextBox } from "./shapes/textbox"; import { Wire } from "./shapes/wire"; import { WireGuide } from "./shapes/wireguide"; export enum Mode { Move, Connect, } class WindowProperties { private static instance: WindowProperties; public selectedElement: Draggable | Wire; public activationLayers: Set = new Set(); public mode: Mode = Mode.Move; public draggedElement: any; public selectState: any; public xClickOffset: any; public yClickOffset: any; public wireInputElement: any; public defaultparambox: any; public wireGuide: WireGuide; public svgTransformRatio: number = 1; public svgYOffset: number = 0; public shapeTextBox: TextBox; private constructor() {} public static get Instance(): WindowProperties { return this.instance || (this.instance = new this()); } } export const windowProperties = WindowProperties.Instance; ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "outDir": "./built", "allowJs": false, "target": "es6", "module": "commonjs", "noUnusedLocals": true, "noUnusedParameters": true, "alwaysStrict": true, "noImplicitReturns": true, "noImplicitAny": true, "moduleResolution": "node", }, "include": [ "./src/**/*", "package.json", ] } ================================================ FILE: tslint.json ================================================ { "defaultSeverity": "error", "extends": [ "tslint:recommended" ], "jsRules": {}, "rules": { "typedef": [true, "call-signature", "parameter", "property-declaration", "member-variable-declaration"], "max-classes-per-file": false, "prefer-const": true, "ban-types": [true, ["Object", "Use {} instead."], ["String"]] }, "rulesDirectory": [] } ================================================ FILE: webpack.config.js ================================================ module.exports = { entry: "./built/ui/app.js", output: { filename: "bundle.js" }, target: 'web', // type: 'javascript/auto', // test: /\.(json)$/, // exclude: /node_modules/, // loader: [ // `file-loader?publicPath=./&name=[name].[ext]` // ], // { // test: /\.(jpg|jpeg|gif|png)$/, // // exclude: /node_modules/, <-- Delete this line // loader: [ // `url-loader?limit=4112&publicPath=./&name=[name].[ext]` // ] // } externals: { // '@tensorflow/tfjs': '@tensorflow/tfjs', // '@tensorflow/tfjs-node': '@tensorflow/tfjs-node', 'canvas': 'canvas' }, module: { rules: [ { type: 'javascript/auto', test: /\.(json)$/, exclude: /node_modules/, use: [ { loader: `file-loader?publicPath=./&name=[name].[ext]` }, // { // loader: 'css-loader', // options: { // modules: true // } // }, // { loader: 'sass-loader' } ] }, { test: /\.(jpg|jpeg|gif|png)$/, // exclude: /node_modules/, loader: [ `url-loader?limit=4112&publicPath=./dist/&name=[name].[ext]` ] }, { type: 'javascript/auto', test: /\.(json)$/, exclude: /node_modules/, loader: [ `file-loader?publicPath=./dist/&name=[name].[ext]` ] }, ] } }