diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index d188ca170..000000000 --- a/.bowerrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "directory": "bower_components", - "interactive": false -} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..bea1ec028 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab +indent_size = 1 diff --git a/.eslintrc b/.eslintrc index f1ebeeb60..7717faed0 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,18 +1,23 @@ { - "globals": { - "angular": false - }, - "plugins": ["angular"], + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "extends": [ + "eslint:recommended", + "plugin:react/recommended" + ], "rules": { - "quotes": 0, - "no-shadow": 0, - "semi": 0, - "global-strict": 0, - "no-unused-vars": 0, - "no-multi-spaces": 0, - "consistent-return": 0, - "dot-notation": 0, - "curly": 0, - "no-undef": 0 + "indent": [ "error", 2 ], + "react/prop-types": [ 2 ], + "no-console": [ "off" ] + }, + "env": { + "browser": true, + "jasmine": true + }, + "globals": { + "module": true, + "inject": true } } diff --git a/.gitignore b/.gitignore index 65bd91a44..e724aca69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ -bower_components/ node_modules/ dist/ .tmp/ .idea *.iml +coverage/ +.sass-cache/ npm-debug.log -src/app/app.version.js +src/app/index.version.js +.vs/ diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 1bded6132..000000000 --- a/.jshintrc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "globalstrict": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 4, - "latedef": false, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, - "white": true, - "validthis": true, - "globals": { - "angular": false, - // Angular Mocks - "inject": false, - "module": false, - // JASMINE - "describe": false, - "it": false, - "before": false, - "beforeEach": false, - "after": false, - "afterEach": false, - "expect": false - } -} diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..5816526f9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +8.15.1 diff --git a/.travis.yml b/.travis.yml index 8fbe60f85..82c059ef1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,14 @@ language: node_js node_js: - - "0.11" - - "0.10" -before_script: - - npm install -g gulp - - npm install -g bower - - bower install -script: gulp + - "8.11.3" +script: + - npm run test + - npm run build +after_script: + - ./scripts/pushToDockerhub.sh +services: + - docker +env: + global: + - secure: "VBGA/BGX7MPQ+h0OyAssRvIpyMN4rWk8CyBxvL1mgw43iLZYEo6PYEGtXWnMBxgh9NMT5oymkU6PsvRfVbCbpAIdJHGe7fbM1xK7wRd8OS6VpRJWFcwVeyE56qat+I/KSnYrQ4eJTZ6Ii3h3otoDRfW5RLrw2VHRZ+//Hr6sgVY=" + - secure: "FDsSnzJEwnYJ6OQEA8MuxFuWMAcAI6pR6hRCWIpSzDK1gk2xx3tG0m39WijAUiLmUF8GxrpB1h0dmXpvbG1OHNLC97m273Qr8jAXIzHU3HqJ0BhL4sT+gPIDYf2stbYTZMieGQM8yC/OQWIckpJThEqtoGWHSJAzmQyEJmNbidg=" diff --git a/.yo-rc.json b/.yo-rc.json index 0f804cb3b..285da1d61 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -2,13 +2,13 @@ "generator-gulp-angular": { "version": "0.11.0", "props": { - "angularVersion": "~1.3.4", + "angularVersion": "~1.4.10", "angularModules": [], "jQuery": { "key": "jquery2" }, "resource": { - "key": "none", + "key": "$http", "module": null }, "router": { @@ -17,24 +17,23 @@ }, "ui": { "key": "bootstrap", - "module": null, - "name": "bootstrap" + "module": null }, "bootstrapComponents": { "key": "official", "module": null }, "cssPreprocessor": { - "key": "none", + "key": "noCssPrepro", "extension": "css" }, "jsPreprocessor": { - "key": "none", + "key": "noJsPrepro", "extension": "js", "srcExtension": "js" }, "htmlPreprocessor": { - "key": "none", + "key": "noHtmlPrepro", "extension": "html" }, "foundationComponents": { @@ -51,4 +50,4 @@ } } } -} \ No newline at end of file +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d373f193..bd24ca284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,20 +3,16 @@ All notable changes to this project will be documented in this file. ## [Unreleased][unreleased] -## [1.0.1] - 2015-04-27 -### Changed -- Completely refactored project structure -- Broken down data models, metrics, charts and services into multiple files -- More features included in the Gulpfile -- Clean eslint -- Todd Motto's AngularJS styleguide -- Improved filters -- Batch _indom requests -- Improved paint time +## [1.2] - 2018-02-07 -### Fixed -- Fix typos in recent README changes. -- Update outdated unreleased diff link. +### Features -[unreleased]: https://github.com/Netflix/vector/compare/v1.0.1...HEAD -[1.0.1]: https://github.com/Netflix/vector/compare/v1.0.0...v1.0.1 +- Ad-Hoc Metric Widget +- New Flame Graph Widgets + +### Fixes + +- Container widget name filter bug + +[unreleased]: https://github.com/Netflix/vector/compare/v1.2.0...HEAD +[1.2]: https://github.com/Netflix/vector/compare/v1.1.2...v1.2.0 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..4019f08a8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +# Copyright 2016 Netflix, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM node:8-alpine as nodebuilder + +RUN apk add --update git + +COPY . src/ +WORKDIR /src +RUN npm install +RUN npm run build-prod + +######################### + +FROM alpine:latest + +RUN mkdir -p /usr/share/nginx/html +COPY --from=nodebuilder /src/dist /usr/share/nginx/html +RUN apk add --update curl && \ + curl --silent --show-error --fail --location \ + --header "Accept: application/tar+gzip, application/x-gzip, application/octet-stream" -o - \ + "https://caddyserver.com/download/linux/amd64?license=personal" \ + | tar --no-same-owner -C /usr/bin/ -xz caddy && \ + chmod 0755 /usr/bin/caddy && \ + /usr/bin/caddy -version && \ + apk del curl && \ + rm -rf /root/.cache /root/.config /root/.local /root/.ash_history \ + /usr/share/man /var/cache/apk/* + +EXPOSE 80 +CMD ["/usr/bin/caddy", "-root", "/usr/share/nginx/html", "-port", "80"] +VOLUME ["/usr/share/nginx/html"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..2f8fce089 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "{}" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright 2016 Netflix Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/OSSMETADATA b/OSSMETADATA new file mode 100644 index 000000000..b96d4a4df --- /dev/null +++ b/OSSMETADATA @@ -0,0 +1 @@ +osslifecycle=active diff --git a/README.md b/README.md index f22815f78..b2bcbedb4 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,86 @@ ![Vector](vector.png) -Vector is an open source on-host performance monitoring framework which exposes hand picked high resolution system and application metrics to every engineer’s browser. Having the right metrics available on-demand and at a high resolution is key to understand how a system behaves and correctly troubleshoot performance issues. +## Project Status + +https://groups.google.com/d/msg/vector-users/MWF8nnj1WHw/1EelNPOBAwAJ + +> Today we are sharing with the community that we have contributed our latest developments in this space to the PCP project and are retiring Vector as a standalone web application. Specifically, we have contributed a data source for Grafana as well as some template dashboards that we use internally. This has been picked up by the PCP team and wrapped into a formal product. This splits what Vector is and how it is used into two pieces. The bulk of the monitoring moves into a more familiar stack with Grafana, which also includes the components to collect and display performance data including BCC-based flame graphs. Additional Netflix-specific flame-graphs and related functionality has been pulled into a new internal tool called FlameCommander. +> +> We have decided to lean into the Grafana stack. Grafana is widely used, well supported, and has an extensible framework for developing visualisations and including new sources of data for processing. +> +> +> Specifically in terms of the community around Vector, we will transition it as follows: +> +> - Code will remain up and online in Github. Issues and support will be best effort. +> - The vector slack and mailing lists will disappear over time. We encourage users to move across to the PCP support channels listed at https://pcp.io/community.html. +> - For slack, you’ll want to be sure to hop in to the #grafana channel on the PCP slack. +> - Vector.io will stay up for a period and then be decommissioned. -## Disclaimer -This is the first release of Vector. As such, expect to find bugs and issues. We count on your support to find and report them! -Vector is under constant development and new versions should be released often. **Use the stable branch for a stable version**. +[![License](https://img.shields.io/github/license/Netflix/vector.svg)](http://www.apache.org/licenses/LICENSE-2.0) + + +Vector is an open source on-host performance monitoring framework which exposes hand picked high resolution system and application metrics to every engineer’s browser. Having the right metrics available on-demand and at a high resolution is key to understand how a system behaves and correctly troubleshoot performance issues. ## Getting Started -See the [GitHub Wiki](https://github.com/Netflix/vector/wiki/Getting-Started) for documentation on how to get started. +See the [Getting Started Guide](http://getvector.io/docs/getting-started.html) for documentation on how to get started. + +## Developing + +Specific configuration for your environment can be set up at the following locations: +``` +src/config.js # app-wide configuration +src/charts/* # set up chart widgets +src/bundles/* # configure the high level groups +help/* # and the help panels for the charts +``` + +After you are set up, standard npm package.json commands can be used: +``` +nvm use +npm install +npm run build +npm run serve +``` + +At a high level, the remaining directories contain: +``` +src/components/* # all of the React components that compose the page +src/components/Pollers/* # the React components that talk to the PCP backend +processors/* # pcp to graph data fetch and transform components +``` ## Issues For bugs, questions and discussions please use the [GitHub Issues](https://github.com/Netflix/vector/issues). -## User Group +## Questions + +Join Vector on [Slack](https://vectoross.slack.com/) for support and discussion. If you don't have an invite yet, [request one](http://slack.getvector.io/) now! + +You can also ask questions to other Vector users and contributors on [Google Groups](https://groups.google.com/forum/#!forum/vector-users) or [Stack Overflow](http://stackoverflow.com/questions/tagged/vectoross). + +## Versioning + +For transparency and insight into our release cycle, and for striving to maintain backward compatibility, Vector will be maintained under the Semantic Versioning guidelines as much as possible. + +Releases will be numbered with the following format: + +`..` + +And constructed with the following guidelines: + +* Breaking backward compatibility bumps the major (and resets the minor and patch) +* New additions without breaking backward compatibility bumps the minor (and resets the patch) +* Bug fixes and misc changes bumps the patch -You can ask questions to other Vector users and contributors on [Google Groups](https://groups.google.com/forum/#!forum/vector-users). +For more information on SemVer, please visit [http://semver.org/](http://semver.org/). ## License -Copyright 2015 Netflix, Inc. +Copyright 2016 Netflix, Inc. Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/bower.json b/bower.json deleted file mode 100644 index fef1120a6..000000000 --- a/bower.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "vector", - "version": "1.0.2", - "authors": [ - "Martin Spier " - ], - "main": "index.html", - "license": "Apache License, v2.0", - "homepage": "https://github.com/Netflix/Vector", - "private": true, - "dependencies": { - "angular-flash": "0.1.14", - "d3": "3.5.3", - "nvd3": "https://github.com/novus/nvd3.git#master", - "angular-ui-dashboard": "1.0.1", - "font-awesome": "4.3.0", - "bootstrap": "3.3.2", - "angular-route": "1.3.17", - "angular-ui-bootstrap-bower": "0.12.1" - }, - "devDependencies": { - "angular-mocks": "1.3.17" - }, - "resolutions": { - "angular": "1.3.17" - } -} diff --git a/bs-config.json b/bs-config.json new file mode 100644 index 000000000..d36ebf02f --- /dev/null +++ b/bs-config.json @@ -0,0 +1,11 @@ +{ + "server": { + "baseDir": "./dist" + }, + "watchOptions": { + "ignored": [ + "node_modules", + "src" + ] + } +} diff --git a/e2e/.eslintrc b/e2e/.eslintrc new file mode 100644 index 000000000..d2c6f97f7 --- /dev/null +++ b/e2e/.eslintrc @@ -0,0 +1,9 @@ +{ + "globals": { + "browser": false, + "element": false, + "by": false, + "$": false, + "$$": false + } +} diff --git a/e2e/README.md b/e2e/README.md deleted file mode 100644 index 84081f648..000000000 --- a/e2e/README.md +++ /dev/null @@ -1,25 +0,0 @@ -#End 2 End Testing (Protractor) -To run the end-2-end tests against the application you use [Protractor](https://github.com/angular/protractor). - -## Starting the Web Server -In either case you will need the application to be running via the web-server. -From the root folder of the repository run: - -``` -npm start -``` - -The application should now be available at `http://localhost:8000/app/index.html` - -## Testing with Protractor - -As a one-time setup, download webdriver. -``` -npm run update-webdriver -``` - -Start the Protractor test runner using the e2e configuration: - -``` -npm run protractor -``` diff --git a/e2e/main.po.js b/e2e/main.po.js new file mode 100644 index 000000000..0f0428cb4 --- /dev/null +++ b/e2e/main.po.js @@ -0,0 +1,15 @@ +/** + * This file uses the Page Object pattern to define the main page for tests + * https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ + */ + +'use strict'; + +var MainPage = function() { + this.jumbEl = element(by.css('.jumbotron')); + this.h1El = this.jumbEl.element(by.css('h1')); + this.imgEl = this.jumbEl.element(by.css('img')); + this.thumbnailEls = element(by.css('body')).all(by.repeater('awesomeThing in main.awesomeThings')); +}; + +module.exports = new MainPage(); diff --git a/e2e/scenarios.js b/e2e/scenarios.js deleted file mode 100644 index 352570a5d..000000000 --- a/e2e/scenarios.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ diff --git a/gulp/.jshintrc b/gulp/.jshintrc deleted file mode 100644 index 072135c8b..000000000 --- a/gulp/.jshintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../.jshintrc", - "node": true -} diff --git a/gulp/build.js b/gulp/build.js deleted file mode 100644 index dc6482147..000000000 --- a/gulp/build.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); - -var $ = require('gulp-load-plugins')({ - pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del'] -}); - -module.exports = function(options) { - gulp.task('partials', function () { - return gulp.src([ - options.src + '/app/**/*.html', - options.tmp + '/serve/app/**/*.html' - ]) - .pipe($.minifyHtml({ - empty: true, - spare: true, - quotes: true - })) - .pipe($.angularTemplatecache('templateCacheHtml.js', { - module: 'app', - root: 'app' - })) - .pipe(gulp.dest(options.tmp + '/partials/')); - }); - - gulp.task('html', ['inject', 'partials'], function () { - var partialsInjectFile = gulp.src(options.tmp + '/partials/templateCacheHtml.js', { read: false }); - var partialsInjectOptions = { - starttag: '', - ignorePath: options.tmp + '/partials', - addRootSlash: false - }; - - var htmlFilter = $.filter('*.html'); - var jsFilter = $.filter('**/*.js'); - var cssFilter = $.filter('**/*.css'); - var assets; - - return gulp.src(options.tmp + '/serve/*.html') - .pipe($.inject(partialsInjectFile, partialsInjectOptions)) - .pipe(assets = $.useref.assets()) - .pipe($.rev()) - .pipe(jsFilter) - .pipe($.ngAnnotate()) - .pipe($.uglify({ preserveComments: $.uglifySaveLicense })).on('error', options.errorHandler('Uglify')) - .pipe(jsFilter.restore()) - .pipe(cssFilter) - .pipe($.csso()) - .pipe(cssFilter.restore()) - .pipe(assets.restore()) - .pipe($.useref()) - .pipe($.revReplace()) - .pipe(htmlFilter) - .pipe($.minifyHtml({ - empty: true, - spare: true, - quotes: true, - conditionals: true - })) - .pipe(htmlFilter.restore()) - .pipe(gulp.dest(options.dist + '/')) - .pipe($.size({ title: options.dist + '/', showFiles: true })); - }); - - // Only applies for fonts from bower dependencies - // Custom fonts are handled by the "other" task - gulp.task('fonts', function () { - return gulp.src($.mainBowerFiles()) - .pipe($.filter('**/*.{eot,svg,ttf,woff,woff2}')) - .pipe($.flatten()) - .pipe(gulp.dest(options.dist + '/fonts/')); - }); - - gulp.task('other', function () { - return gulp.src([ - options.src + '/**/*', - '!' + options.src + '/**/*.{html,css,js}' - ]) - .pipe(gulp.dest(options.dist + '/')); - }); - - gulp.task('clean', function (done) { - $.del([options.dist + '/', options.tmp + '/'], done); - }); - - gulp.task('build', ['html', 'fonts', 'other']); -}; diff --git a/gulp/e2e-tests.js b/gulp/e2e-tests.js deleted file mode 100644 index eca36ec3d..000000000 --- a/gulp/e2e-tests.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); - -var $ = require('gulp-load-plugins')(); - -var browserSync = require('browser-sync'); - -module.exports = function(options) { - // Downloads the selenium webdriver - gulp.task('webdriver-update', $.protractor.webdriver_update); - - gulp.task('webdriver-standalone', $.protractor.webdriver_standalone); - - function runProtractor (done) { - - gulp.src(options.e2e + '/**/*.js') - .pipe($.protractor.protractor({ - configFile: 'protractor.conf.js' - })) - .on('error', function (err) { - // Make sure failed tests cause gulp to exit non-zero - throw err; - }) - .on('end', function () { - // Close browser sync server - browserSync.exit(); - done(); - }); - } - - gulp.task('protractor', ['protractor:src']); - gulp.task('protractor:src', ['serve:e2e', 'webdriver-update'], runProtractor); - gulp.task('protractor:dist', ['serve:e2e-dist', 'webdriver-update'], runProtractor); -}; diff --git a/gulp/inject.js b/gulp/inject.js deleted file mode 100644 index 67993d377..000000000 --- a/gulp/inject.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); - -var $ = require('gulp-load-plugins')(); - -var wiredep = require('wiredep').stream; - -module.exports = function(options) { - gulp.task('inject', ['scripts'], function () { - var injectStyles = gulp.src([ - options.src + '/app/**/*.css' - ], { read: false }); - - var injectScripts = gulp.src([ - options.src + '/app/**/*.js', - '!' + options.src + '/app/**/*.spec.js', - '!' + options.src + '/app/**/*.mock.js' - ]) - .pipe($.angularFilesort()).on('error', options.errorHandler('AngularFilesort')); - - var injectOptions = { - ignorePath: [options.src, options.tmp + '/serve'], - addRootSlash: false - }; - - return gulp.src(options.src + '/*.html') - .pipe($.inject(injectStyles, injectOptions)) - .pipe($.inject(injectScripts, injectOptions)) - .pipe(wiredep(options.wiredep)) - .pipe(gulp.dest(options.tmp + '/serve')); - - }); -}; diff --git a/gulp/proxy.js b/gulp/proxy.js deleted file mode 100644 index f2382d1e2..000000000 --- a/gulp/proxy.js +++ /dev/null @@ -1,67 +0,0 @@ - /*jshint unused:false */ - -/*************** - - This file allow to configure a proxy system plugged into BrowserSync - in order to redirect backend requests while still serving and watching - files from the web project - - IMPORTANT: The proxy is disabled by default. - - If you want to enable it, watch at the configuration options and finally - change the `module.exports` at the end of the file - -***************/ - -'use strict'; - -var httpProxy = require('http-proxy'); -var chalk = require('chalk'); - -/* - * Location of your backend server - */ -var proxyTarget = 'http://server/context/'; - -var proxy = httpProxy.createProxyServer({ - target: proxyTarget -}); - -proxy.on('error', function(error, req, res) { - res.writeHead(500, { - 'Content-Type': 'text/plain' - }); - - console.error(chalk.red('[Proxy]'), error); -}); - -/* - * The proxy middleware is an Express middleware added to BrowserSync to - * handle backend request and proxy them to your backend. - */ -function proxyMiddleware(req, res, next) { - /* - * This test is the switch of each request to determine if the request is - * for a static file to be handled by BrowserSync or a backend request to proxy. - * - * The existing test is a standard check on the files extensions but it may fail - * for your needs. If you can, you could also check on a context in the url which - * may be more reliable but can't be generic. - */ - if (/\.(html|css|js|png|jpg|jpeg|gif|ico|xml|rss|txt|eot|svg|ttf|woff|woff2|cur)(\?((r|v|rel|rev)=[\-\.\w]*)?)?$/.test(req.url)) { - next(); - } else { - proxy.web(req, res); - } -} - -/* - * This is where you activate or not your proxy. - * - * The first line activate if and the second one ignored it - */ - -//module.exports = [proxyMiddleware]; -module.exports = function() { - return []; -}; diff --git a/gulp/scripts.js b/gulp/scripts.js deleted file mode 100644 index 8c5e6081d..000000000 --- a/gulp/scripts.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var browserSync = require('browser-sync'); - -var $ = require('gulp-load-plugins')(); - -module.exports = function(options) { - gulp.task('scripts', ['version'], function () { - return gulp.src(options.src + '/app/**/*.js') - .pipe($.jshint()) - .pipe($.jshint.reporter('jshint-stylish')) - .pipe(browserSync.reload({ stream: true })) - .pipe($.size()); - }); -}; diff --git a/gulp/server.js b/gulp/server.js deleted file mode 100644 index aba7fae47..000000000 --- a/gulp/server.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var browserSync = require('browser-sync'); -var browserSyncSpa = require('browser-sync-spa'); - -var util = require('util'); - -var middleware = require('./proxy'); - -module.exports = function(options) { - - function browserSyncInit(baseDir, browser) { - browser = browser === undefined ? 'default' : browser; - - var routes = null; - if(baseDir === options.src || (util.isArray(baseDir) && baseDir.indexOf(options.src) !== -1)) { - routes = { - '/bower_components': 'bower_components' - }; - } - - var server = { - baseDir: baseDir, - routes: routes - }; - - if(middleware.length > 0) { - server.middleware = middleware; - } - - browserSync.instance = browserSync.init({ - startPath: '/', - server: server, - browser: browser - }); - } - - browserSync.use(browserSyncSpa({ - selector: '[ng-app]'// Only needed for angular apps - })); - - gulp.task('serve', ['watch'], function () { - browserSyncInit([options.tmp + '/serve', options.src]); - }); - - gulp.task('serve:dist', ['build'], function () { - browserSyncInit(options.dist); - }); - - gulp.task('serve:e2e', ['inject'], function () { - browserSyncInit([options.tmp + '/serve', options.src], []); - }); - - gulp.task('serve:e2e-dist', ['build'], function () { - browserSyncInit(options.dist, []); - }); -}; diff --git a/gulp/unit-tests.js b/gulp/unit-tests.js deleted file mode 100644 index 6d751f73c..000000000 --- a/gulp/unit-tests.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); - -var $ = require('gulp-load-plugins')(); - -var wiredep = require('wiredep'); -var karma = require('karma'); -var concat = require('concat-stream'); -var _ = require('lodash'); - -module.exports = function(options) { - function listFiles(callback) { - var wiredepOptions = _.extend({}, options.wiredep, { - dependencies: true, - devDependencies: true - }); - var bowerDeps = wiredep(wiredepOptions); - - var specFiles = [ - options.src + '/**/*.spec.js', - options.src + '/**/*.mock.js' - ]; - - var htmlFiles = [ - options.src + '/**/*.html' - ]; - - var srcFiles = [ - options.src + '/app/**/*.js' - ].concat(specFiles.map(function(file) { - return '!' + file; - })); - - - gulp.src(srcFiles) - .pipe(concat(function(files) { - callback(bowerDeps.js - .concat(_.pluck(files, 'path')) - .concat(htmlFiles) - .concat(specFiles)); - })); - } - - function runTests (singleRun, done) { - listFiles(function(files) { - karma.server.start({ - configFile: __dirname + '/../karma.conf.js', - files: files, - singleRun: singleRun, - autoWatch: !singleRun - }, done); - }); - } - - gulp.task('test', ['scripts'], function(done) { - runTests(true, done); - }); - gulp.task('test:auto', ['watch'], function(done) { - runTests(false, done); - }); -}; diff --git a/gulp/watch.js b/gulp/watch.js deleted file mode 100644 index bac10f3f7..000000000 --- a/gulp/watch.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var browserSync = require('browser-sync'); - -function isOnlyChange(event) { - return event.type === 'changed'; -} - -module.exports = function(options) { - gulp.task('watch', ['inject'], function () { - - gulp.watch([options.src + '/*.html', 'bower.json'], ['inject']); - - gulp.watch(options.src + '/app/**/*.css', function(event) { - if(isOnlyChange(event)) { - browserSync.reload(event.path); - } else { - gulp.start('inject'); - } - }); - - gulp.watch(options.src + '/app/**/*.js', function(event) { - if(isOnlyChange(event)) { - gulp.start('scripts'); - } else { - gulp.start('inject'); - } - }); - - gulp.watch(options.src + '/app/**/*.html', function(event) { - browserSync.reload(event.path); - }); - }); -}; diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 1e844ace8..000000000 --- a/gulpfile.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var gutil = require('gulp-util'); -var wrench = require('wrench'); -var eslint = require('gulp-eslint'); -var git = require('gulp-git'); -var fs = require('fs'); - -var options = { - src: 'src', - dist: 'dist', - tmp: '.tmp', - e2e: 'e2e', - errorHandler: function(title) { - return function(err) { - gutil.log(gutil.colors.red('[' + title + ']'), err.toString()); - this.emit('end'); - }; - }, - wiredep: { - directory: 'bower_components' - } -}; - -wrench.readdirSyncRecursive('./gulp').filter(function(file) { - return (/\.(js|coffee)$/i).test(file); -}).map(function(file) { - require('./gulp/' + file)(options); -}); - -gulp.task('version', function () { - git.exec({args : 'describe'}, function (err, stdout) { - if (err) throw err; - fs.writeFile('src/app/app.version.js','(function () { \'use strict\'; angular.module(\'vector.version\').constant(\'vectorVersion\', { \'id\': \'{version}\' }); })();'.replace('{version}', stdout.substring(0, stdout.length - 1))); - }); -}); - -gulp.task('default', ['clean'], function () { - gulp.start('build'); -}); - -gulp.task('eslint', function() { - gulp - .src(['src/app/**/*.js']) - .pipe(eslint()) - // .pipe(eslint.format()) - .pipe(eslint.formatEach('stylish', process.stderr)) - ; -}); diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 59c334da7..000000000 --- a/karma.conf.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -module.exports = function(config) { - - var configuration = { - autoWatch : false, - - frameworks: ['jasmine'], - - ngHtml2JsPreprocessor: { - stripPrefix: 'src/', - moduleName: 'gulpAngular' - }, - - browsers : ['PhantomJS'], - - plugins : [ - 'karma-phantomjs-launcher', - 'karma-jasmine', - 'karma-ng-html2js-preprocessor' - ], - - preprocessors: { - 'src/**/*.html': ['ng-html2js'] - } - }; - - // This block is needed to execute Chrome on Travis - // If you ever plan to use Chrome and Travis, you can keep it - // If not, you can safely remove it - // https://github.com/karma-runner/karma/issues/1144#issuecomment-53633076 - if(configuration.browsers[0] === 'Chrome' && process.env.TRAVIS) { - configuration.customLaunchers = { - 'chrome-travis-ci': { - base: 'Chrome', - flags: ['--no-sandbox'] - } - }; - configuration.browsers = ['chrome-travis-ci']; - } - - config.set(configuration); -}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..1dc270d20 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15525 @@ +{ + "name": "vector", + "version": "2.0.0-beta1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + } + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.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.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/polyfill": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", + "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + } + } + }, + "@jest/core": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", + "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.8.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "jest-watcher": "^24.8.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.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==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "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": "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" + } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/fake-timers": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", + "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/reporters": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", + "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", + "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0" + } + }, + "@jest/transform": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", + "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.8.0", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + } + } + }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, + "@mapbox/polylabel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/polylabel/-/polylabel-1.0.2.tgz", + "integrity": "sha1-xXFGGbZa3QgmOOoGAn5psUUA76Y=", + "requires": { + "tinyqueue": "^1.1.0" + } + }, + "@types/babel__core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", + "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/d3-selection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.0.10.tgz", + "integrity": "sha1-3PsN3837GtJq6kNRMjdx4a6pboQ=" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.0.16", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.16.tgz", + "integrity": "sha512-JrAiyV+PPGKZzw6uxbI761cHZ0G7QMOHXPhtSpcl08rZH6CswXaaejckn3goFKmF7M3nzEoJ0lwYCbqLMmjziQ==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", + "dev": true + }, + "@types/node": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-globals": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "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==", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "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 + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-eslint": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.5.tgz", + "integrity": "sha512-TcdEGCHHquOPQOlH6Fe6MLwPWWWJLdeKhcGoLfOTShETpoH8XYWhjWJw38KCKaTca7c/EdxLolnbakixKxnXDg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "~3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "babel-jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "dev": true, + "requires": { + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + } + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } + } + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "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=", + "dev": true, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "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": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "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, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "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": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "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=", + "dev": true, + "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": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30000987", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000987.tgz", + "integrity": "sha512-O3VrjtRMTxoU5Cn5/QSmXeIR1gkVps4j9jqfIm4FLaQ5JzqBlVjMUG1xWnoYFv8N+H3Lp++aa05TekyIbjHL7g==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.206.tgz", + "integrity": "sha512-djq9Ehxs2rwPh7pyY1GMf8vkOWPoK8eoMp913E4t0UaEXvbnOsiSowBBHI8YoN4aKVQJjvxQp5I0LdZkT3Uzmw==", + "dev": true + } + } + }, + "bser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "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=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "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": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } + }, + "color-hash": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color-hash/-/color-hash-1.0.3.tgz", + "integrity": "sha1-wOeVLwbQIuVI5l2iOVEr1n04Ce4=" + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "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=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-js-compat": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", + "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", + "dev": true, + "requires": { + "browserslist": "^4.6.2", + "core-js-pure": "3.1.4", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", + "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==", + "dev": true + }, + "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": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "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": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "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": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "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==", + "dev": true, + "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": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "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-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "icss-utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", + "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "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==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-bboxCollide": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-bboxCollide/-/d3-bboxCollide-1.0.4.tgz", + "integrity": "sha512-Sc8FKGGeejlowLW1g/0WBrVcbd++SBRW4N8OuZhVeRAfwlTL96+75JKlFfHweYdYRui1zPabfNXZrNaphBjS+w==", + "requires": { + "d3-quadtree": "1.0.1" + } + }, + "d3-brush": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", + "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", + "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": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.0.tgz", + "integrity": "sha512-dmL9Zr/v39aSSMnLOTd58in2RbregCg4UtGyUArvEKTTN6S3HKEy+ziBWVYo9PTzRyVW+pUBHUtRKz0HYX+SQg==" + }, + "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" + } + }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-ease": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", + "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" + }, + "d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.0.tgz", + "integrity": "sha512-ycfLEIzHVZC3rOvuBOKVyQXSiUyCDjeAPIj9n/wugrr+s5AcTQC2Bz6aKkubG7rQaQF0SGW/OV4UEJB9nfioFg==" + }, + "d3-glyphedge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-glyphedge/-/d3-glyphedge-1.2.0.tgz", + "integrity": "sha512-F49fyMXMLYDHvqvxSmuGZrtIWeWLZWxar82WL1CJDBDPk4z6GUGSG4wX7rdv7N7R/YazAyMMnpOL0YQcmTLlOQ==" + }, + "d3-hexbin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", + "integrity": "sha1-nFg32s/UcasFM3qeke8Qv8T5iDE=" + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "d3-interpolate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", + "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-quadtree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.1.tgz", + "integrity": "sha1-E74CViTxEEBe1DU2xQaq7Bme1ZE=" + }, + "d3-sankey-circular": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.25.0.tgz", + "integrity": "sha512-maYak22afBAvmybeaopd1cVUNTIroEHhWCmh19gEQ+qgOhBkTav8YeP3Uw4OV/K4OksWaQrhhBOE4Rcxgc2JbQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0" + } + }, + "d3-scale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.0.tgz", + "integrity": "sha512-Bb2N3ZgzPdKVEoWGkt8lPV6R7YdpSBWI70Xf26NQHOVjs77a6gLUmBOOPt9d9nB8JiQhwXY1RHCa+eSyWCJZIQ==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + }, + "d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", + "requires": { + "d3-path": "1" + } + }, + "d3-svg-legend": { + "version": "2.25.6", + "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-2.25.6.tgz", + "integrity": "sha1-jY3BvWk8N47ki2+CPook5o8uGtI=", + "requires": { + "@types/d3-selection": "1.0.10", + "d3-array": "1.0.1", + "d3-dispatch": "1.0.1", + "d3-format": "1.0.2", + "d3-scale": "1.0.3", + "d3-selection": "1.0.2", + "d3-transition": "1.0.3" + }, + "dependencies": { + "d3-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.0.1.tgz", + "integrity": "sha1-N1wCh0/NlsFu2fG89bSnvlPzWOc=" + }, + "d3-dispatch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.1.tgz", + "integrity": "sha1-S9ZaQ87P9DGN653yRVKqi/KBqEA=" + }, + "d3-format": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.0.2.tgz", + "integrity": "sha1-E4YYMgtLvrQ7XA/zBRkHn7vXN14=" + }, + "d3-scale": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.3.tgz", + "integrity": "sha1-T56PDMLqDzkl/wSsJ63AkEX6TJA=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.0.2.tgz", + "integrity": "sha1-rmYq/UcCrJxdoDmyEHoXZPockHA=" + }, + "d3-transition": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.0.3.tgz", + "integrity": "sha1-kdyYa92zCXNjkyCoXbcs5KsaJ7s=", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-timer": "1" + } + } + } + }, + "d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + }, + "d3-transition": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.3.tgz", + "integrity": "sha512-tEvo3qOXL6pZ1EzcXxFcPNxC/Ygivu5NoBY6mbzidATAeML86da+JfVIUzon3dNM6UX6zjDx+xbYDmMVtTSjuA==", + "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==" + }, + "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" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "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=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "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": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "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==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.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" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "enzyme": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.9.0.tgz", + "integrity": "sha512-JqxI2BRFHbmiP7/UFqvsjxTirWoM1HfeaJrmVSZ9a1EADKkZgdPcAuISPMpoUiHlac9J4dYt81MC5BBIrbJGMg==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "html-element-map": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-regex": "^1.0.4", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.1.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", + "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.3.0", + "lodash": "^4.17.4", + "object.assign": "^4.0.4", + "object.values": "^1.0.4", + "prop-types": "^15.6.0", + "react-reconciler": "^0.7.0", + "react-test-renderer": "^16.0.0-0" + } + }, + "enzyme-adapter-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", + "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", + "dev": true, + "requires": { + "object.assign": "^4.1.0", + "prop-types": "^15.6.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "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" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "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=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "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" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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==", + "dev": true, + "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": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "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==", + "dev": true + }, + "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" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.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" + } + } + } + }, + "eslint-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.0.0.tgz", + "integrity": "sha512-VxxGDI4bXzLk0+/jMt/0EkGMRKS9ox6Czx+yapMb9WJmcS/ZHhlhqcVUNgUjFBNp02j/2pZLdGOrG7EXyjoz/g==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-react": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz", + "integrity": "sha512-18rzWn4AtbSUxFKKM7aCVcj5LXOhOKdwBino3KKWy4psxfPW0YtIbE8WNRDUdyHFL50BeLb6qFd4vpvNYyp7hw==", + "dev": true, + "requires": { + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "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==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expect": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.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" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "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": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "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": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "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" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "font-awesome": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.6.1.tgz", + "integrity": "sha1-VHJl+0xFu+2Qq4vE93qXs3uFKhI=" + }, + "font-awesome-webpack-4": { + "version": "git+https://github.com/tapz/font-awesome-webpack.git#da547ed91064b408500131f837f17f423ce89411", + "from": "git+https://github.com/tapz/font-awesome-webpack.git#da547ed91064b408500131f837f17f423ce89411", + "requires": { + "css-loader": "~1.0.0", + "less-loader": "~4.1.0", + "style-loader": "~0.22.1" + }, + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "style-loader": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.22.1.tgz", + "integrity": "sha512-WXUrLeinPIR1Oat3PfCDro7qTniwNTJqGqv1KcQiL3JR5PzrVLTyNsd9wTsPXG/qNCJ7lzR2NY/QDjFsP7nuSQ==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "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=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.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=", + "dev": true, + "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=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": 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.3", + "bundled": true, + "dev": 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, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": 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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": 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, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": 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, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": 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.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": 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, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", + "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "is-callable": "^1.1.3" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "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" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": 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" + } + }, + "global-modules-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz", + "integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "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=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-element-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.0.1.tgz", + "integrity": "sha512-BZSfdEm6n706/lBfXKWa4frZRZcT5k1cOusw95ijZsHlI+GdgY0v95h6IzO3iIDf2ROwq570YTwqNPqHcNMozw==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.18.tgz", + "integrity": "sha512-sczoq/9zeXiKZMj8tsQzHJE7EyjrpMHvblTLuh9o8h5923a6Ts5uQ/3YdY+xIqJYRjzHQPlrHjfjh0BtwPJG0g==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.16.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-server-spa": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/http-server-spa/-/http-server-spa-1.3.0.tgz", + "integrity": "sha512-NfXBksDzoiBOo1IrMDtxpKJ8FOHLqy0YdijYjqMoRcS7AWPf6MzhRvKe2KiXxENlqTRqkOH418SvbxC6GzG2TA==", + "requires": { + "mime": "^1.3.4" + } + }, + "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=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "^6.0.1" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.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=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "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": "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" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "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": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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=", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.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-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "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-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "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=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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" + } + }, + "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 + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": 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" + } + }, + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.8.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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "jest-cli": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "dev": true, + "requires": { + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.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" + } + } + } + }, + "jest-changed-files": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.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" + } + } + } + }, + "jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.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" + } + } + } + }, + "jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.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" + } + } + } + }, + "jest-environment-jsdom": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" + } + }, + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true + }, + "jest-haste-map": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", + "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + } + } + }, + "jest-jasmine2": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "jest-leak-detector": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "dev": true, + "requires": { + "pretty-format": "^24.8.0" + } + }, + "jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.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" + } + } + } + }, + "jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "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" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + } + } + }, + "jest-mock": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "dev": true + }, + "jest-resolve": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.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" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" + } + }, + "jest-runner": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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" + } + } + } + }, + "jest-runtime": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" + }, + "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" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": 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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + } + } + }, + "jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "dev": true + }, + "jest-snapshot": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.8.0", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + } + } + }, + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.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" + } + } + } + }, + "jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.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" + } + } + } + }, + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "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": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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 + }, + "json2csv": { + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-3.11.5.tgz", + "integrity": "sha512-ORsw84BuRKMLxfI+HFZuvxRDnsJps53D5fIGr6tLn4ZY+ymcG8XU00E+JJ2wfAiHx5w2QRNmOLE8xHiGAeSfuQ==", + "requires": { + "cli-table": "^0.3.1", + "commander": "^2.8.1", + "debug": "^3.1.0", + "flat": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.0", + "lodash.set": "^4.3.0", + "lodash.uniq": "^4.5.0", + "path-is-absolute": "^1.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "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" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "keyboard-key": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.0.1.tgz", + "integrity": "sha512-OAfjaSI917BOonwfH6LQHMZJRv5035jjZvgElouB/DM4I7l5zEjrA15RD80YwIjhN69xqEfWCZIbhBcGpb85Ig==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "labella": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/labella/-/labella-1.1.4.tgz", + "integrity": "sha1-xsxaNA6N80DrM1YzaD6lm4KMMi0=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "less": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.5.3.tgz", + "integrity": "sha512-MMGXfVYMORHyfwWGOP04HNnDxX874A329FMZEiMuho+QvOXJMyjlsmnf3qUxr1KmwM1E8mVo2bOPbT4A8aF61w==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.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": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "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" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.every": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", + "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "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==", + "dev": true, + "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=", + "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=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memoize-one": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.0.tgz", + "integrity": "sha512-wdpOJ4XBejprGn/xhd1i2XR8Dv1A25FJeIvR7syQhQlz9eXsv+06llcvcmBxlWVGv4C73QBsWA8kxvZozzNwiQ==" + }, + "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=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "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=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "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": "^2.0.1", + "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==", + "dev": true, + "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": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nearley": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.16.0.tgz", + "integrity": "sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "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" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "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": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "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.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^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=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.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=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==", + "dev": true + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "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=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "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==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "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" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "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=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "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" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "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=", + "dev": true + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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" + }, + "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" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", + "requires": { + "postcss": "^6.0.1" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.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" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "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=", + "dev": true + }, + "prompts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", + "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "dev": true, + "requires": { + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "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" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "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": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "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==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", + "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-annotation": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-annotation/-/react-annotation-1.3.1.tgz", + "integrity": "sha512-jwbl7v5fMvkQrqdFWIIjuziqUzvEwyzhhSJ61bFjxPDEIizRuWf0ym6o6dV034toePs429sG6btGaLWGMC9zEw==", + "requires": { + "prop-types": "15.6.0", + "viz-annotation": "0.0.1-3" + }, + "dependencies": { + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "react-dom": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz", + "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "react-error-boundary": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-1.2.3.tgz", + "integrity": "sha512-3naGugvlzwcYjiqPr8o89oYHe2R5QxK6ysCQj/GvyenBvruVHu2hRsuWvjQcNbNiiOkEPYKfcMm7tV/Tfle5rA==" + }, + "react-grid-layout": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-0.16.6.tgz", + "integrity": "sha512-h2EsYgsqcESLJeevQSJsEKp8hhh+phOlXDJoMhlV2e7T3VWQL+S6iCF3iD/LK19r4oyRyOMDEir0KV+eLXrAyw==", + "requires": { + "classnames": "2.x", + "lodash.isequal": "^4.0.0", + "prop-types": "15.x", + "react-draggable": "3.x", + "react-resizable": "1.x" + } + }, + "react-is": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", + "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", + "dev": true + }, + "react-reconciler": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", + "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-resizable": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.7.5.tgz", + "integrity": "sha512-lauPcBsLqmxMHXHpTeOBpYenGalbSikYr8hK+lwtNYMQX1pGd2iYE+pDvZEV97nCnzuCtWM9htp7OpsBIY2Sjw==", + "requires": { + "prop-types": "15.x", + "react-draggable": "^2.2.6 || ^3.0.3" + } + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, + "react-test-renderer": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz", + "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0", + "react-is": "^16.4.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "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=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.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.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "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=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "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" + }, + "dependencies": { + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "roughjs-es5": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/roughjs-es5/-/roughjs-es5-0.1.0.tgz", + "integrity": "sha512-NMjzoBgSYk8qEYLSxzxytS20sfdQV7zg119FZjFDjIDwaqodFcf7QwzKbqM64VeAYF61qogaPLk3cs8Gb+TqZA==", + "requires": { + "babel-runtime": "^6.26.0" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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=", + "dev": true, + "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==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "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" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "sass-loader": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.3.tgz", + "integrity": "sha512-iaSFtQcGo4SSgDw5Aes5p4VTrA5jCGSA7sGmhPIcOloBlgI1VktM2MUrk2IHHjbNagckXlPz+HWq1vAAPrcYxA==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semantic-ui-css": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.3.3.tgz", + "integrity": "sha512-/UDs+a07LdxmYgVNqkbW9x5Gil1Dt4HnVq4LrHKKUAD/DUDh0fnwmCxbQFyKKD+YsVDQWFqftyVbYKlClBFLDw==", + "requires": { + "jquery": "x.*" + } + }, + "semantic-ui-react": { + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.82.0.tgz", + "integrity": "sha512-bYfQ6NNT+1r9G+pPbpFGhj4aysOyVj/2fziJbknwIzwqUXfGjsIonsKNpMmUSxJBKbYMIUlbqxW1EhsG0Ire8w==", + "requires": { + "@babel/runtime": "^7.0.0-beta.49", + "classnames": "^2.2.5", + "keyboard-key": "^1.0.1", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "shallowequal": "^1.0.2" + } + }, + "semiotic": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/semiotic/-/semiotic-1.14.2.tgz", + "integrity": "sha512-k83L7xRy8anlZUFA1A62LiQy2v3YmvlEhQUtG6dYb9z2DUEbHs/PdZN1WRdGIBFDx7haOakhr4jMHgiLTHuEPw==", + "requires": { + "@mapbox/polylabel": "1", + "d3-array": "^1.2.0", + "d3-bboxCollide": "^1.0.3", + "d3-brush": "^1.0.4", + "d3-chord": "^1.0.4", + "d3-collection": "^1.0.1", + "d3-contour": "^1.1.1", + "d3-force": "^1.0.2", + "d3-glyphedge": "^1.2.0", + "d3-hexbin": "^0.2.2", + "d3-hierarchy": "^1.1.3", + "d3-interpolate": "^1.1.5", + "d3-sankey-circular": "0.25.0", + "d3-scale": "^1.0.3", + "d3-selection": "^1.1.0", + "d3-shape": "^1.0.4", + "d3-voronoi": "^1.0.2", + "json2csv": "3.11.5", + "labella": "1.1.4", + "memoize-one": "4.0.0", + "object-assign": "4.1.1", + "promise": "8.0.1", + "prop-types": "15.6.0", + "raf": "3.4.0", + "react-annotation": "1.3.1", + "roughjs-es5": "0.1.0", + "semiotic-mark": "0.3.0", + "svg-path-bounding-box": "1.0.4", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + } + } + }, + "semiotic-mark": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semiotic-mark/-/semiotic-mark-0.3.0.tgz", + "integrity": "sha512-GxyrIyntvs+TXK8KOJKzs3AnvMM7Cb7ywfAeJKEQ/GKMKwaZvQnuGrz3dSImjfH7xvf4E2AmDIggqgHISt1X4Q==", + "requires": { + "d3-interpolate": "^1.1.5", + "d3-scale": "^1.0.3", + "d3-selection": "^1.1.0", + "d3-shape": "^1.0.3", + "d3-transition": "^1.0.3", + "prop-types": "^15.6.0", + "roughjs-es5": "0.1.0" + }, + "dependencies": { + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true, + "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": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz", + "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.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" + } + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "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==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "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=", + "dev": true, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "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": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "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.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "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": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "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": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "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": "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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=", + "dev": true + }, + "style-loader": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svg-path-bounding-box": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svg-path-bounding-box/-/svg-path-bounding-box-1.0.4.tgz", + "integrity": "sha1-7XPfODyLR4abZQjwWPV0j4gzwHA=", + "requires": { + "svgpath": "^2.0.0" + } + }, + "svgpath": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.2.1.tgz", + "integrity": "sha1-CDS7Z8iadkcrK9BswQH6e1F7Iiw=" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.2.tgz", + "integrity": "sha512-gDBrfla2z1JiBio5BE7nudwkjTjPOTduCzJC94fc1JjnuzI+tUsMiDskxFQCskxAtMB2c/ZwD6R2lg65zCptdQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "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" + } + }, + "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 + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "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" + } + } + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": 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" + } + }, + "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 + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tinyqueue": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz", + "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "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, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" + }, + "uglify-js": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.4.tgz", + "integrity": "sha512-RiB1kNcC9RMyqwRrjXC+EjgLoXULoDnCaOnEDzUCHkBN0bHwmtF5rzDMiDWU29gu0kXCRRWwtcTAVFWRECmU2Q==", + "dev": true, + "requires": { + "commander": "~2.16.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": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", + "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": 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=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "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=", + "dev": true + } + } + }, + "url-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz", + "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^0.4.3" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", + "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" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "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" + } + }, + "viz-annotation": { + "version": "0.0.1-3", + "resolved": "https://registry.npmjs.org/viz-annotation/-/viz-annotation-0.0.1-3.tgz", + "integrity": "sha512-jZSnuAsfu3MKGa2vAShzw3oUG71tfVmk0DQvYG/YbQ1Kpc5AlU0v2lgHekO2nVPvIiM6mWrfIths4IZBYTh0xQ==" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", + "integrity": "sha512-rAVtTNZw+cQPjvGp1ox0XC5Q2IBFyqoqh+QII4J/oguyu83Bax1apbo2eqB8bHRS+fqYUBagys6lqUoVwKSmXQ==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.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=", + "dev": true, + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": 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=", + "dev": true, + "requires": { + "is-extglob": "^2.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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + } + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.15.1.tgz", + "integrity": "sha512-UwfFQ2plA5EMhhzwi/hl5xpLk7mNK7p0853Ml04z1Bqw553pY+oS8Xke3funcVy7eG/yMpZPvnlFTUyGKyKoyw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^3.7.1", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.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=", + "dev": true, + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "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=", + "dev": true, + "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": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "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": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + } + } + } + }, + "webpack-auto-inject-version": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-auto-inject-version/-/webpack-auto-inject-version-1.1.0.tgz", + "integrity": "sha1-K4clHyVN5nOEC/2BH67Y83wP5j4=", + "dev": true + }, + "webpack-cli": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz", + "integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.0.0", + "global-modules-path": "^2.1.0", + "import-local": "^1.0.0", + "inquirer": "^6.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "yargs": "^11.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", + "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "external-editor": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.0.tgz", + "integrity": "sha512-mpkfj0FEdxrIhOC04zk85X7StNtr0yXnG7zCb+8ikO8OJi2jsHh5YGoknNTyXgsbHOf1WOOcVU3kPFWT2WgCkQ==", + "dev": true, + "requires": { + "chardet": "^0.5.0", + "iconv-lite": "^0.4.22", + "tmp": "^0.0.33" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.0.0.tgz", + "integrity": "sha512-tISQWRwtcAgrz+SHPhTH7d3e73k31gsOy6i1csonLc0u1dVK/wYvuOnFeiWqC5OXFIYbmrIFInef31wbT8MEJg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.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=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "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": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "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=", + "dev": true + }, + "why-did-you-update": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/why-did-you-update/-/why-did-you-update-0.1.1.tgz", + "integrity": "sha512-CCi6k05CJ44wJEuE3D2LXtHO4YX7LjuG5cHrs8UAUWJAEDO/bWF1+/wT0gt4gLd3e69bKJJBbUk86bVdlT4E6A==", + "requires": { + "lodash.every": "^4.6.0", + "lodash.filter": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.8", + "lodash.isstring": "^4.0.1", + "lodash.keys": "^4.2.0", + "lodash.pick": "^4.4.0", + "lodash.some": "^4.6.0", + "lodash.union": "^4.6.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "wrench": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", + "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "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==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "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" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json index 7182b01fa..0abc6714d 100644 --- a/package.json +++ b/package.json @@ -1,66 +1,107 @@ { "name": "vector", - "version": "1.0.2", + "version": "2.0.0-beta1", "description": "Vector is an Instance-Level, On-Demand, High-Resolution Monitoring Framework. It's a web-base UI that leverages Performance Co-Pilot (PCP) in the backend.", - "author": "Martin Spier ", + "author": "Jason Koch ", "main": "src/app/index.html", "repository": "https://github.com/Netflix/vector", "license": "Apache-2.0", - "dependencies": {}, + "dependencies": { + "@babel/core": "^7.5.5", + "@babel/polyfill": "^7.4.4", + "@babel/runtime": "^7.5.5", + "chai": "^4.1.2", + "color-hash": "^1.0.3", + "d3-scale": "^2.1.0", + "d3-selection": "^1.3.2", + "d3-svg-legend": "^2.25.6", + "font-awesome": "4.6.1", + "font-awesome-webpack-4": "git+https://github.com/tapz/font-awesome-webpack#da547ed91064b408500131f837f17f423ce89411", + "http-server-spa": "^1.3.0", + "lodash-es": "^4.17.10", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.isequal": "^4.5.0", + "memoize-one": "^4.0.0", + "moment": "^2.22.2", + "prop-types": "^15.6.2", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-error-boundary": "^1.2.3", + "react-grid-layout": "^0.16.6", + "react-router-dom": "^4.3.1", + "semantic-ui-css": "^2.3.3", + "semantic-ui-react": "^0.82.0", + "semiotic": "^1.14.2", + "superagent": "^3.8.3", + "webpack-merge": "^4.1.4", + "why-did-you-update": "^0.1.1" + }, "scripts": { - "test": "gulp test" + "build": "webpack --display-error-details --config webpack.dev.js", + "build-prod": "webpack --display-error-details --config webpack.prod.js", + "test": "jest --coverage", + "serve": "http-server-spa dist index.html 3000" }, "devDependencies": { - "browser-sync": "~2.1.4", - "browser-sync-spa": "~1.0.2", - "chalk": "~0.5.1", - "concat-stream": "~1.4.7", - "del": "~1.1.1", - "eslint": "~0.18.0", - "eslint-plugin-angular": "0.0.7", - "gulp": "~3.9.0", - "gulp-angular-filesort": "~1.0.4", - "gulp-angular-templatecache": "~1.5.0", - "gulp-autoprefixer": "~2.1.0", - "gulp-bower": "~0.0.10", - "gulp-csso": "~1.0.0", - "gulp-eslint": "~0.8.0", - "gulp-filter": "~2.0.2", - "gulp-flatten": "~0.0.4", - "gulp-git": "^1.6.0", - "gulp-gzip": "~1.1.0", - "gulp-inject": "~1.1.1", - "gulp-jshint": "~1.9.0", - "gulp-load-plugins": "~0.8.0", - "gulp-minify-html": "~0.1.7", - "gulp-ng-annotate": "~0.5.2", - "gulp-protractor": "~0.0.12", - "gulp-rename": "~1.2.0", - "gulp-replace": "~0.5.0", - "gulp-rev": "~3.0.1", - "gulp-rev-replace": "~0.3.1", - "gulp-size": "~1.2.0", - "gulp-sourcemaps": "~1.3.0", - "gulp-tar": "~1.4.0", - "gulp-uglify": "~1.1.0", - "gulp-useref": "~1.1.0", - "gulp-util": "~3.0.2", - "http-proxy": "~1.8.0", - "jshint-stylish": "~1.0.0", - "karma": "~0.12.31", - "karma-jasmine": "~0.3.1", - "karma-ng-html2js-preprocessor": "~0.1.2", - "karma-phantomjs-launcher": "~0.1.4", - "lodash": "~3.2.0", - "main-bower-files": "~2.5.0", - "merge-stream": "~0.1.7", - "protractor": "~1.7.0", - "require-dir": "~0.1.0", + "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-runtime": "^7.5.5", + "@babel/preset-env": "^7.5.5", + "@babel/preset-react": "^7.0.0", + "@types/jest": "^24.0.16", + "babel-eslint": "^8.2.5", + "babel-jest": "^24.8.0", + "babel-loader": "^8.0.6", + "copy-webpack-plugin": "^4.5.2", + "css-loader": "^2.1.1", + "enzyme": "^3.9.0", + "enzyme-adapter-react-16": "^1.1.1", + "eslint": "^5.16.0", + "eslint-loader": "^2.0.0", + "eslint-plugin-react": "^7.10.0", + "estraverse": "~4.1.0", + "file-loader": "^1.1.11", + "html-loader": "^0.5.5", + "html-webpack-plugin": "^3.2.0", + "jest": "^24.8.0", + "less": "^3.0.4", + "query-string": "^4.3.4", + "sass-loader": "^7.0.3", + "style-loader": "^0.21.0", "uglify-save-license": "~0.4.1", - "wiredep": "~2.2.0", + "url-loader": "^1.0.1", + "webpack": "^4.12.2", + "webpack-auto-inject-version": "^1.1.0", + "webpack-cli": "^3.0.8", + "worker-loader": "^2.0.0", "wrench": "~1.5.8" }, - "engines": { - "node": ">=0.10.0" + "jest": { + "moduleNameMapper": { + "\\.(css|less|sass|scss)$": "/test/__mocks__/styleMock.js", + "\\.(gif|ttf|eot|svg)$": "/test/__mocks__/fileMock.js", + "^config$": "/src/config.js" + }, + "transform": { + "^.+\\.jsx$": "babel-jest", + "^.+\\.js$": "babel-jest" + }, + "collectCoverageFrom": [ + "src/**/*.{js,jsx}" + ] + }, + "babel": { + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-transform-runtime", + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-object-rest-spread" + ] } } diff --git a/protractor.conf.js b/protractor.conf.js deleted file mode 100644 index 8b426c03c..000000000 --- a/protractor.conf.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -var paths = require('./.yo-rc.json')['generator-gulp-angular'].props.paths; - -// An example configuration file. -exports.config = { - // The address of a running selenium server. - //seleniumAddress: 'http://localhost:4444/wd/hub', - //seleniumServerJar: deprecated, this should be set on node_modules/protractor/config.json - - // Capabilities to be passed to the webdriver instance. - capabilities: { - 'browserName': 'chrome' - }, - - chromeOnly: true, - // Spec patterns are relative to the current working directly when - // protractor is called. - specs: [paths.e2e + '/**/*.js'], - - // Options to be passed to Jasmine-node. - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000 - } -}; diff --git a/scripts/pushToDockerhub.sh b/scripts/pushToDockerhub.sh new file mode 100755 index 000000000..022f12a2f --- /dev/null +++ b/scripts/pushToDockerhub.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then + docker build -t netflixoss/vector . + docker tag netflixoss/vector:latest netflixoss/vector:$TRAVIS_TAG + docker images + docker login -u=${dockerhubUsername} -p=${dockerhubPassword} + docker push netflixoss/vector +fi \ No newline at end of file diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..edc9dac3c --- /dev/null +++ b/shell.nix @@ -0,0 +1,11 @@ +{ pkgs ? import {} }: + +with pkgs; + +stdenv.mkDerivation { + name = "grafana-pcp-live"; + + buildInputs = [ + nodejs-8_x + ]; +} diff --git a/src/app/App.jsx b/src/app/App.jsx new file mode 100644 index 000000000..caddd802d --- /dev/null +++ b/src/app/App.jsx @@ -0,0 +1,268 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// TODO plenty more tests +// TODO toast messages when there are issues +// TODO enable vector to browse and collect cluster and container information from external sources +// - needs to be pluggable, eg from k8s/titus/etc + +import React from 'react' +import PropTypes from 'prop-types' + +/* +import process from 'process' +import { whyDidYouUpdate } from 'why-did-you-update' +if (process.env.NODE_ENV !== 'production') { + whyDidYouUpdate(React) +} +*/ + +import { render } from 'react-dom' + +import config from 'config' + +import Navbar from './components/Navbar/Navbar.jsx' +import Footer from './components/Footer/Footer.jsx' +import Dashboard from './components/Dashboard/Dashboard.jsx' +import ConfigPanel from './components/ConfigPanel/ConfigPanel.jsx' +import ContextPoller from './components/Pollers/ContextPoller.jsx' +import DatasetPoller from './components/Pollers/DatasetPoller.jsx' +import DashboardController from './components/ConfigPanel/DashboardController.jsx' + +import { Sidebar } from 'semantic-ui-react' +import isEqual from 'lodash.isequal' +import cloneDeep from 'lodash.clonedeep' + +import 'semantic-ui-css/semantic.min.css' +import { matchesTarget, getChartsFromLocation, pushQueryStringToHistory } from './utils' + +import { BrowserRouter, Switch, Route } from 'react-router-dom' +import charts from './charts' +import bundles from './bundles' + +const initialChartIdlist = getChartsFromLocation(location) +const initialTargets = initialChartIdlist.targets +const initialChartlist = initialChartIdlist.chartlist + .map(c => ({ + context: { target: c.target }, + ...charts.find(ch => c.chartId === ch.chartId) + })) + +class App extends React.Component { + state = { + chartlist: this.props.initialChartlist, + pollIntervalMs: 2000, + windowIntervalMs: 120000, + contextData: [], + contextDatasets: [], + targets: this.props.initialTargets, + configVisible: this.props.initialConfigPanelOpen, + pausedData: null, + } + + // TODO this call block is a big ball of mud + // can it be pushed off to somewhere else + // or should we just switch it across to redux? + + refreshQueryString = () => { + pushQueryStringToHistory(this.state.targets, this.state.chartlist, this.props.history) + } + + // chart handling + onClearChartsFromContext = (ctx) => { + this.setState((oldState) => ({ + chartlist: oldState.chartlist.filter(chart => + !(matchesTarget(chart.context.target, ctx.target))) + }), this.refreshQueryString) + } + + onAddChartToContext = (ctx, chart) => { + this.setState((oldState) => ({ chartlist: oldState.chartlist.concat({ ...chart, context: ctx }) }), this.refreshQueryString) + } + + removeChartByIndex = (idx) => { + this.setState(oldState => + ({ chartlist: [ ...oldState.chartlist.slice(0, idx), ...oldState.chartlist.slice(idx + 1) ] }), this.refreshQueryString) + } + updateChartSettings = (idx, settings) => { + this.setState((oldState) => { + let newChart = { ...oldState.chartlist[idx], ...settings } + return { chartlist: [ ...oldState.chartlist.slice(0, idx), newChart, ...oldState.chartlist.slice(idx + 1) ] } + }) + } + + // context handling + onContextsUpdated = (contexts) => { + this.setState(state => { + if (isEqual(contexts, state.contextData)) return undefined + + // update any charts with the refreshed context from the chart list + let newChartlist = this.state.chartlist.map(c => ({ + ...c, + context: contexts.find(ctx => matchesTarget(ctx.target, c.context.target)) + })) + return { + chartlist: newChartlist, + contextData: [ ...contexts ], + } + }) + } + + onContextDatasetsUpdated = (ctxds) => { + this.setState({ contextDatasets: ctxds }) + } + + onNewContext = (target) => this.setState((state) => ({ targets: state.targets.concat(target) }), this.refreshQueryString) + onRemoveContext = (context) => this.setState((state) => ({ + // remove all targets, and remove all charts + targets: state.targets.filter(target => + !(matchesTarget(target, context.target))), + chartlist: state.chartlist.filter(chart => + !(matchesTarget(chart.context.target, context.target))), + }), this.refreshQueryString) + + // config panel visibility + toggleConfigVisible = () => this.setState((state) => ({ configVisible: !state.configVisible })) + handleRequestClose = () => this.setState({ configVisible: false }) + + // app config settings + onWindowSecondsChange = (sec) => this.setState({ windowIntervalMs: sec * 1000 }) + onPollIntervalSecondsChange = (sec) => this.setState({ pollIntervalMs: sec * 1000 }) + + // to pause, we take a snapshot of the data and use this as our datasource for the dash + // this ensures all other components, pollers etc can keep flowing through their data cleanly + handlePlay = () => this.setState({ pausedData: null }) + handlePause = () => this.setState(state => ({ pausedData: cloneDeep(state.contextDatasets) })) + + render () { + const isConfigPanelOpen = !this.props.embed && this.state.configVisible + + return ( +
+
+ + + + + + + + + + scale down > overlay > slide along > uncover + direction='top' + visible={isConfigPanelOpen} > + + + + + + + + + +
+ + + + +
+
+ ) + } +} + +App.propTypes = { + embed: PropTypes.bool.isRequired, + initialTargets: PropTypes.array.isRequired, + initialChartlist: PropTypes.array.isRequired, + initialConfigPanelOpen: PropTypes.bool.isRequired, + initialAddContext: PropTypes.bool.isRequired, + history: PropTypes.object.isRequired, +} + +class PageRouter extends React.Component { + AppEmbed = (props) => + + + AppNormal = (props) => + + + render () { + return ( + + + + + + + ) + } +} + +PageRouter.propTypes = { +} + +render(, document.getElementById('app')) diff --git a/src/app/app.config.js b/src/app/app.config.js deleted file mode 100644 index a7db634c6..000000000 --- a/src/app/app.config.js +++ /dev/null @@ -1,34 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - angular - .module('vector.config') - .constant('vectorConfig', { - 'protocol': 'http', // PMWEBD protocol (http or https) - 'port': 44323, // PMWEBD port - 'hostspec': 'localhost', // Default PMCD hostspec - 'interval': 2, // Default update interval in seconds - 'window': 2, // Default graph time window in minutes - 'enableCpuFlameGraph': false, - 'enableDiskLatencyHeatMap': false - }).constant('containerConfig', { - 'externalAPI': false, //enable and edit containermetadata.service to call external API to resolve - }); -})(); diff --git a/src/app/app.filters.js b/src/app/app.filters.js deleted file mode 100644 index a9a3d9463..000000000 --- a/src/app/app.filters.js +++ /dev/null @@ -1,75 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ -/*jslint plusplus: true */ - -(function () { - 'use strict'; - - /* Filters */ - - /** - * @name uniqueItems - * @desc - */ - function uniqueItems(data, key) { - var result = [], - i, - value; - for (i = 0; i < data.length; i++) { - value = data[i][key]; - if (result.indexOf(value) === -1) { - result.push(value); - } - } - return result; - } - - /** - * @name groupBy - * @desc - */ - function groupBy() { - return function (collection, key) { - if (collection === null) { - return; - } - return uniqueItems(collection, key); - }; - } - - /** - * @name groupFilter - * @desc - */ - function groupFilter() { - return function (collection, group) { - return collection.filter(function (item) { - return item.group === group; - }); - }; - } - - angular - .module('app.filters') - .filter('groupBy', groupBy) - .filter('groupFilter', groupFilter); - -})(); diff --git a/src/app/app.js b/src/app/app.js deleted file mode 100644 index 3b0f7fbf7..000000000 --- a/src/app/app.js +++ /dev/null @@ -1,74 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true */ -/*global angular*/ -(function () { - 'use strict'; - - /** - * @name flashConfig - * @desc Configures flashProvider to use Bootstrap 3 CSS class. - */ - function flashConfig(flashProvider) { - flashProvider.errorClassnames.push('alert-danger'); - } - - angular - .module('app.routes', ['ngRoute']); - - angular - .module('vector.config', []); - - angular - .module('vector.version', []); - - angular - .module('app.charts', []); - - angular - .module('app.filters', []); - - angular - .module('app.metrics', []); - - angular - .module('app.datamodels', []); - - angular - .module('app.services', []); - - angular - .module('app', [ - 'app.routes', - 'ui.dashboard', - 'app.controllers', - 'app.datamodels', - 'app.widgets', - 'app.charts', - 'app.services', - 'app.filters', - 'app.metrics', - 'vector.config', - 'vector.version', - 'angular-flash.service', - 'angular-flash.flash-alert-directive' - ]) - .config(flashConfig); - -})(); diff --git a/src/app/app.routes.js b/src/app/app.routes.js deleted file mode 100644 index 08c848514..000000000 --- a/src/app/app.routes.js +++ /dev/null @@ -1,78 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - /** - * @name config - * @desc Define valid application routes - */ - function config($routeProvider) { - $routeProvider.when('/', { - templateUrl: 'app/dashboard/dashboard.html', - controller: 'DashboardController', - controllerAs: 'vm', - title: 'Dashboard - Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (defaultWidgets) { - return defaultWidgets; - }, - 'embed': function () { - return false; - } - } - }).when('/embed', { - templateUrl: 'app/dashboard/dashboard.html', - controller: 'DashboardController', - controllerAs: 'vm', - title: 'Dashboard - Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (defaultWidgets) { - return defaultWidgets; - }, - 'embed': function () { - return true; - } - } - }).when('/empty', { - templateUrl: 'app/dashboard/dashboard.html', - controller: 'DashboardController', - controllerAs: 'vm', - title: 'Dashboard - Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (emptyWidgets) { - return emptyWidgets; - }, - 'embed': function () { - return false; - } - } - }) - .otherwise('/'); - } - - config.$inject = ['$routeProvider']; - - angular - .module('app.routes') - .config(config); - -})(); diff --git a/src/app/app.widgets.js b/src/app/app.widgets.js deleted file mode 100644 index 87ae30525..000000000 --- a/src/app/app.widgets.js +++ /dev/null @@ -1,828 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ - -(function () { - 'use strict'; - - /* Widgets */ - function widgetDefinitions(MetricDataModel, - CumulativeMetricDataModel, - ContainerCPUstatMetricTimeSeriesDataModel, - ContainerMemoryBytesMetricTimeSeriesDataModel, - ContainerMemoryUtilizationMetricDataModel, - ContainerNetworkBytesMetricDataModel, - ContainerMultipleCumulativeMetricDataModel, - MemoryUtilizationMetricDataModel, - NetworkBytesMetricDataModel, - CpuUtilizationMetricDataModel, - PerCpuUtilizationMetricDataModel, - MultipleMetricDataModel, - MultipleCumulativeMetricDataModel, - DummyMetricDataModel, - DiskLatencyMetricDataModel, - CumulativeUtilizationMetricDataModel, - vectorConfig) { - var definitions = [ - { - name: 'cgroup.cpuacct.stat.user', - title: 'Container CPU Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerCPUstatMetricTimeSeriesDataModel, - dataModelOptions: { - name: 'cgroup.cpuacct.stat.user', - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container' - }, - { - name: 'cgroup.memory.usage', - title: 'Container Memory Usage', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMemoryBytesMetricTimeSeriesDataModel, - dataModelOptions: { - name: 'cgroup.memory.usage' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - }, - { - name: 'memory.Headroom', - title: 'Container Memory Headroom', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: ContainerMemoryUtilizationMetricDataModel, - dataModelOptions: { - name: 'mem' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - },{ - name: 'container.network.interface.bytes', - title: 'Container Network Throughput (kB)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerNetworkBytesMetricDataModel, - dataModelOptions: { - name: 'network.interface.bytes' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - },{ - name: 'container.disk.iops', - title: 'Container Disk IOPS', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'container.disk.iops', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.io_serviced.read', - '{key} write': 'cgroup.blkio.all.io_serviced.write' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container' - },{ - name: 'container.disk.bytes', - title: 'Container Disk Throughput (kB)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'container.disk.bytes', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.io_service_bytes.read', - '{key} write': 'cgroup.blkio.all.io_service_bytes.write' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container' - }, - { - name: 'kernel.all.load', - title: 'Load Average', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'kernel.all.load' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU' - }, { - name: 'kernel.all.runnable', - title: 'Runnable', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'kernel.all.runnable' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 4, - integer: true - } - }, { - name: 'kernel.all.cpu.sys', - title: 'CPU Utilization (System)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu.sys' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.cpu.user', - title: 'CPU Utilization (User)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu.user' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.cpu', - title: 'CPU Utilization', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: CpuUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu.sys', - title: 'Per-CPU Utilization (System)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu.sys' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu.user', - title: 'Per-CPU Utilization (User)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu.user' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu', - title: 'Per-CPU Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: PerCpuUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'mem.freemem', - title: 'Memory Utilization (Free)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'mem.freemem' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem.util.used', - title: 'Memory Utilization (Used)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'mem.util.used' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem.util.cached', - title: 'Memory Utilization (Cached)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'mem.util.cached' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem', - title: 'Memory Utilization', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: MemoryUtilizationMetricDataModel, - dataModelOptions: { - name: 'mem' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.out.drops', - title: 'Network Drops (Out)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.interface.out.drops' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.interface.in.drops', - title: 'Network Drops (In)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.interface.in.drops' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.interface.drops', - title: 'Network Drops', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleMetricDataModel, - dataModelOptions: { - name: 'network.interface.drops', - metricDefinitions: { - '{key} in': 'network.interface.in.drops', - '{key} out': 'network.interface.out.drops' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.established', - title: 'TCP Connections (Estabilished)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.established' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.time_wait', - title: 'TCP Connections (Time Wait)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.time_wait' - }, - enableVerticalResize: false, - size: { - width: '25%', - height: '250px' - }, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.close_wait', - title: 'TCP Connections (Close Wait)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.close_wait' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn', - title: 'TCP Connections', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleMetricDataModel, - dataModelOptions: { - name: 'network.tcpconn', - metricDefinitions: { - 'established': 'network.tcpconn.established', - 'time_wait': 'network.tcpconn.time_wait', - 'close_wait': 'network.tcpconn.close_wait' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.bytes', - title: 'Network Throughput (kB)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: NetworkBytesMetricDataModel, - dataModelOptions: { - name: 'network.interface.bytes' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'disk.iops', - title: 'Disk IOPS', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'disk.iops', - metricDefinitions: { - '{key} read': 'disk.dev.read', - '{key} write': 'disk.dev.write' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk' - }, { - name: 'disk.bytes', - title: 'Disk Throughput (Bytes)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'disk.bytes', - metricDefinitions: { - '{key} read': 'disk.dev.read_bytes', - '{key} write': 'disk.dev.write_bytes' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk' - }, { - name: 'disk.dev.avactive', - title: 'Disk Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'disk.dev.avactive' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.pswitch', - title: 'Context Switches', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeMetricDataModel, - dataModelOptions: { - name: 'kernel.all.pswitch' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'mem.vmstat.pgfault', - title: 'Page Faults', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'mem.vmstat.pgfault', - metricDefinitions: { - 'page faults': 'mem.vmstat.pgfault', - 'major page faults': 'mem.vmstat.pgmajfault' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.packets', - title: 'Network Packets', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'network.interface.packets', - metricDefinitions: { - '{key} in': 'network.interface.in.packets', - '{key} out': 'network.interface.out.packets' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcp.retrans', - title: 'Network Retransmits', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'network.tcp.retrans', - metricDefinitions: { - 'retranssegs': 'network.tcp.retranssegs', - 'timeouts': 'network.tcp.timeouts', - 'listendrops': 'network.tcp.listendrops', - 'fastretrans': 'network.tcp.fastretrans', - 'slowstartretrans': 'network.tcp.slowstartretrans', - 'syncretrans': 'network.tcp.syncretrans' - } - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'disk.dev.latency', - title: 'Disk Latency', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: DiskLatencyMetricDataModel, - dataModelOptions: { - name: 'disk.dev.latency' - }, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk', - attrs: { - percentage: false, - integer: true - } - } - ]; - - if (vectorConfig.enableCpuFlameGraph) { - definitions.push({ - name: 'graph.flame.cpu', - title: 'CPU Flame Graph', - directive: 'cpu-flame-graph', - dataModelType: DummyMetricDataModel, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU' - }); - } - - if (vectorConfig.enableDiskLatencyHeatMap) { - definitions.push({ - name: 'graph.heatmap.disk', - title: 'Disk Latency Heat Map', - directive: 'disk-latency-heat-map', - dataModelType: DummyMetricDataModel, - size: { - width: '25%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk' - }); - } - - return definitions; - } - - var defaultWidgets = [ - { - name: 'kernel.all.cpu', - size: { - width: '25%' - } - }, { - name: 'kernel.percpu.cpu', - size: { - width: '25%' - } - }, { - name: 'kernel.all.runnable', - size: { - width: '25%' - } - }, { - name: 'kernel.all.load', - size: { - width: '25%' - } - }, { - name: 'network.interface.bytes', - size: { - width: '25%' - } - }, { - name: 'network.tcpconn', - size: { - width: '25%' - } - }, { - name: 'network.interface.packets', - size: { - width: '25%' - } - }, { - name: 'network.tcp.retrans', - size: { - width: '25%' - } - }, { - name: 'mem', - size: { - width: '50%' - } - }, { - name: 'mem.vmstat.pgfault', - size: { - width: '25%' - } - }, { - name: 'kernel.all.pswitch', - size: { - width: '25%' - } - }, { - name: 'disk.iops', - size: { - width: '25%' - } - }, { - name: 'disk.bytes', - size: { - width: '25%' - } - }, { - name: 'disk.dev.avactive', - size: { - width: '25%' - } - }, { - name: 'disk.dev.latency', - size: { - width: '25%' - } - } - ]; - - var emptyWidgets = []; - - angular - .module('app.widgets', []) - .factory('widgetDefinitions', widgetDefinitions) - .value('defaultWidgets', defaultWidgets) - .value('emptyWidgets', emptyWidgets); - -})(); diff --git a/src/app/bundles/index.js b/src/app/bundles/index.js new file mode 100644 index 000000000..36e2a0cfe --- /dev/null +++ b/src/app/bundles/index.js @@ -0,0 +1,113 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +const bundles = [ + { + name: 'Host Utilization', + iconName: 'computer', + description: (
+ Quick overview of host utilization (not container): +
    +
  • CPU utilization
  • +
  • Disk latency
  • +
  • Memory utilization
  • +
  • Network throughput
  • +
+
), + chartTemplates: [ + { chartId: 'cpu-utilization' }, + { chartId: 'disk-latency' }, + { chartId: 'memory-utilization' }, + { chartId: 'network-throughput' }, + ] + }, + { + name: 'Container app', + iconName: 'clone', + description: (
+ A set of metrics for monitoring performance of your container +
    +
  • Container CPU
  • +
  • Container MEM usage (MB & %)
  • +
  • Container Disk IOPS
  • +
  • Container Disk Throughput
  • +
  • Container CPU throttled
  • +
+
), + chartTemplates: [ + { chartId: 'container-percont-cpu' }, + { chartId: 'container-percont-mem' }, + { chartId: 'container-disk-iops' }, + { chartId: 'container-disk-tput' }, + { chartId: 'container-percont-cpu-throttle' }, + { chartId: 'container-percont-mem-util', }, + ], + }, + { + name: 'Disk', + iconName: 'disk', + description: (
+ Key disk metrics +
    +
  • IOPS
  • +
  • Latency
  • +
  • Throughput
  • +
  • Utilization
  • +
+
), + chartTemplates: [ + { chartId: 'disk-iops' }, + { chartId: 'disk-latency' }, + { chartId: 'disk-throughput' }, + { chartId: 'disk-utilization' } + ], + }, + { + name: 'Flamegraphs', + iconName: 'hotjar', + description: 'Flame graphs', + chartTemplates: [ + { chartId: 'fg-cpu' }, + { chartId: 'fg-pname-cpu' }, + { chartId: 'fg-uninlined-cpu' }, + { chartId: 'fg-pagefault' }, + { chartId: 'fg-diskio' }, + { chartId: 'fg-ipc' }, + ] + }, + { + name: 'BCC demo', + iconName: 'microchip', + description: 'A collection showing the default configured BCC PMDA metrics, make sure you have the BCC PMDA installed.', + chartTemplates: [ + { + chartId: 'text-label', + content: 'The default BCC widgets. To enable more widgets, on the target host, check the BCC PMDA configuration file and run ./Install to reload.', + }, + { chartId: 'bcc-tcptop' }, + { chartId: 'bcc-runqlat' }, + { chartId: 'bcc-biolatency' }, + { chartId: 'bcc-tracepoint-hits' }, + { chartId: 'bcc-usdt-hits' }, + ] + } +] + +export default bundles diff --git a/src/app/charts/area-stacked-timeseries.directive.js b/src/app/charts/area-stacked-timeseries.directive.js deleted file mode 100644 index 187b5d871..000000000 --- a/src/app/charts/area-stacked-timeseries.directive.js +++ /dev/null @@ -1,127 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3, nv*/ - -(function () { - 'use strict'; - - function areaStackedTimeSeries($rootScope, $log, D3Service) { - - function link(scope) { - scope.id = D3Service.getId(); - scope.flags = $rootScope.flags; - scope.legend = true; - - var chart; - - nv.addGraph(function () { - - var yAxisTickFormat = D3Service.yAxisTickFormat(), - height = 250; - - chart = nv.models.stackedAreaChart().options({ - duration: 0, - useInteractiveGuideline: true, - interactive: false, - showLegend: true, - showXAxis: true, - showYAxis: true, - showControls: false - }); - - chart.margin({'left': 35, 'right': 35}); - - chart.height(height); - - if (scope.forcey) { - chart.yDomain([0, scope.forcey]); - } - - chart.x(D3Service.xFunction()); - chart.y(D3Service.yFunction()); - - chart.xAxis.tickFormat(D3Service.xAxisTickFormat()); - - if (scope.percentage) { - yAxisTickFormat = D3Service.yAxisPercentageTickFormat(); - chart.yAxis.tickFormat(); - } else if (scope.integer) { - yAxisTickFormat = D3Service.yAxisIntegerTickFormat(); - chart.yAxis.tickFormat(); - } - - chart.yAxis.tickFormat(yAxisTickFormat); - - - /* Woraround for NVD3 Bug #1081 (https://github.com/novus/nvd3/issues/1081) */ - - chart.interactiveLayer.tooltip.contentGenerator(function (d) { - var header = d.value; - var headerhtml = '' + header + ''; - - var bodyhtml = ''; - var series = d.series; - series.forEach(function (d) { - bodyhtml = bodyhtml + '
' + d.key + '' + yAxisTickFormat(d.value) + ''; - }); - bodyhtml = bodyhtml + ''; - return '' + headerhtml + bodyhtml + '
'; - }); - - /* End of workaround */ - - nv.utils.windowResize(chart.update); - - d3.select('#' + scope.id + ' svg') - .datum(scope.data) - .style('height', height + 'px') - .transition().duration(0) - .call(chart); - - return chart; - }); - - scope.$on('updateMetrics', function () { - chart.update(); - }); - } - - return { - restrict: 'A', - templateUrl: 'app/charts/nvd3-chart.html', - scope: { - data: '=', - percentage: '=', - integer: '=', - forcey: '=' - }, - link: link - }; - } - - areaStackedTimeSeries.$inject = [ - '$rootScope', - '$log', - 'D3Service' - ]; - - angular - .module('app.charts') - .directive('areaStackedTimeSeries', areaStackedTimeSeries); -})(); diff --git a/src/app/charts/bcc.js b/src/app/charts/bcc.js new file mode 100644 index 000000000..979375c85 --- /dev/null +++ b/src/app/charts/bcc.js @@ -0,0 +1,375 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { + customTitleAndKeylabel, + divideByOnlyMetric, + renameMetric, + onlyLatestValues, + filterKeepSelectedMetrics, + mapInstanceDomains, + ceiling, + cumulativeTransform, + mathValuesSelective, + filterAboveMaxInstanceValue, +} from '../processors/transforms' +import MultiTable from '../components/Charts/MultiTable.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' +import Heatmap from '../components/Charts/Heatmap.jsx' +import HeatmapSettingsModal from '../components/SettingsModals/HeatmapSettingsModal.jsx' +import { thresholds, colors } from '../components/Charts/cividis.js' + +export default function _charts(config) { + if (!config.enableBcc) return [] + + return [ + { + chartId: 'bcc-biolatency', + group: 'BCC/BPF', + title: 'biolatency', + tooltipText: 'block device I/O latency heatmap', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.disk.all.latency' + ], + transforms: [ + cumulativeTransform(), + ceiling(), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + }, + + { + chartId: 'bcc-runqlat', + group: 'BCC/BPF', + title: 'runqlat', + tooltipText: 'run queue latency heatmap', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.runq.latency' + ], + transforms: [ + cumulativeTransform(), + ceiling(), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + }, + + { + chartId: 'bcc-ext4lat', + group: 'BCC/BPF', + title: 'ext4dist', + tooltipText: 'ext4 operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.ext4.latency.open', + 'bcc.fs.ext4.latency.read', + 'bcc.fs.ext4.latency.write', + 'bcc.fs.ext4.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.ext4.latency.open', + 'bcc.fs.ext4.latency.read', + 'bcc.fs.ext4.latency.write', + 'bcc.fs.ext4.latency.fsync', + ], + }, + + { + chartId: 'bcc-xfslat', + group: 'BCC/BPF', + title: 'xfsdist', + tooltipText: 'xfs operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.xfs.latency.open', + 'bcc.fs.xfs.latency.read', + 'bcc.fs.xfs.latency.write', + 'bcc.fs.xfs.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.xfs.latency.open', + 'bcc.fs.xfs.latency.read', + 'bcc.fs.xfs.latency.write', + 'bcc.fs.xfs.latency.fsync', + ], + }, + + { + chartId: 'bcc-zfslat', + group: 'BCC/BPF', + title: 'zfsdist', + tooltipText: 'zfs operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.zfs.latency.open', + 'bcc.fs.zfs.latency.read', + 'bcc.fs.zfs.latency.write', + 'bcc.fs.zfs.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.zfs.latency.open', + 'bcc.fs.zfs.latency.read', + 'bcc.fs.zfs.latency.write', + 'bcc.fs.zfs.latency.fsync', + ], + }, + + { + chartId: 'bcc-tcplife', + group: 'BCC/BPF', + title: 'tcplife', + tooltipText: 'TCP session life and data rates', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.net.tcp.pid', + 'bcc.proc.io.net.tcp.comm', + 'bcc.proc.io.net.tcp.laddr', + 'bcc.proc.io.net.tcp.lport', + 'bcc.proc.io.net.tcp.daddr', + 'bcc.proc.io.net.tcp.dport', + 'bcc.proc.io.net.tcp.tx', + 'bcc.proc.io.net.tcp.rx', + 'bcc.proc.io.net.tcp.duration', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.net.tcp.pid': 'PID', + 'bcc.proc.io.net.tcp.comm': 'COMM', + 'bcc.proc.io.net.tcp.laddr': 'LADDR', + 'bcc.proc.io.net.tcp.lport': 'LPORT', + 'bcc.proc.io.net.tcp.daddr': 'DADDR', + 'bcc.proc.io.net.tcp.dport': 'DPORT', + 'bcc.proc.io.net.tcp.tx': 'TX_KB', + 'bcc.proc.io.net.tcp.rx': 'RX_KB', + 'bcc.proc.io.net.tcp.duration': 'MS' + }), + divideByOnlyMetric(1024, [ 'TX_KB', 'RX_KB' ]), + divideByOnlyMetric(1000, [ 'MS' ]), + mathValuesSelective(Math.round, mi => ['TX_KB', 'RX_KB', 'MS'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-execsnoop', + group: 'BCC/BPF', + title: 'execsnoop', + tooltipText: 'trace new process launches', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.exec.comm', + 'bcc.proc.exec.pid', + 'bcc.proc.exec.ppid', + 'bcc.proc.exec.ret', + 'bcc.proc.exec.args', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.exec.comm': 'COMM', + 'bcc.proc.exec.pid': 'PID', + 'bcc.proc.exec.ppid': 'PPID', + 'bcc.proc.exec.ret': 'RET', + 'bcc.proc.exec.args': 'ARGS', + }), + ], + }, + + { + chartId: 'bcc-tcpretrans', + group: 'BCC/BPF', + title: 'tcpretrans', + tooltipText: 'TCP retransmit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.io.net.tcp.retrans.count', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + // TODO test biotop (could not get it working on my machine) + { + chartId: 'bcc-biotop', + group: 'BCC/BPF', + title: 'biotop', + tooltipText: 'block device I/O "top"', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.perdev.pid', + 'bcc.proc.io.perdev.comm', + 'bcc.proc.io.perdev.direction', + 'bcc.proc.io.perdev.major', + 'bcc.proc.io.perdev.minor', + 'bcc.proc.io.perdev.disk', + 'bcc.proc.io.perdev.io', + 'bcc.proc.io.perdev.bytes', + 'bcc.proc.io.perdev.duration', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.perdev.pid': 'PID', + 'bcc.proc.io.perdev.comm': 'COMM', + 'bcc.proc.io.perdev.direction': 'D', + 'bcc.proc.io.perdev.major': 'MAJ', + 'bcc.proc.io.perdev.minor': 'MIN', + 'bcc.proc.io.perdev.disk': 'DISK', + 'bcc.proc.io.perdev.io': 'I/O', + 'bcc.proc.io.perdev.bytes': 'Kbytes', // will be shortly + 'bcc.proc.io.perdev.duration': 'AVGms', // will be shortly + }), + divideByOnlyMetric(1024, [ 'Kbytes' ]), + divideByOnlyMetric(1000, [ 'AVGms' ]), + mathValuesSelective(Math.round, mi => ['Kbytes', 'AVGms'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-tcptop', + group: 'BCC/BPF', + title: 'tcptop', + tooltipText: 'tcp throughput "top"', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.net.tcptop.pid', + 'bcc.proc.io.net.tcptop.comm', + 'bcc.proc.io.net.tcptop.laddr', + 'bcc.proc.io.net.tcptop.lport', + 'bcc.proc.io.net.tcptop.daddr', + 'bcc.proc.io.net.tcptop.dport', + 'bcc.proc.io.net.tcptop.rx', + 'bcc.proc.io.net.tcptop.tx', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.net.tcptop.pid': 'PID', + 'bcc.proc.io.net.tcptop.comm': 'COMM', + 'bcc.proc.io.net.tcptop.laddr': 'LADDR', + 'bcc.proc.io.net.tcptop.lport': 'LPORT', + 'bcc.proc.io.net.tcptop.daddr': 'DADDR', + 'bcc.proc.io.net.tcptop.dport': 'DPORT', + 'bcc.proc.io.net.tcptop.rx': 'RX_KB', + 'bcc.proc.io.net.tcptop.tx': 'TX_KB', + }), + divideByOnlyMetric(1024, [ 'TX_KB', 'RX_KB' ]), + mathValuesSelective(Math.round, mi => ['TX_KB', 'RX_KB'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-tracepoint-hits', + group: 'BCC/BPF', + title: 'tracepoint hits', + tooltipText: 'kernel tracepoint hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.tracepoint.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + { + chartId: 'bcc-usdt-hits', + group: 'BCC/BPF', + title: 'USDT hits', + tooltipText: 'user-level statically defined tracepoint hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.usdt.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + { + chartId: 'bcc-uprobe-hits', + group: 'BCC/BPF', + title: 'uprobe hits', + tooltipText: 'uprobe hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.uprobe.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + ] +} diff --git a/src/app/charts/container.js b/src/app/charts/container.js new file mode 100644 index 000000000..bb887ebbe --- /dev/null +++ b/src/app/charts/container.js @@ -0,0 +1,381 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import Chart from '../components/Charts/Chart.jsx' + +import { + renameMetric, + mapInstanceDomains, + mapContainerNames, + divideByOnlyMetric, + timesliceCalculations, + customTitleAndKeylabel, + kbToGb, + combineValuesByTitle, + defaultTitleAndKeylabel, + divideBy, + cumulativeTransform, + cumulativeTransformOnlyMetrics, + filterForContainerId, + // log, +} from '../processors/transforms' +import { percentage, integer, number } from '../processors/formats' + +import { + firstValueInObject, + keyValueArrayToObjectReducer, +} from '../utils' + +export default function _charts(config) { + if (!config.enableContainerWidgets) return [] + + const containerNameResolver = config.useCgroupId ? (c => c.cgroup) : (c => c.containerId) + + return [ + { + chartId: 'container-percont-cpu', + group: 'Container', + title: 'Per-Container CPU Utilization', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpuacct.usage', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpuacct.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpuacct.usage' ]), + defaultTitleAndKeylabel(), + cumulativeTransform(), + divideBy(1000 * 1000 * 1000), + ], + yTickFormat: percentage, + }, + + { + chartId: 'container-percont-mem', + group: 'Container', + title: 'Per-Container Memory Usage (Mb)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage' ]), + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-total-cont-mem', + group: 'Container', + title: 'Total Container Memory Usage (Mb)', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'cgroup.memory.usage', + 'mem.util.used', + 'mem.util.free', + ], + transforms: [ + // make sure that all the cgroup memory uses the same metric and then add them together + // this sums all the values across the cgroup (map + fix are so that the cgroup size is calculated only on containers) + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage' ], containerNameResolver), + // do not filter here, we want totals + customTitleAndKeylabel(metric => metric), + combineValuesByTitle((a, b) => a + b), + divideByOnlyMetric(1024, [ 'mem.util.used', 'mem.util.free' ]), + divideByOnlyMetric(1024 * 1024, [ 'cgroup.memory.usage' ]), + timesliceCalculations({ + 'host used': (values) => ({ '-1': values['mem.util.used']['-1'] - firstValueInObject(values['cgroup.memory.usage']) }), + 'free (unused)': (values) => ({ '-1': values['mem.util.free']['-1'] }), + 'container used': (values) => ({ '-1': firstValueInObject(values['cgroup.memory.usage']) }), + }), + // add back a title and keylabel + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-mem-headroom', + group: 'Container', + title: 'Per-Container Memory Headroom (Mb)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', // bytes + 'cgroup.memory.limit', // bytes + 'mem.physmem', // kilobytes + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage', 'cgroup.memory.limit' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + divideByOnlyMetric(1024, [ 'mem.physmem' ]), + divideByOnlyMetric(1024*1024, [ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + timesliceCalculations({ + // TODO this calculation is substantially different from the old vector calculation + 'headroom': (slice) => { + let containerNames = Object.keys(slice['cgroup.memory.usage'] || {}) + let headrooms = containerNames.map(cname => ({ + key: cname, + value: Math.min(slice['cgroup.memory.limit'][cname], slice['mem.physmem']['-1']) - slice['cgroup.memory.usage'][cname] + })) + return headrooms.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + /* + * This is not used at netflix, this is for proportional IO blkio cgroup controller + * Is it needed by anyone? + */ + + /* + { + chartId: 'container-disk-iops', + group: 'Container', + title: 'Container Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.io_serviced.read', + 'cgroup.blkio.all.io_serviced.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.io_serviced.read', 'cgroup.blkio.all.io_serviced.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.io_serviced.read', 'cgroup.blkio.all.io_serviced.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.io_serviced.read': 'read', + 'cgroup.blkio.all.io_serviced.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'container-disk-tput', + group: 'Container', + title: 'Container Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.io_service_bytes.read', + 'cgroup.blkio.all.io_service_bytes.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.io_service_bytes.read', 'cgroup.blkio.all.io_service_bytes.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.io_service_bytes.read', 'cgroup.blkio.all.io_service_bytes.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.io_service_bytes.read': 'read', + 'cgroup.blkio.all.io_service_bytes.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + */ + + /* https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt + * - Number of IOs (bio) issued to the disk by the group. These + * are further divided by the type of operation - read or write, sync + * or async. First two fields specify the major and minor number of the + * device, third field specifies the operation type and the fourth field + * specifies the number of IOs. + */ + { + chartId: 'container-disk-iops', + group: 'Container', + title: 'Container Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.throttle.io_serviced.read', + 'cgroup.blkio.all.throttle.io_serviced.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.throttle.io_serviced.read', 'cgroup.blkio.all.throttle.io_serviced.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.throttle.io_serviced.read', 'cgroup.blkio.all.throttle.io_serviced.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.throttle.io_serviced.read': 'read', + 'cgroup.blkio.all.throttle.io_serviced.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'container-disk-tput', + group: 'Container', + title: 'Container Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.throttle.io_service_bytes.read', + 'cgroup.blkio.all.throttle.io_service_bytes.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.throttle.io_service_bytes.read', + 'cgroup.blkio.all.throttle.io_service_bytes.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.throttle.io_service_bytes.read', 'cgroup.blkio.all.throttle.io_service_bytes.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.throttle.io_service_bytes.read': 'read', + 'cgroup.blkio.all.throttle.io_service_bytes.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-cpu-sched', + group: 'Container', + title: 'Per-Container CPU Scheduler', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpusched.shares', + 'cgroup.cpusched.periods', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ]), + renameMetric({ + 'cgroup.cpusched.shares': 'shares', + 'cgroup.cpusched.periods': 'periods', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-cpu-headroom', + group: 'Container', + title: 'Per-Container CPU Headroom', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'cgroup.cpuacct.usage', + 'cgroup.cpusched.shares', + 'cgroup.cpusched.periods', + 'hinv.ncpu', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods', 'cgroup.cpuacct.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpuacct.usage', 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ]), + cumulativeTransformOnlyMetrics([ 'cgroup.cpuacct.usage' ]), + divideByOnlyMetric(1000 * 1000 * 1000, [ 'cgroup.cpuacct.usage' ]), + timesliceCalculations({ + // TODO this calculation is substantially different from the old vector calculation + // surely it should be something like: headroom = limits - utilisation + 'usage': (slice) => slice['cgroup.cpuacct.usage'] || [], + 'limit': (slice) => { + let containerNames = Object.keys(slice['cgroup.cpusched.periods'] || {}) + let limits = containerNames.map(cname => ({ + key: cname, + value: slice['cgroup.cpusched.shares'][cname] + ? (slice['cgroup.cpusched.shares'][cname] / slice['cgroup.cpusched.periods'][cname]) + : slice['hinv.ncpu']['-1'] + })) + return limits.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'container-percont-cpu-throttle', + group: 'Container', + title: 'Per-Container Throttled CPU', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpusched.throttled_time', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.throttled_time' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpusched.throttled_time' ]), + cumulativeTransform(), + customTitleAndKeylabel((metric, instance) => instance), + ], + }, + + { + chartId: 'container-percont-mem-util', + group: 'Container', + title: 'Per-Container Memory Utilization (%)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', + 'cgroup.memory.limit', + 'mem.physmem', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage', 'cgroup.memory.limit' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + divideByOnlyMetric(1024, [ 'mem.physmem' ]), + divideByOnlyMetric(1024 * 1024, [ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + timesliceCalculations({ + 'utilization': (slice) => { + let containerNames = Object.keys(slice['cgroup.memory.usage'] || {}) + let utilizations = containerNames.map(cname => ({ + key: cname, + value: (cname in slice['cgroup.memory.limit']) + ? (slice['cgroup.memory.usage'][cname] / Math.min(slice['cgroup.memory.limit'][cname], slice['mem.physmem']['-1'])) + : (slice['cgroup.memory.usage'][cname] / slice['mem.physmem']['-1']) + })) + return utilizations.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + ] +} diff --git a/src/app/charts/cpu-flame-graph.directive.js b/src/app/charts/cpu-flame-graph.directive.js deleted file mode 100644 index f6c750333..000000000 --- a/src/app/charts/cpu-flame-graph.directive.js +++ /dev/null @@ -1,52 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -(function () { - 'use strict'; - - function cpuFlameGraph($rootScope, $timeout, FlameGraphService, VectorService) { - - function link(scope) { - scope.host = $rootScope.properties.host; - scope.port = $rootScope.properties.port; - scope.context = $rootScope.properties.context; - scope.ready = false; - scope.processing = false; - scope.id = VectorService.getGuid(); - scope.generateFlameGraph = function(){ - FlameGraphService.generate(); - scope.ready = true; - scope.processing = true; - $timeout(function () { - scope.processing = false; - }, 65000); - }; - } - - return { - restrict: 'A', - templateUrl: 'app/charts/cpu-flame-graph.html', - link: link - }; - } - - angular - .module('app.charts') - .directive('cpuFlameGraph', cpuFlameGraph); - -})(); diff --git a/src/app/charts/cpu-flame-graph.html b/src/app/charts/cpu-flame-graph.html deleted file mode 100644 index 9d84e2863..000000000 --- a/src/app/charts/cpu-flame-graph.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
-

Click on the button below to generate your CPU Flame Graph! (60 sec)

-
- -
-
- Error! - {{flash.message}} -
-
-
-
- Success! - {{flash.message}} -
-
-
- -
-
diff --git a/src/app/charts/cpu.js b/src/app/charts/cpu.js new file mode 100644 index 000000000..f17c20caa --- /dev/null +++ b/src/app/charts/cpu.js @@ -0,0 +1,216 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import simpleModel from '../processors/simpleModel' +import { onlyLatestValues, timesliceCalculations, defaultTitleAndKeylabel, divideBy, divideBySeries, cumulativeTransform } from '../processors/transforms' +import { keyValueArrayToObjectReducer } from '../utils' +import { percentage, integer, number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' + +const PswitchHelp = () =>

Kernel context switches per second + with a super long explanation

+ +export default [ + { + chartId: 'cpu-pswitch', + group: 'CPU', + title: 'Context Switches per second', + helpComponent: PswitchHelp, + tooltipText: 'Kernel context switches per second', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.pswitch' + ], + transforms: [ + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'cpu-utilization', + group: 'CPU', + title: 'CPU Utilization', + processor: simpleModel, + visualisation: Chart, + tooltipText: 'CPU utilization, both system and CPU', + lineType: 'stackedarea', + metricNames: [ + 'kernel.all.cpu.sys', + 'kernel.all.cpu.user', + 'hinv.ncpu', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-utilization-sys', + group: 'CPU', + title: 'CPU Utilization (System)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.cpu.sys', + 'hinv.ncpu', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-utilization-user', + group: 'CPU', + title: 'CPU Utilization (user)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.cpu.user', + 'hinv.ncpu' + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-loadavg', + group: 'CPU', + title: 'Load Average', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.load', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-loadavg-table', + group: 'CPU', + title: 'Load Average (table)', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'kernel.all.load', + ], + transforms: [ + defaultTitleAndKeylabel(), + onlyLatestValues(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-percpu-utilization', + group: 'CPU', + title: 'Per-CPU Utilization', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.sys', + 'kernel.percpu.cpu.user', + ], + transforms: [ + divideBy(1000), + cumulativeTransform(), + timesliceCalculations({ + 'cpu [sys+user]': (values) => { + let cpus = Object.keys(values['kernel.percpu.cpu.sys']) + let utilizations = cpus.map(cpu => ({ + key: cpu, + value: (values['kernel.percpu.cpu.sys'][cpu] || 0) + (values['kernel.percpu.cpu.user'][cpu] || 0) + })) + return utilizations.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-percpu-utilization-sys', + group: 'CPU', + title: 'Per-CPU Utilization (System)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.sys', + ], + transforms: [ + divideBy(1000), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-percpu-utilization-user', + group: 'CPU', + title: 'Per-CPU Utilization (User)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.user', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-runnable', + group: 'CPU', + title: 'Runnable', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.runnable', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + } +] diff --git a/src/app/charts/custom.js b/src/app/charts/custom.js new file mode 100644 index 000000000..db3bef10c --- /dev/null +++ b/src/app/charts/custom.js @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import customChartModel from '../processors/customChartModel' +import customTableModel from '../processors/customTableModel' +import { number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' + +import CustomSettingsModal from '../components/SettingsModals/CustomSettingsModal.jsx' + +export default function _charts(config) { + if (!config.enableCustomWidgetFeature) return [] + + return [ + { + chartId: 'custom-chart', + group: 'Custom', + title: 'Custom chart', + tooltipText: 'Allows you to configure a basic chart displaying any available metric', + processor: customChartModel, + visualisation: Chart, + // metrics spec and transforms are handled in the customModel + metricNames: [], + lineType: 'line', + converted: false, + conversionFunction: '', + forceYAxis: false, + percentage: false, + cumulative: false, + settingsComponent: CustomSettingsModal, + yTickFormat: number, + }, + { + chartId: 'custom-table', + group: 'Custom', + title: 'Custom table', + tooltipText: 'Allows you to present a table displaying latest data of any available metric', + processor: customTableModel, + visualisation: SimpleTable, + // metrics spec and transforms are handled in the customModel + metricNames: [], + converted: false, + conversionFunction: '', + percentage: false, + cumulative: false, + settingsComponent: CustomSettingsModal, + yTickFormat: number, + }, + /* + * TODO add this when url can handle full serialisation + * otherwise this is only really useful for bundles, as it cannot be 'persisted' + { + chartId: 'text-label', + group: 'Custom', + title: 'Text label', + tooltipText: 'Displays a text panel with a message of your choice (edit settings)', + processor: nullModel, + visualisation: TextLabel, + settingsComponent: TextLabelModal, + content: '', + size: 'medium', + }, + */ + ] +} diff --git a/src/app/charts/disk-latency-heatmap.directive.js b/src/app/charts/disk-latency-heatmap.directive.js deleted file mode 100644 index 22a661b4f..000000000 --- a/src/app/charts/disk-latency-heatmap.directive.js +++ /dev/null @@ -1,52 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -(function () { - 'use strict'; - - function diskLatencyHeatMap($rootScope, $timeout, HeatMapService, VectorService) { - - function link(scope) { - scope.host = $rootScope.properties.host; - scope.port = $rootScope.properties.port; - scope.context = $rootScope.properties.context; - scope.ready = false; - scope.processing = false; - scope.id = VectorService.getGuid(); - scope.generateHeatMap = function(){ - HeatMapService.generate(); - scope.ready = true; - scope.processing = true; - $timeout(function () { - scope.processing = false; - }, 150000); - }; - } - - return { - restrict: 'A', - templateUrl: 'app/charts/disk-latency-heatmap.html', - link: link - }; - } - - angular - .module('app.charts') - .directive('diskLatencyHeatMap', diskLatencyHeatMap); - -})(); diff --git a/src/app/charts/disk-latency-heatmap.html b/src/app/charts/disk-latency-heatmap.html deleted file mode 100644 index 990190f3d..000000000 --- a/src/app/charts/disk-latency-heatmap.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
-

Click on the button below to generate your Disk Latency Heat Map! (140 sec)

-
- -
-
- Error! - {{flash.message}} -
-
-
-
- Success! - {{flash.message}} -
-
-
- -
-
diff --git a/src/app/charts/disk.js b/src/app/charts/disk.js new file mode 100644 index 000000000..367d812e2 --- /dev/null +++ b/src/app/charts/disk.js @@ -0,0 +1,98 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { mapInstanceDomains, defaultTitleAndKeylabel, divideBy, cumulativeTransform } from '../processors/transforms' +import { percentage, integer, number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'disk-iops', + group: 'Disk', + title: 'Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read', + 'disk.dev.write', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'disk-latency', + group: 'Disk', + title: 'Disk Latency', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read_rawactive', + 'disk.dev.write_rawactive', + 'disk.dev.read', + 'disk.dev.write', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'disk-throughput', + group: 'Disk', + title: 'Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read_bytes', + 'disk.dev.write_bytes', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'disk-utilization', + group: 'Disk', + title: 'Disk Utilization (%)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.avactive', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, +] diff --git a/src/app/charts/flamegraphs.js b/src/app/charts/flamegraphs.js new file mode 100644 index 000000000..b6acf58ca --- /dev/null +++ b/src/app/charts/flamegraphs.js @@ -0,0 +1,193 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import Flamegraph from '../components/Charts/Flamegraph.jsx' +import { onlyLatestValues } from '../processors/transforms' + +import CpuFlamegraphHelp from '../help/CpuFlamegraphHelp.jsx' +import PackagenameCpuFlamegraphHelp from '../help/PackagenameCpuFlamegraphHelp.jsx' +import UninlinedCpuFlamegraphHelp from '../help/UninlinedCpuFlamegraphHelp.jsx' +import PagefaultFlamegraphHelp from '../help/PagefaultFlamegraphHelp.jsx' +import DiskioFlamegraphHelp from '../help/DiskioFlamegraphHelp.jsx' +import IpcFlamegraphHelp from '../help/IpcFlamegraphHelp.jsx' +import CswFlamegraphHelp from '../help/CswFlamegraphHelp.jsx' +import OffcpuFlamegraphHelp from '../help/OffcpuFlamegraphHelp.jsx' +import OffwakeFlamegraphHelp from '../help/OffwakeFlamegraphHelp.jsx' + +export default function _charts(config) { + if (!config.enableFlamegraphs) return [] + + return [ + { + chartId: 'fg-cpu', + group: 'Flamegraphs', + title: 'CPU', + helpComponent: CpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.cpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-pname-cpu', + group: 'Flamegraphs', + title: 'Package name CPU', + helpComponent: PackagenameCpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU, collapsed Java frames to package level', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.pnamecpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-uninlined-cpu', + group: 'Flamegraphs', + title: 'Uninlined CPU', + helpComponent: UninlinedCpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU, without inlining', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.uninlinedcpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-pagefault', + group: 'Flamegraphs', + title: 'Page faults', + helpComponent: PagefaultFlamegraphHelp, + tooltipText: 'Show call stacks on CPU during page faults', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.pagefaultflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-diskio', + group: 'Flamegraphs', + title: 'Disk I/O', + helpComponent: DiskioFlamegraphHelp, + tooltipText: 'Show disk I/O', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.diskioflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-ipc', + group: 'Flamegraphs', + title: 'IPC', + helpComponent: IpcFlamegraphHelp, + tooltipText: 'Inter-process call flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.ipcflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-csw', + group: 'Flamegraphs', + title: 'CSW', + helpComponent: CswFlamegraphHelp, + tooltipText: 'Context switch flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.cswflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + + { + chartId: 'fg-offcpu', + group: 'Flamegraphs', + title: 'Off CPU time', + helpComponent: OffcpuFlamegraphHelp, + tooltipText: 'Off CPU time flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.offcpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + + { + chartId: 'fg-offwake', + group: 'Flamegraphs', + title: 'Off wake time', + helpComponent: OffwakeFlamegraphHelp, + tooltipText: 'Off wake time flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.offwakeflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + ] +} diff --git a/src/app/charts/index.js b/src/app/charts/index.js new file mode 100644 index 000000000..953b8645b --- /dev/null +++ b/src/app/charts/index.js @@ -0,0 +1,60 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* eslint-disable */ + +import { flatten } from '../utils' +import config from 'config' + +// all the remaining components, particularly vector specific angular components +function requireAll(requireContext) { + const validKeys = requireContext.keys().filter(f => f !== './index.js') + const requires = validKeys.map(requireContext) + return Array.isArray(requires) ? requires : [requires] +} + +function isValidChart(chart, index, charts) { + let errors = [] + + if (!chart.chartId) { + errors.push('chart is missing chartId') + } + if (!chart.group || !chart.title) { + errors.push('chart is missing group or title') + } + if (!chart.processor) { + errors.push('chart processor is not valid') + } + if (charts.findIndex(c => c.chartId === chart.chartId) !== index) { + errors.push('found a duplicate chartId') + } + + if (errors.length) { + console.warn('chart had errors, will not be loaded', chart, errors) + } + return !errors.length +} + +const requires = requireAll(require.context('./', false, /\.js$/)) +const charts = requires + .map(r => r.default) + .map(r => (typeof r === 'function') ? r(config) : r) // if it is a function, call it + .reduce(flatten, []) + .filter(isValidChart) + +export default charts diff --git a/src/app/charts/line-timeseries.directive.js b/src/app/charts/line-timeseries.directive.js deleted file mode 100644 index 8175f2fed..000000000 --- a/src/app/charts/line-timeseries.directive.js +++ /dev/null @@ -1,105 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3, nv*/ - -(function () { - 'use strict'; - - function lineTimeSeries($rootScope, $log, D3Service) { - - function link(scope) { - scope.id = D3Service.getId(); - scope.flags = $rootScope.flags; - - var chart; - - nv.addGraph(function () { - - var height = 250; - - chart = nv.models.lineChart().options({ - duration: 0, - useInteractiveGuideline: true, - interactive: false, - showLegend: true, - showXAxis: true, - showYAxis: true - }); - - chart.margin({'left': 35, 'right': 35}); - - chart.height(height); - - if (scope.forcey) { - chart.forceY([0, scope.forcey]); - } - - chart.x(D3Service.xFunction()); - chart.y(D3Service.yFunction()); - - chart.xAxis.tickFormat(D3Service.xAxisTickFormat()); - - if (scope.percentage) { - chart.yAxis.tickFormat(D3Service.yAxisPercentageTickFormat()); - } else if (scope.integer) { - chart.yAxis.tickFormat(D3Service.yAxisIntegerTickFormat()); - } else { - chart.yAxis.tickFormat(D3Service.yAxisTickFormat()); - } - - nv.utils.windowResize(chart.update); - - d3.select('#' + scope.id + ' svg') - .datum(scope.data) - .style('height', height + 'px') - .transition().duration(0) - .call(chart); - - return chart; - }); - - scope.$on('updateMetrics', function () { - chart.update(); - }); - } - - return { - restrict: 'A', - templateUrl: 'app/charts/nvd3-chart.html', - scope: { - data: '=', - percentage: '=', - integer: '=', - forcey: '=' - }, - link: link - }; - } - - lineTimeSeries.$inject = [ - '$rootScope', - '$log', - 'D3Service' - ]; - - angular - .module('app.charts') - .directive('lineTimeSeries', lineTimeSeries); - -})(); diff --git a/src/app/charts/memory.js b/src/app/charts/memory.js new file mode 100644 index 000000000..122432f82 --- /dev/null +++ b/src/app/charts/memory.js @@ -0,0 +1,116 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { timesliceCalculations, defaultTitleAndKeylabel, cumulativeTransform, kbToGb } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'memory-utilization-cached', + group: 'Memory', + title: 'Memory Utilization (Cached)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.cached', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization-free', + group: 'Memory', + title: 'Memory Utilization (Free)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.free', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization', + group: 'Memory', + title: 'Memory Utilization', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'mem.util.cached', + 'mem.util.used', + 'mem.util.free', + 'mem.util.bufmem', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + timesliceCalculations({ + 'free (unused)': (slices) => ({ '-1': slices['mem.util.free']['-1'] }), + 'free (cache)': (slices) => ({ '-1': slices['mem.util.cached']['-1'] + slices['mem.util.bufmem']['-1'] }), + 'application': (slices) => ({ '-1': slices['mem.util.used']['-1'] - slices['mem.util.cached']['-1'] - slices['mem.util.bufmem']['-1'] }), + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization-used', + group: 'Memory', + title: 'Memory Utilization (Used)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.used', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-page-faults', + group: 'Memory', + title: 'Page Faults', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'mem.vmstat.pgfault', + 'mem.vmstat.pgmajfault', + ], + transforms: [ + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, +] diff --git a/src/app/charts/networkNetwork.js b/src/app/charts/networkNetwork.js new file mode 100644 index 000000000..03f297ee0 --- /dev/null +++ b/src/app/charts/networkNetwork.js @@ -0,0 +1,149 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { renameMetric, defaultTitleAndKeylabel, mapInstanceDomains, cumulativeTransform } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import FilterModal from '../components/SettingsModals/FilterModal.jsx' + +export default [ + { + chartId: 'network-drops-in', + group: 'Network', + title: 'Network Drops (In)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-drops-inout', + group: 'Network', + title: 'Network Drops (In + Out)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.drops', + 'network.interface.out.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-drops-out', + group: 'Network', + title: 'Network Drops (Out)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.out.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + // TODO should this chart have the container aware warning? + chartId: 'network-packets', + group: 'Network', + title: 'Network Packets', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.packets', + 'network.interface.out.packets', + ], + transforms: [ + mapInstanceDomains(), + FilterModal.filterInstanceIncludesFilterText(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + settingsComponent: FilterModal, + filter: '', + yTickFormat: integer, + }, + + { + chartId: 'network-retransmits', + group: 'Network', + title: 'Network Retransmits', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcp.retranssegs', + 'network.tcp.timeouts', + 'network.tcp.listendrops', + 'network.tcp.fastretrans', + 'network.tcp.slowstartretrans', + 'network.tcp.synretrans', + ], + transforms: [ + cumulativeTransform(), + renameMetric({ + 'network.tcp.retranssegs': 'retranssegs', + 'network.tcp.timeouts': 'timeouts', + 'network.tcp.listendrops': 'listendrops', + 'network.tcp.fastretrans': 'fastretrans', + 'network.tcp.slowstartretrans': 'slowstartretrans', + 'network.tcp.synretrans': 'synretrans', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-throughput', + group: 'Network', + title: 'Network Throughput (kB)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.bytes', + 'network.interface.out.bytes', + ], + transforms: [ + mapInstanceDomains(), + FilterModal.filterInstanceIncludesFilterText(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + settingsComponent: FilterModal, + filter: '', + yTickFormat: integer, + } +] diff --git a/src/app/charts/networkTcp.js b/src/app/charts/networkTcp.js new file mode 100644 index 000000000..7c759410c --- /dev/null +++ b/src/app/charts/networkTcp.js @@ -0,0 +1,86 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { defaultTitleAndKeylabel } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'network-tcp-closewait', + group: 'Network', + title: 'TCP Connections (Close Wait)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.close_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp-established', + group: 'Network', + title: 'TCP Connections (Established)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.established', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp', + group: 'Network', + title: 'TCP Connections', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.established', + 'network.tcpconn.time_wait', + 'network.tcpconn.close_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp-timewait', + group: 'Network', + title: 'TCP Connections (Time Wait)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.time_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + } +] diff --git a/src/app/charts/nvd3-chart.html b/src/app/charts/nvd3-chart.html deleted file mode 100644 index 388b6ffc2..000000000 --- a/src/app/charts/nvd3-chart.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
- -
-
diff --git a/src/app/charts/nvd3-tooltip.js b/src/app/charts/nvd3-tooltip.js deleted file mode 100644 index 94a3148e7..000000000 --- a/src/app/charts/nvd3-tooltip.js +++ /dev/null @@ -1,304 +0,0 @@ -/*global d3, nv, document*/ - -'use strict'; - -nv.models.tooltip = function() { - -var id = 'nvtooltip-' + Math.floor(Math.random() * 100000), // Generatooltip() object. - data = null, - gravity = 'w', // Can be 'n','s','e','w'. Determines how tooltip is positioned. - distance = 25, // Distance to offset tooltip from the mouse location. - snapDistance = 0, // Tolerance a - // fixedTop = null, // If not null, this fixes the top position of the tooltip. - classes = null, // Attaches additional CSS classes to the tooltip DIV that is created. - chartContainer = null, // Parent dom element of the SVG that holds the chart. - hidden = true, // Start off hidden, toggle with hide/show functions below. - hideDelay = 200, // Delay (in ms) before the tooltip hides after calling hide(). - tooltip = null, // d3 select of the tooltip div. - lastPosition = { left: null, top: null }, // Last position the tooltip was in. - enabled = true, // True -> tooltips are rendered. False -> don't render tooltips. - duration = 100, // Tooltip movement duration, in ms. - headerEnabled = true, // If is to show the tooltip header. - nvPointerEventsClass = 'nv-pointer-events-none'; // CSS class to specify whether element should not have -var position = function() { - return { - left: d3.event.clientX, - top: d3.event.clientY - }; -}; - -// Format function for the tooltip values column. -var valueFormatter = function(d) { - return d; -}; - -// Format function for the tooltip header value. -var headerFormatter = function(d) { - return d; -}; - -var keyFormatter = function(d) { - return d; -}; - -// By default, the tooltip model renders a beautiful table inside a DIV. -// You can override this function if a custom tooltip is desired. -var contentGenerator = function(d) { - if (d === null) { - return ''; - } - - var table = d3.select(document.createElement('table')); - if (headerEnabled) { - var theadEnter = table.selectAll('thead') - .data([d]) - .enter().append('thead'); - - theadEnter.append('tr') - .append('td') - .attr('colspan', 3) - .append('strong') - .classed('x-value', true) - .html(headerFormatter(d.value)); - } - - var tbodyEnter = table.selectAll('tbody') - .data([d]) - .enter().append('tbody'); - - var trowEnter = tbodyEnter.selectAll('tr') - .data(function(p) { return p.series; }) - .enter() - .append('tr') - .classed('highlight', function(p) { return p.highlight; }); - - trowEnter.append('td') - .classed('legend-color-guide',true) - .append('div') - .style('background-color', function(p) { return p.color; }); - - trowEnter.append('td') - .classed('key',true) - .classed('total',function(p) { return !!p.total; }) - .html(function(p, i) { return keyFormatter(p.key, i); }); - - trowEnter.append('td') - .classed('value',true) - .html(function(p, i) { return valueFormatter(p.value, i); }); - - trowEnter.selectAll('td').each(function(p) { - if (p.highlight) { - var opacityScale = d3.scale.linear().domain([0,1]).range(['#fff',p.color]); - var opacity = 0.6; - d3.select(this) - .style('border-bottom-color', opacityScale(opacity)) - .style('border-top-color', opacityScale(opacity)) - ; - } - }); - - var html = table.node().outerHTML; - if (d.footer !== undefined) { - html += ''; - } - return html; - -}; - -var dataSeriesExists = function(d) { - if (d && d.series) { - if (d.series instanceof Array) { - return !!d.series.length; - } - // if object, it's okay just convert to array of the object - if (d.series instanceof Object) { - d.series = [d.series]; - return true; - } - } - return false; -}; - -// Calculates the gravity offset of the tooltip. Parameter is position of tooltip -// relative to the viewport. -var calcGravityOffset = function(pos) { - var height = tooltip.node().offsetHeight, - width = tooltip.node().offsetWidth, - clientWidth = document.documentElement.clientWidth, // Don't want scrollbars. - clientHeight = document.documentElement.clientHeight, // Don't want scrollbars. - left, top, tmp; - - // calculate position based on gravity - switch (gravity) { - case 'e': - left = - width - distance; - top = - (height / 2); - if(pos.left + left < 0) { left = distance; } - if((tmp = pos.top + top) < 0) { top -= tmp; } - if((tmp = pos.top + top + height) > clientHeight) { top -= tmp - clientHeight; } - break; - case 'w': - left = distance; - top = - (height / 2); - if (pos.left + left + width > clientWidth) { left = - width - distance; } - if ((tmp = pos.top + top) < 0) { top -= tmp; } - if ((tmp = pos.top + top + height) > clientHeight) { top -= tmp - clientHeight; } - break; - case 'n': - left = - (width / 2) - 5; // - 5 is an approximation of the mouse's height. - top = distance; - if (pos.top + top + height > clientHeight) { top = - height - distance; } - if ((tmp = pos.left + left) < 0) { left -= tmp; } - if ((tmp = pos.left + left + width) > clientWidth) { left -= tmp - clientWidth; } - break; - case 's': - left = - (width / 2); - top = - height - distance; - if (pos.top + top < 0) { top = distance; } - if ((tmp = pos.left + left) < 0) { left -= tmp; } - if ((tmp = pos.left + left + width) > clientWidth) { left -= tmp - clientWidth; } - break; - case 'center': - left = - (width / 2); - top = - (height / 2); - break; - default: - left = 0; - top = 0; - break; - } - - return { 'left': left, 'top': top }; -}; - -/* - Positions the tooltip in the correct place, as given by the position() function. - */ -var positionTooltip = function() { - nv.dom.read(function() { - var pos = position(), - gravityOffset = calcGravityOffset(pos), - left = pos.left + gravityOffset.left, - top = pos.top + gravityOffset.top; - - // delay hiding a bit to avoid flickering - if (hidden) { - tooltip - .interrupt() - .transition() - .delay(hideDelay) - .duration(0) - .style('opacity', 0); - } else { - // using tooltip.style('transform') returns values un-usable for tween - var oldTranslate = 'translate(' + lastPosition.left + 'px, ' + lastPosition.top + 'px)'; - var newTranslate = 'translate(' + left + 'px, ' + top + 'px)'; - var translateInterpolator = d3.interpolateString(oldTranslate, newTranslate); - var isHidden = tooltip.style('opacity') < 0.1; - - tooltip - .interrupt() // cancel running transitions - .transition() - .duration(isHidden ? 0 : duration) - // using tween since some versions of d3 can't auto-tween a translate on a div - .styleTween('transform', function () { - return translateInterpolator; - }, 'important') - // Safari has its own `-webkit-transform` and does not support `transform` - .styleTween('-webkit-transform', function () { - return translateInterpolator; - }) - .style('-ms-transform', newTranslate) - .style('opacity', 1); - } - - lastPosition.left = left; - lastPosition.top = top; - }); -}; - -// Creates new tooltip container, or uses existing one on DOM. -function initTooltip() { - if (!tooltip) { - - var container = document.body; - - // Create new tooltip div if it doesn't exist on DOM. - tooltip = d3.select(container).append('div') - .attr('class', 'nvtooltip ' + (classes ? classes : 'xy-tooltip')) - .attr('id', id); - tooltip.style('top', 0).style('left', 0); - tooltip.style('opacity', 0); - tooltip.style('position', 'fixed'); - tooltip.selectAll('div, table, td, tr').classed(nvPointerEventsClass, true); - tooltip.classed(nvPointerEventsClass, true); - } -} - -// Draw the tooltip onto the DOM. -function nvtooltip() { - if (!enabled) { return; } - if (!dataSeriesExists(data)) { return; } - - nv.dom.write(function () { - initTooltip(); - // Generate data and set it into tooltip. - // Bonus - If you override contentGenerator and return falsey you can use something like - // React or Knockout to bind the data for your tooltip. - var newContent = contentGenerator(data); - if (newContent) { - tooltip.node().innerHTML = newContent; - } - - positionTooltip(); - }); - - return nvtooltip; -} - -nvtooltip.nvPointerEventsClass = nvPointerEventsClass; -nvtooltip.options = nv.utils.optionsFunc.bind(nvtooltip); - -nvtooltip._options = Object.create({}, { - // simple read/write options - duration: {get: function(){return duration;}, set: function(_){duration=_;}}, - gravity: {get: function(){return gravity;}, set: function(_){gravity=_;}}, - distance: {get: function(){return distance;}, set: function(_){distance=_;}}, - snapDistance: {get: function(){return snapDistance;}, set: function(_){snapDistance=_;}}, - classes: {get: function(){return classes;}, set: function(_){classes=_;}}, - chartContainer: {get: function(){return chartContainer;}, set: function(_){chartContainer=_;}}, - enabled: {get: function(){return enabled;}, set: function(_){enabled=_;}}, - hideDelay: {get: function(){return hideDelay;}, set: function(_){hideDelay=_;}}, - contentGenerator: {get: function(){return contentGenerator;}, set: function(_){contentGenerator=_;}}, - valueFormatter: {get: function(){return valueFormatter;}, set: function(_){valueFormatter=_;}}, - headerFormatter: {get: function(){return headerFormatter;}, set: function(_){headerFormatter=_;}}, - keyFormatter: {get: function(){return keyFormatter;}, set: function(_){keyFormatter=_;}}, - headerEnabled: {get: function(){return headerEnabled;}, set: function(_){headerEnabled=_;}}, - position: {get: function(){return position;}, set: function(_){position=_;}}, - - // options with extra logic - hidden: {get: function(){return hidden;}, set: function(_){ - if (hidden !== _) { - hidden = !!_; - nvtooltip(); - } - }}, - data: {get: function(){return data;}, set: function(_){ - // if showing a single data point, adjust data format with that - if (_.point) { - _.value = _.point.x; - _.series = _.series || {}; - _.series.value = _.point.y; - _.series.color = _.point.color || _.series.color; - } - data = _; - }}, - - // read only properties - node: {get: function(){return tooltip.node();}, set: function(){}}, - id: {get: function(){return id;}, set: function(){}} -}); - -nv.utils.initOptions(nvtooltip); -return nvtooltip; -}; diff --git a/src/app/components/Charts/Chart.jsx b/src/app/components/Charts/Chart.jsx new file mode 100644 index 000000000..0152f1e8f --- /dev/null +++ b/src/app/components/Charts/Chart.jsx @@ -0,0 +1,125 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { ResponsiveXYFrame } from "semiotic" +import moment from 'moment' +import memoizeOne from 'memoize-one' +import ColorHash from 'color-hash' +const colorHash = new ColorHash() +import ErrorBoundary from 'react-error-boundary' + +import ErrorPanel from '../ErrorPanel.jsx' +import ChartTooltip from './ChartTooltip.jsx' + +// most of this is modelled on the semiotic examples + +function fetchCoincidentPoints(passedData, dataset) { + return dataset + .map((point) => ({ + keylabel: point.keylabel, + color: colorHash.hex(point.keylabel), + value: point.data.find((i) => { + return i.ts.getTime() === passedData.ts.getTime(); + })})) + .filter((point) => !!point.value) + .sort((a, b) => { + return b.value.value - a.value.value; + }) +} + +const verticalTickLineGenerator = (axisData) => { + const { xy } = axisData + const style = `M${xy.x1},${xy.y1}L${xy.x1},${xy.y2}Z` + return +} + +const horizontalTickLineGenerator = (axisData) => { + const { xy } = axisData + const style = `M${xy.x1},${xy.y1}L${xy.x2},${xy.y1}Z` + return +} + +const generateAxes = memoizeOne(yTickFormat => ([ + { + orient: "left", + tickFormat: yTickFormat, + tickLineGenerator: horizontalTickLineGenerator + }, + { + orient: "bottom", + tickFormat: ts => moment(ts).format('hh:mm:ss'), + tickLineGenerator: verticalTickLineGenerator, + ticks: 4 + } +])) + + +class Chart extends React.PureComponent { + yExtent = [0, undefined] + hoverAnnotation = [{ type: 'frame-hover' }] + frameMargin = { left: 60, bottom: 60, right: 8, top: 8 } + baseMarkProps = { forceUpdate: true } + colorForElement = (d) => colorHash.hex(d.keylabel) + lineStyle = (d) => ({ stroke: this.colorForElement(d), fill: this.colorForElement(d), fillOpacity: 0.5 }) + areaStyle = (d) => ({ stroke: this.colorForElement(d), fill: this.colorForElement(d), fillOpacity: 0.5, strokeWidth: '2px' }) + valueIsDefined = (d) => d.value !== null + + render () { + const { chartInfo, dataset } = this.props + const lineType = chartInfo.lineType || 'line' + + const axes = generateAxes(chartInfo.yTickFormat) + + return ( + + + + + } + baseMarkProps={this.baseMarkProps} /> + ) + } +} + +Chart.propTypes = { + chartInfo: PropTypes.object.isRequired, + dataset: PropTypes.array.isRequired, +} + +export default Chart diff --git a/src/app/components/Charts/ChartTooltip.jsx b/src/app/components/Charts/ChartTooltip.jsx new file mode 100644 index 000000000..0c63db222 --- /dev/null +++ b/src/app/components/Charts/ChartTooltip.jsx @@ -0,0 +1,74 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Segment } from 'semantic-ui-react' + +const generateTooltipIconStyle = (color) => ({ + width: '10px', + height: '10px', + backgroundColor: color, + display: 'inline-block', + position: 'absolute', + top: '8px', + left: '0', + margin: '0', +}) + +const tooltipStyles = { + header: {fontWeight: 'bold', borderBottom: 'thin solid black', marginBottom: '10px', textAlign: 'center'}, + lineItem: {position: 'relative', display: 'block', textAlign: 'left'}, + title: {display: 'inline-block', margin: '0 5px 0 15px'}, + value: {display: 'inline-block', fontWeight: 'bold', margin: '0'}, + wrapper: {background:"rgba(255,255,255)", minWidth: "max-content", whiteSpace: 'nowrap'} +} + +class ChartTooltip extends React.PureComponent { + render () { + const { header, points, format } = this.props + + return ( + +
+ {header} +
+ { points.map((point, i) => +
+

+

{point.keylabel}

+

{format(point.value && point.value.value)}

+
+ )} +
+ ) + } +} + +ChartTooltip.defaultProps = { + format: (v) => v, // if no format provided, use identity +} + +ChartTooltip.propTypes = { + header: PropTypes.string.isRequired, + points: PropTypes.array.isRequired, + format: PropTypes.func.isRequired, +} + +export default ChartTooltip diff --git a/src/app/components/Charts/Flamegraph.jsx b/src/app/components/Charts/Flamegraph.jsx new file mode 100644 index 000000000..0c412facc --- /dev/null +++ b/src/app/components/Charts/Flamegraph.jsx @@ -0,0 +1,126 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import superagent from 'superagent' + +import { Button, Form } from 'semantic-ui-react' + +const TIMEOUTS = { response: 5000, deadline: 10000 } + +function getStatusFromDataset(dataset) { + // oh for the ?. operator + return dataset && dataset[0] && dataset[0].data && dataset[0].data[0] && dataset[0].data[0].value || '?' +} + +const FG_DURATIONS = [ 5, 10, 20, 60, 120 ] + +/** + * Takes over a chart panel to allow generation of a flamegraph + * + * Directly calls the pmapi to submit requests, and then waits for the response + * to come in via normal datasets. + * + * It is expected that the metricNames[] field in the chart record contains the correct + * metric name to poll for a flamegraph + */ +class Flamegraph extends React.PureComponent { + state = { + durationSeconds: FG_DURATIONS[0], + fetchFile: null, + } + + static getDerivedStateFromProps(newProps) { + // we need to capture the DONE filename, because it only appears for a single round + // ie: after DONE it reverts to IDLE state + const splitResponse = getStatusFromDataset(newProps.dataset).split(' ') + + return (splitResponse[0] === 'DONE') + ? { fetchFile: splitResponse[1] } + : null + } + + handleDurationChange = (e, { value }) => this.setState({ durationSeconds: value }) + + requestGenerate = async () => { + const { chartInfo } = this.props + const { durationSeconds } = this.state + + const protocol = chartInfo.context.target.protocol + const hostname = chartInfo.context.target.hostname + const contextId = chartInfo.context.contextId + const fgtype = chartInfo.metricNames[0] + + try { + this.setState({ fetchFile: null }) + await superagent.get(`${protocol}://${hostname}/pmapi/${contextId}/_store`) + .timeout(TIMEOUTS) + .query({ name: fgtype, value: durationSeconds }) + } catch (err) { + console.log('flamegraph trigger failed', err) + console.error(err) + } + } + + render () { + const { durationSeconds, fetchFile } = this.state + const { dataset } = this.props + + const protocol = this.props.chartInfo.context.target.protocol + const hostname = this.props.chartInfo.context.target.hostname + const status = getStatusFromDataset(dataset) + const isIdle = ['IDLE', 'ERROR'].includes(status.split(' ')[0]) + const durationOptions = FG_DURATIONS.map(sec => ({ text: `${sec} sec`, value: sec })) + + return ( +
+

Flamegraph previous request status: {status}

+ +

Profile duration:

+ + + +

+ +

+ ) + } +} + +Flamegraph.propTypes = { + chartInfo: PropTypes.object.isRequired, + dataset: PropTypes.array.isRequired, +} + +export default Flamegraph diff --git a/src/app/components/Charts/Heatmap.jsx b/src/app/components/Charts/Heatmap.jsx new file mode 100644 index 000000000..87f3ddc41 --- /dev/null +++ b/src/app/components/Charts/Heatmap.jsx @@ -0,0 +1,134 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { ResponsiveXYFrame } from "semiotic" +import moment from 'moment' +import { scaleThreshold } from 'd3-scale' +import isEqual from 'lodash.isequal' +import memoizeOne from 'memoize-one' + +import { uniqueFilter } from '../../utils' +import { getLargestValueInDataset } from '../../processors/modelUtils' +import HeatmapScale from './HeatmapScale.jsx' +import HeatmapTooltip from './HeatmapTooltip.jsx' + +// collapse dataset into a single stream as this is what the xyframe heatmap view requires +function extractHeatmapValuesFromDataset(dataset, yAxisLabels) { + const values = [] + if (dataset) { + for (let d of dataset) { + for (let tsv of d.data) { + for (let weight = 0; weight < tsv.value; weight++) { + values.push({ ts: tsv.ts, value: d.instance, label: yAxisLabels[d.instance] || '?' }) + } + } + } + } + return values +} + +function createScale(thresholds, colors) { + return scaleThreshold() + .domain(thresholds) + .range(colors) +} + +// cache the scale; avoid unnecessary redrawing the heatmap which is actually quite expensive +const memoizedCreateScale = memoizeOne(createScale, isEqual) + +function determineThresholds(chartInfo, dataset) { + // works because input thresholds are ranged [0,1], so we can just multiply out + const scaleFactor = chartInfo.heatmapMaxValue || getLargestValueInDataset(dataset) || 1 + const thresholds = chartInfo.heatmap.thresholds.map(v => v * scaleFactor) + + // but we need to put the first value back to ensure the 0/1 transition works cleanly + // TODO potentially a bug here for super large heatmapMaxValues? + thresholds[0] = chartInfo.heatmap.thresholds[0] + + return memoizedCreateScale(thresholds, chartInfo.heatmap.colors) +} + +class Heatmap extends React.PureComponent { + heatmapDivStyle = { height: '100%', display: 'flex', flexDirection: 'column' } + margin = { left: 90, bottom: 30, right: 8, top: 8 } + baseMarkProps = { forceUpdate: true } + + render () { + const { chartInfo, dataset } = this.props + + const yAxisLookup = (dataset && dataset.map(mi => mi.yAxisLabels) || []).filter(uniqueFilter) + const thresholds = determineThresholds(chartInfo, dataset) + const heatmapValues = extractHeatmapValuesFromDataset(dataset, yAxisLookup) + + if (! (dataset.every(d => d.data.length > 0) && heatmapValues.length > 0)) { + return Insufficient data + } + + const areas = [{ coordinates: heatmapValues }] + const areaType = { type: 'heatmap', xBins: dataset[0].data.length, yBins: yAxisLookup.length } + + return (
+ + + + ({ + fill: thresholds(d.value), + stroke: 'lightgrey' + })} + margin={this.margin} + yExtent={[0, yAxisLookup.length]} + hoverAnnotation={true} + tooltipContent={dp => dp.binItems.length > 0 + && + } + axes={[ + { + orient: "left", + tickFormat: v => yAxisLookup[v - 1] || '', + ticks: yAxisLookup && yAxisLookup.length, + }, + { + orient: "bottom", + tickFormat: ts => moment(ts).format('hh:mm:ss'), + ticks: 4, + } + ]} + baseMarkProps={this.baseMarkProps} /> +
) + } +} + +Heatmap.propTypes = { + dataset: PropTypes.array.isRequired, + chartInfo: PropTypes.object.isRequired, +} + +export default Heatmap diff --git a/src/app/components/Charts/HeatmapScale.jsx b/src/app/components/Charts/HeatmapScale.jsx new file mode 100644 index 000000000..31f56ea56 --- /dev/null +++ b/src/app/components/Charts/HeatmapScale.jsx @@ -0,0 +1,78 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { select } from 'd3-selection' +import { legendColor } from 'd3-svg-legend' + +const svgStyle = { + height: '60px', + display: 'block', + margin: 'auto', +} + +class HeatmapScale extends React.PureComponent { + componentDidMount() { + this.createHeatmap() + } + + componentDidUpdate() { + this.createHeatmap() + } + + setNode = (node) => this.node = node + + render () { + return + } + + filterLabels = ({ i, genLength, generatedLabels }) => { + // we want first, last, and every third label, also clean up the NaN + return ((i === 0) || (i % 3 === 0) || (i === genLength - 1)) + ? generatedLabels[i].replace('NaN', '∞') + : null + } + + createHeatmap() { + const legend = legendColor() + .shapeHeight(30) + .shapeWidth(30) + .shapePadding(10) + .labelDelimiter('-') + .orient('horizontal') + .scale(this.props.thresholds) + .labelFormat('d') + .labels(this.filterLabels) + + select(this.node) + .append('g') + .attr('class', 'legendLinear') + + select(this.node) + .select('g') + .call(legend) + } +} + +HeatmapScale.propTypes = { + thresholds: PropTypes.func.isRequired, +} + +export default HeatmapScale diff --git a/src/app/components/Charts/HeatmapTooltip.jsx b/src/app/components/Charts/HeatmapTooltip.jsx new file mode 100644 index 000000000..8fb069af0 --- /dev/null +++ b/src/app/components/Charts/HeatmapTooltip.jsx @@ -0,0 +1,45 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +const tooltipContentStyle = { + background: 'rgba(255, 255, 255, 0.85)', + border: '1px double #ddd', + padding: '10px 20px', +} + +class HeatmapTooltip extends React.PureComponent { + render () { + const { label, count } = this.props + + return ( +
+

{label}: {count}

+
+ ) + } +} + +HeatmapTooltip.propTypes = { + label: PropTypes.string.isRequired, + count: PropTypes.number.isRequired, +} + +export default HeatmapTooltip diff --git a/src/app/components/Charts/MultiTable.jsx b/src/app/components/Charts/MultiTable.jsx new file mode 100644 index 000000000..64d53b298 --- /dev/null +++ b/src/app/components/Charts/MultiTable.jsx @@ -0,0 +1,74 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Table } from 'semantic-ui-react' + +import { uniqueFilter } from '../../utils' + +function createTableRows(dataset) { + if (!dataset) return { headers: [], tableData: [] } + + // an array of [ pid, comm, laddr ..] + const headers = dataset.map(mi => mi.metric).filter(uniqueFilter) + + // create a two dimensional array of arrays + const rows = [] + dataset.forEach(({ metric, instance, data }) => { + rows[instance] = rows[instance] || [] // ensure a row exists for this instance + let column = headers.indexOf(metric) // determine which column to set + rows[instance][column] = data[0].value // set the value at the column + }) + + return { headers, tableData: rows } +} + +class MultiTable extends React.PureComponent { + render () { + const { headers, tableData } = createTableRows(this.props.dataset) + + return ( + + + + { headers.map(hdr => + {hdr} + )} + + + + { tableData.map((row, ridx) => + + { row.map((col, cidx) => + {col}) } + + )} + +
+ ) + } +} + +MultiTable.propTypes = { + dataset: PropTypes.array.isRequired, +} + +MultiTable.createTableRows = createTableRows + +export default MultiTable diff --git a/src/app/components/Charts/MultiTable.spec.js b/src/app/components/Charts/MultiTable.spec.js new file mode 100644 index 000000000..664fb826a --- /dev/null +++ b/src/app/components/Charts/MultiTable.spec.js @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { expect } from 'chai' +import MultiTable from './MultiTable.jsx' + +describe('createTableRows', () => { + describe('with a missing dataset', () => { + let dataset = null + let result = MultiTable.createTableRows(dataset) + it('returns an empty headers result', () => { + expect(Array.isArray(result.headers)).to.equal(true) + expect(result.headers.length).to.equal(0) + }) + it('returns an empty tableData result', () => { + expect(Array.isArray(result.tableData)).to.equal(true) + expect(result.tableData.length).to.equal(0) + }) + }) + + describe('with a complex dataset', () => { + let data = [ + { "metric": "PID", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1752 } ] }, + { "metric": "PID", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1752 } ] }, + { "metric": "PID", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1412 } ] }, + { "metric": "COMM", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmwebd" } ] }, + { "metric": "COMM", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmwebd" } ] }, + { "metric": "COMM", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmcd" } ] }, + { "metric": "LADDR", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "192.168.251.133" } ] }, + { "metric": "LADDR", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "LADDR", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "LPORT", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44323 } ] }, + { "metric": "LPORT", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 47558 } ] }, + { "metric": "LPORT", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44321 } ] }, + { "metric": "DADDR", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "192.168.251.1" } ] }, + { "metric": "DADDR", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "DADDR", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "DPORT", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 49644 } ] }, + { "metric": "DPORT", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44321 } ] }, + { "metric": "DPORT", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 47558 } ] }, + { "metric": "RX_KB", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1 } ] }, + { "metric": "RX_KB", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "RX_KB", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "TX_KB", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1 } ] }, + { "metric": "TX_KB", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "TX_KB", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] } + ] + let result = MultiTable.createTableRows(data) + + it('collects the correct header instances', () => { + expect(result.headers.length).to.equal(8) + expect(result.headers).to.have.deep.members([ + 'PID', 'COMM', 'LADDR', 'LPORT', 'DADDR', 'DPORT', 'RX_KB', 'TX_KB' + ]) + }) + + it('collects the correct data rows', () => { + expect(result.tableData.length).to.equal(3) // there are three instances + expect(result.tableData).to.have.deep.members([ + [ 1752, 'pmwebd', '192.168.251.133', 44323, '192.168.251.1', 49644, 1, 1 ], + [ 1752, 'pmwebd', '127.0.0.1', 47558, '127.0.0.1', 44321, 0, 0 ], + [ 1412, 'pmcd', '127.0.0.1', 44321, '127.0.0.1', 47558, 0, 0], + ]) + }) + }) +}) diff --git a/src/app/components/Charts/SimpleTable.jsx b/src/app/components/Charts/SimpleTable.jsx new file mode 100644 index 000000000..ce5c4817c --- /dev/null +++ b/src/app/components/Charts/SimpleTable.jsx @@ -0,0 +1,52 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Table } from 'semantic-ui-react' + +class SimpleTable extends React.PureComponent { + render () { + const dataset = this.props.dataset + + return ( + + + + Title + Value + + + + { dataset.map(({ title, data }, ridx) => + + {title} + {data[0].value} + + )} + +
+ ) + } +} + +SimpleTable.propTypes = { + dataset: PropTypes.array.isRequired, +} + +export default SimpleTable diff --git a/src/app/services/vector.service.js b/src/app/components/Charts/TextLabel.jsx similarity index 55% rename from src/app/services/vector.service.js rename to src/app/components/Charts/TextLabel.jsx index d9bd67fcb..b2da4a342 100644 --- a/src/app/services/vector.service.js +++ b/src/app/components/Charts/TextLabel.jsx @@ -1,6 +1,6 @@ /**! * - * Copyright 2015 Netflix, Inc. + * Copyright 2018 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,29 +15,23 @@ * limitations under the License. * */ - (function () { - 'use strict'; - /** - * @name VectorService - */ - function VectorService() { +import React from 'react' +import PropTypes from 'prop-types' +import { Header } from 'semantic-ui-react' - /** - * @name getGuid - * @desc - */ - function getGuid() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } +class TextLabel extends React.PureComponent { + render () { + const { size, content } = this.props.chartInfo - return { - getGuid: getGuid - }; - } + return ( +
+ ) + } +} - angular - .module('app.services') - .factory('VectorService', VectorService); +TextLabel.propTypes = { + chartInfo: PropTypes.object.isRequired, +} - })(); +export default TextLabel diff --git a/src/app/components/Charts/cividis.js b/src/app/components/Charts/cividis.js new file mode 100644 index 000000000..14ba81dfa --- /dev/null +++ b/src/app/components/Charts/cividis.js @@ -0,0 +1,62 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* +// https://github.com/plotly/plotly.py/pull/883/files +const cividis = [ + [0.000000, 'rgb(0,32,76)'], [0.058824, 'rgb(0,42,102)'], + [0.117647, 'rgb(0,52,110)'], [0.176471, 'rgb(39,63,108)'], + [0.235294, 'rgb(60,74,107)'], [0.294118, 'rgb(76,85,107)'], + [0.352941, 'rgb(91,95,109)'], [0.411765, 'rgb(104,106,112)'], + [0.470588, 'rgb(117,117,117)'], [0.529412, 'rgb(131,129,120)'], + [0.588235, 'rgb(146,140,120)'], [0.647059, 'rgb(161,152,118)'], + [0.705882, 'rgb(176,165,114)'], [0.764706, 'rgb(192,177,109)'], + [0.823529, 'rgb(209,191,102)'], [0.882353, 'rgb(225,204,92)'], + [0.941176, 'rgb(243,219,79)'], [1.000000, 'rgb(255,233,69)'] +] +*/ + +// use a slight variation on cividis, since +// (1) we want the unset cells to by white, rather than dark blue +// (2) we need the top of the range to be unset domain, for d3 scaleThreshold +const cividis = [ + [0.000001, 'rgb(255,255,255)'], + [0.058824, 'rgb(0,42,102)'], + [0.117647, 'rgb(0,52,110)'], + [0.176471, 'rgb(39,63,108)'], + [0.235294, 'rgb(60,74,107)'], + [0.294118, 'rgb(76,85,107)'], + [0.352941, 'rgb(91,95,109)'], + [0.411765, 'rgb(104,106,112)'], + [0.470588, 'rgb(117,117,117)'], + [0.529412, 'rgb(131,129,120)'], + [0.588235, 'rgb(146,140,120)'], + [0.647059, 'rgb(161,152,118)'], + [0.705882, 'rgb(176,165,114)'], + [0.764706, 'rgb(192,177,109)'], + [0.823529, 'rgb(209,191,102)'], + [0.882353, 'rgb(225,204,92)'], + [0.941176, 'rgb(243,219,79)'], + [undefined, 'rgb(255,233,69)'] +] + +const _thresholds = cividis.map(v => v[0]) +const _colors = cividis.map(v => v[1]) + +export const thresholds = _thresholds +export const colors = _colors diff --git a/src/app/components/ConfigPanel/AddContextModal.jsx b/src/app/components/ConfigPanel/AddContextModal.jsx new file mode 100644 index 000000000..544e8f5ae --- /dev/null +++ b/src/app/components/ConfigPanel/AddContextModal.jsx @@ -0,0 +1,137 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Modal, Form } from 'semantic-ui-react' +import debounce from 'lodash.debounce' + +import { fetchContainerList } from '../../utils' + +class AddContextModal extends React.PureComponent { + state = { + modalOpen: !!this.props.initiallyOpen, + protocolDropdownOptions: [ + { text: 'HTTP', value: 'http' }, + { text: 'HTTPS', value: 'https' } + ], + containerDropdownOptions: [ + { text: 'N/A', value: '_all' } + ], + containerId: '_all', + connected: false, + protocol: this.props.defaultProtocol, + hostport: this.props.defaultPort, + hostspec: this.props.defaultHostspec, + } + + containerNameResolver = this.props.useCgroupId ? (c => c.cgroup) : (c => c.containerId) + + refreshContainerList = async () => { + const { protocol, hostname, hostport, hostspec } = this.state + if (!protocol || !hostname || !hostport || !hostspec) return + + this.setState({ + containerDropdownOptions: [ + { value: '_all', text: '.. connecting ..' } + ], + containerId: '_all', + connected: false, + }) + + const containerList = await fetchContainerList(protocol, hostname, hostport, hostspec) + + const containerDropdownOptions = [] + .concat({ text: 'All', value: '_all' }) + .concat(containerList.map(c => ({ text: this.containerNameResolver(c), value: this.containerNameResolver(c) }))) + + this.setState({ containerDropdownOptions, containerId: '_all', connected: true }) + } + refreshContainerList = debounce(this.refreshContainerList, 500) + + handleProtocolChange = (e, { value }) => this.setState({ protocol: value }, this.refreshContainerList) + handleHostnameChange = (e, { value }) => this.setState({ hostname: value }, this.refreshContainerList) + handleHostportChange = (e, { value }) => this.setState({ hostport: value }, this.refreshContainerList) + handleHostspecChange = (e, { value }) => this.setState({ hostspec: value }, this.refreshContainerList) + handleContainerChange = (e, { value }) => this.setState({ containerId: value }) + handleClose = () => this.setState({ modalOpen: false }) + handleOpen = () => this.setState({ modalOpen: true }) + + handleSubmit = () => { + const { protocol, hostname, hostport, hostspec, containerId } = this.state + const { onNewContext } = this.props + onNewContext({ + protocol: protocol, + hostname: hostname + ':' + hostport, + hostspec: hostspec, + containerId: containerId || '_all', + }) + this.setState({ modalOpen: false }) + } + + render () { + const { modalOpen, protocolDropdownOptions, protocol, hostport, hostspec, connected, containerId, containerDropdownOptions } = this.state + const { render, disableHostspecInput, disableContainerSelect } = this.props + + return ( + + + Add connection + + +
+ + + + + + + + + Add + + +
+ +
+ ) + } +} + +AddContextModal.propTypes = { + onNewContext: PropTypes.func.isRequired, + defaultProtocol: PropTypes.string.isRequired, + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + useCgroupId: PropTypes.bool.isRequired, + render: PropTypes.func.isRequired, + initiallyOpen: PropTypes.bool, +} + +export default AddContextModal diff --git a/src/app/components/ConfigPanel/ChartSelector.jsx b/src/app/components/ConfigPanel/ChartSelector.jsx new file mode 100644 index 000000000..490a8c214 --- /dev/null +++ b/src/app/components/ConfigPanel/ChartSelector.jsx @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Menu } from 'semantic-ui-react' + +import CustomChartSelector from './CustomChartSelector.jsx' +import SimpleChartSelector from './SimpleChartSelector.jsx' + +class ChartSelector extends React.PureComponent { + state = { + activeTab: 'simple', + } + + handleTabClick = (e, { name }) => this.setState({ activeTab: name }) + + render () { + const { activeTab } = this.state + const { charts, bundles, disabled, selectedPmids, selectedChartIds } = this.props + const { onClearCharts, onAddChart, onRequestClose } = this.props + + return (
+ + + + + + { activeTab === 'simple' && + } + + { activeTab === 'custom' && + } + +
) + } +} + +ChartSelector.defaultProps = { + disabled: false, +} + +ChartSelector.propTypes = { + charts: PropTypes.array.isRequired, + bundles: PropTypes.array.isRequired, + onClearCharts: PropTypes.func.isRequired, + onAddChart: PropTypes.func.isRequired, + onRequestClose: PropTypes.func.isRequired, + disabled: PropTypes.bool, + selectedPmids: PropTypes.object, + selectedChartIds: PropTypes.array, +} + +export default ChartSelector diff --git a/src/app/components/ConfigPanel/ConfigPanel.jsx b/src/app/components/ConfigPanel/ConfigPanel.jsx new file mode 100644 index 000000000..48e7a4560 --- /dev/null +++ b/src/app/components/ConfigPanel/ConfigPanel.jsx @@ -0,0 +1,163 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Segment } from 'semantic-ui-react' +import ChartSelector from './ChartSelector.jsx' +import ContextMenu from './ContextMenu.jsx' +import { matchesTarget, isContextLoading } from '../../utils' + +const panelStyle = { + marginTop: '0px', +} + +function getSelectedContextPmids(contextDatas, selected) { + if (!selected) return undefined + + const context = contextDatas.find(cd => matchesTarget(cd.target, selected.target)) + return context && context.pmids +} + +class ConfigPanel extends React.PureComponent { + state = {} + + handleClearCharts = () => { + if (this.state.selectedContext) { + this.props.onClearChartsFromContext(this.state.selectedContext) + } + } + + handleAddChart = (chart) => { + if (this.state.selectedContext) { + this.props.onAddChartToContext(this.state.selectedContext, chart) + } + } + + handleContextSelect = (context) => { + this.setState({ selectedContext: context }) + } + + handleNewContext = (context) => { + this.props.onNewContext(context) + if (this.state.selectedContext === null) { + this.setState({ selectedContext: context }) + } + } + + handleRemoveContext = (context) => { + this.props.onRemoveContext(context) + if (matchesTarget(this.state.selectedContext.target, context.target)) { + this.setState({ selectedContext: null }) + } + } + + componentDidUpdate = () => { + const { contextData } = this.props + const { selectedContext } = this.state + + let validContexts = contextData.filter(cd => !isContextLoading(cd)) + + // it is valid if we have a selection, and there is some context that matches our selection + let validSelection = selectedContext && + validContexts.some(cd => matchesTarget(cd.target, selectedContext.target)) + + // early exit + if (validSelection) return + + // if there is an available context to use, connect + if (validContexts.length > 0) { + this.setState({ selectedContext: validContexts[0] }) + } + + // if not, then clear out our state + if (selectedContext && validContexts.length === 0) { + this.setState({ selectedContext: null }) + } + } + + render () { + const { config, contextData, initialAddContext, charts, bundles, onRequestClose, chartlist } = this.props + const { selectedContext } = this.state + + // given a selected context, find all charts in the chartlist that match, and return their ids + const selectedCharts = chartlist.filter(c => matchesTarget(c.context.target, selectedContext && selectedContext.target)) + const selectedChartIds = selectedCharts.map(c => c.chartId) + + return ( + + + + + + + ) + } +} + +ConfigPanel.propTypes = { + config: PropTypes.shape({ + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + dataWindows: PropTypes.arrayOf( + PropTypes.shape({ + valueSeconds: PropTypes.number.isRequired, + text: PropTypes.string.isRequired, + }) + ), + pollIntervals: PropTypes.arrayOf( + PropTypes.shape({ + valueSeconds: PropTypes.number.isRequired, + text: PropTypes.string.isRequired, + }) + ), + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + }), + contextData: PropTypes.array.isRequired, + onNewContext: PropTypes.func.isRequired, + onAddChartToContext: PropTypes.func.isRequired, + onClearChartsFromContext: PropTypes.func.isRequired, + onRemoveContext: PropTypes.func.isRequired, + onRequestClose: PropTypes.func.isRequired, + charts: PropTypes.array.isRequired, + bundles: PropTypes.array.isRequired, + initialAddContext: PropTypes.bool.isRequired, + chartlist: PropTypes.array.isRequired, +} + +ConfigPanel.getSelectedContextPmids = getSelectedContextPmids + +export default ConfigPanel diff --git a/src/app/components/ConfigPanel/ContextMenu.jsx b/src/app/components/ConfigPanel/ContextMenu.jsx new file mode 100644 index 000000000..abd7125e4 --- /dev/null +++ b/src/app/components/ConfigPanel/ContextMenu.jsx @@ -0,0 +1,100 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Menu, Button } from 'semantic-ui-react' + +import AddContextModal from './AddContextModal.jsx' +import ContextMenuItem from './ContextMenuItem.jsx' +import { matchesTarget } from '../../utils' + +const chartSelectorStyle = { + marginTop: '0px', +} + +class ContextMenu extends React.PureComponent { + handleNewContext = (target) => { + const { contextData, onNewContext } = this.props + if (contextData.some(c => matchesTarget(target, c.target))) { + alert('A context already exists for this target') + } else { + onNewContext(target) + } + } + + addContextButton = (showModal) => + + render () { + const { contextData, config, initialAddContext, onRemoveContext, onContextSelect, selectedContext } = this.props + const { defaultProtocol, defaultPort, defaultHostspec, disableHostspecInput, disableContainerSelect, useCgroupId } = config + + return ( + + + { /* advise if no connections */ } + { (contextData === null || contextData.length === 0) && + No active connections + } + + { /* regular context menu selector */ } + { (contextData || []).map(ctx => + ) } + + { /* add context modal, popped by a button */ } + + + + + + ) + } +} + +ContextMenu.propTypes = { + config: PropTypes.shape({ + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + useCgroupId: PropTypes.bool.isRequired, + }), + contextData: PropTypes.array.isRequired, + onContextSelect: PropTypes.func.isRequired, + onNewContext: PropTypes.func.isRequired, + onRemoveContext: PropTypes.func.isRequired, + selectedContext: PropTypes.object, + initialAddContext: PropTypes.bool, +} + +export default ContextMenu diff --git a/src/app/components/ConfigPanel/ContextMenuItem.jsx b/src/app/components/ConfigPanel/ContextMenuItem.jsx new file mode 100644 index 000000000..3a3396653 --- /dev/null +++ b/src/app/components/ConfigPanel/ContextMenuItem.jsx @@ -0,0 +1,96 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Menu, Loader, Button } from 'semantic-ui-react' +import { isContextLoading } from '../../utils' + +function itemColor(context) { + if (context.errText) { + return 'red' + } else { + if (isContextLoading(context)) { + return 'grey' + } else { + return 'green' + } + } + +} + +class ContextMenuItem extends React.Component { + menuText = (target) => { + let children = [target.hostname, ' => ', target.hostspec] + if (target.containerId !== '_all') { + children.push( +
) + children.push('Container: ') + children.push(target.containerId) + } + return children + } + + handleContextClick = (e, { context }) => { + this.props.onContextSelect(context) + } + + handleContextXClick = (e, { context }) => { + // the button is inside the menu; stop propagation to prevent the + // x button followed by a context menu item click + e.stopPropagation() + this.props.onRemoveContext(context) + } + + render () { + const { ctx, isActive } = this.props + const menuText = this.menuText(ctx.target) + const isLoading = isContextLoading(ctx) + + return ( + + + { /* text area of menu */ } + {menuText} + + { /* loading spinner */ } + + + { /* x button to close */ } + + + + ) + } +} + +FilterModal.propTypes = { + filter: PropTypes.string.isRequired, + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +/** + * Filter instance name by settings configured by modal (basic includes) + * + * @return {function} a transform function + */ +FilterModal.filterInstanceIncludesFilterText = function () { + return function _filterInstanceIncludesFilterText (metricInstances, { chartInfo }) { + if (!chartInfo.filter) return metricInstances + return metricInstances.filter(mi => (mi.instance && mi.instance.includes) ? mi.instance.includes(chartInfo.filter) : true) + } +} + +export default FilterModal diff --git a/src/app/components/SettingsModals/HeatmapSettingsModal.jsx b/src/app/components/SettingsModals/HeatmapSettingsModal.jsx new file mode 100644 index 000000000..52b13bab3 --- /dev/null +++ b/src/app/components/SettingsModals/HeatmapSettingsModal.jsx @@ -0,0 +1,107 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { getLargestValueInDataset } from '../../processors/modelUtils' +import { uniqueFilter } from '../../utils' + +import { Form } from 'semantic-ui-react' + +class HeatmapSettingsModal extends React.PureComponent { + state = { + heatmapMaxValue: this.props.heatmapMaxValue, + maxInstanceValue: this.props.maxInstanceValue, + selectedMetrics: this.props.selectedMetrics, + } + + handleMaxValueChange = (e, { value }) => this.setState({ heatmapMaxValue: parseInt(value, 10) }) + handleMaxYValueChange = (e, { value }) => this.setState({ maxInstanceValue: parseInt(value, 10) }) + handleSelectedMetricChange = (e, { label, checked }) => { + if (checked) { + this.setState((state) => ({ + selectedMetrics: state.selectedMetrics.concat(label).filter(uniqueFilter) + })) + } + + if (!checked) { + this.setState((state) => ({ + selectedMetrics: state.selectedMetrics.filter(e => e !== label) + })) + } + } + + handleSubmit = () => { + this.props.onNewSettings(this.state) + this.props.onClose() + } + + render() { + const { dataset = [], selectedMetrics, metricNames } = this.props + const { heatmapMaxValue = 0, maxInstanceValue = 0 } = this.state + + const chartMaxValue = getLargestValueInDataset(dataset) + const yAxisOptions = dataset + .map(mi => mi.yAxisLabels) + .filter(uniqueFilter) + .map((label, index) => ({ text: label, value: index })) + .filter(li => li.value !== 0) // remove any 0 so we can replace it with an auto + .concat({ text: 'Auto', value: 0 }) + + return ( +
+ + + +
+ + + + { selectedMetrics && + + + { metricNames.map((m) => + + )} + } + + OK + + ) + } +} + +HeatmapSettingsModal.propTypes = { + heatmapMaxValue: PropTypes.number, + maxInstanceValue: PropTypes.number, + selectedMetrics: PropTypes.arrayOf(PropTypes.string), + metricNames: PropTypes.arrayOf(PropTypes.string), + dataset: PropTypes.array, + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default HeatmapSettingsModal diff --git a/src/app/components/SettingsModals/TextLabelModal.jsx b/src/app/components/SettingsModals/TextLabelModal.jsx new file mode 100644 index 000000000..2843e1c1f --- /dev/null +++ b/src/app/components/SettingsModals/TextLabelModal.jsx @@ -0,0 +1,67 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Form } from 'semantic-ui-react' + +const SIZES = ['tiny', 'small', 'medium', 'large', 'huge'] + +class TextLabelModal extends React.PureComponent { + state = { + content: this.props.content, + size: this.props.size, + } + + handleSubmit = () => { + this.props.onNewSettings(this.state) + this.props.onClose() + } + + handleContentChange = (e, { value }) => this.setState({ content: value }) + handleSizeChange = (e, { value }) => this.setState({ size: value }) + + render() { + return ( +
+ + + + + + { SIZES.map(size => + + )} + + + OK + + ) + } +} + +TextLabelModal.propTypes = { + content: PropTypes.string.isRequired, + size: PropTypes.oneOf(SIZES).isRequired, + + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default TextLabelModal diff --git a/src/app/dashboard/dashboard.controller.js b/src/app/dashboard/dashboard.controller.js deleted file mode 100644 index b61e75cfd..000000000 --- a/src/app/dashboard/dashboard.controller.js +++ /dev/null @@ -1,180 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ -/*jslint browser: true*/ -/*jslint nomen: true */ - -(function () { - 'use strict'; - - /** - * @name DashboardCtrl - * @desc Main dashboard Controller - */ - function DashboardCtrl($document, $rootScope, $log, $route, $routeParams, $location, widgetDefinitions, widgets, embed, DashboardService, vectorVersion) { - var vm = this; - var path = $route.current.$$route.originalPath; - var widgetsToLoad = widgets; - - /** - * @name visibilityChanged - * @desc Pauses/resumes interval updates if window/tab is out of focus. - */ - function visibilityChanged() { - if ($document[0].hidden || $document[0].webkitHidden || - $document[0].mozHidden || $document[0].msHidden) { - DashboardService.cancelInterval(); - } else { - DashboardService.updateInterval(); - } - } - - /** - * @name activate - * @desc Initiliazes DashboardController - */ - function activate() { - DashboardService.initializeProperties(); - - if ($routeParams.protocol) { - $rootScope.properties.protocol = $routeParams.protocol; - $log.info('Protocol: ' + $routeParams.protocol); - } - - if ($routeParams.host) { - vm.inputHost = $routeParams.host; - $log.info('Host: ' + $routeParams.host); - if ($routeParams.hostspec) { - $rootScope.properties.hostspec = $routeParams.hostspec; - $log.info('Hostspec: ' + $routeParams.hostspec); - } - DashboardService.updateHost(vm.inputHost); - } - - // hack to deal with window/tab out of focus - $document[0] - .addEventListener('visibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('webkitvisibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('msvisibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('mozvisibilitychange', visibilityChanged, false); - - $log.info('Dashboard controller initialized with ' + path + ' view.'); - } - - if ($routeParams.widgets !== undefined ){ - var widgetNameArr = $routeParams.widgets.split(',') || []; - widgetsToLoad = widgetNameArr.reduce(function(all, name){ - return all.concat(widgetDefinitions.filter(function(def){ - return def.name === name; - })); - },[]); - } else { - var urlArr = widgets.reduce(function(all,item){ - all.push(item.name); - return all; - },[]).join(); - $location.search('widgets', urlArr); - } - - vm.dashboardOptions = { - hideToolbar: true, - widgetButtons: false, - hideWidgetName: true, - hideWidgetSettings: true, - widgetDefinitions: widgetDefinitions, - defaultWidgets: widgetsToLoad - }; - - vm.version = vectorVersion.id; - - vm.embed = embed; - - // Export controller public functions - vm.addWidgetToURL = function(widgetObj){ - var newUrl =''; - if ($routeParams.widgets === undefined) { - $routeParams.widgets = ''; - } else { - newUrl = ','; - } - - if (widgetObj.length){ - $routeParams.widgets = ''; - newUrl = widgetObj.reduce(function(all,item){ - all.push(item.name); - return all; - },[]).join(); - } else { - newUrl = newUrl + widgetObj.name; - } - $location.search('widgets', $routeParams.widgets + newUrl); - }; - vm.removeWidgetFromURL = function(widgetObj){ - var widgetNameArr = $routeParams.widgets.split(',') || []; - for (var d=0; d< widgetNameArr.length; d++){ - if (widgetNameArr[d] === widgetObj.name){ - widgetNameArr.splice(d,1); - break; - } - } - if (widgetNameArr.length < 1){ - $location.search('widgets', null); - } else { - $location.search('widgets', widgetNameArr.toString()); - } - }; - vm.removeAllWidgetFromURL = function(){ - $location.search('widgets', null); - }; - vm.updateGlobalFilter = function(){ - DashboardService.updateGlobalFilter(vm.globalFilter); - }; - vm.updateInterval = DashboardService.updateInterval; - vm.updateHost = function() { - DashboardService.updateHost(vm.inputHost); - }; - vm.updateWindow = DashboardService.updateWindow; - vm.globalFilter =''; - vm.isHostnameExpanded = false; - vm.inputHost = ''; - activate(); - } - - DashboardCtrl.$inject = [ - '$document', - '$rootScope', - '$log', - '$route', - '$routeParams', - '$location', - 'widgetDefinitions', - 'widgets', - 'embed', - 'DashboardService', - 'vectorVersion' - ]; - - angular - .module('app.controllers', []) - .controller('DashboardController', DashboardCtrl); -})(); diff --git a/src/app/dashboard/dashboard.controller.spec.js b/src/app/dashboard/dashboard.controller.spec.js deleted file mode 100644 index 2e8ce1537..000000000 --- a/src/app/dashboard/dashboard.controller.spec.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -/*jslint devel: true */ - -/* Controller Tests */ - -describe('DashboardCtrl', function() { - - beforeEach(module('app', function($provide) { - // Output messages - $provide.value('$log', console); - })); - - var $controller, $rootScope, $log, DashboardService; - - beforeEach(inject(function(_$controller_, _$rootScope_, _$log_, _DashboardService_){ - // The injector unwraps the underscores (_) from around the parameter names when matching - $controller = _$controller_; - $rootScope = _$rootScope_; - $log = _$log_; - DashboardService = _DashboardService_; - })); - - it('should not be null' , function () { - var $scope, route, routeParams, widgetDefinitions, widgets, controller; - - $scope = $rootScope.$new(); - route = { - current: { - $$route: { - originalPath: '/empty' - } - } - }; - routeParams = { - host: null - }; - widgetDefinitions = []; - widgets = []; - controller = $controller('DashboardCtrl', { $scope: $scope, $rootScope: $rootScope, $log: $log, $route: route, $routeParams: routeParams, widgetDefinitions: widgetDefinitions, defaultWidgets: widgets, emptyWidgets: widgets, DashboardService: DashboardService }); - - expect(controller).toNotBe(null); - }); - - it('should initialize properties', function() { - var $scope, route, routeParams, widgetDefinitions, widgets, controller; - - $scope = $rootScope.$new(); - route = { - current: { - $$route: { - originalPath: '/empty' - } - } - }; - routeParams = { - host: null - }; - widgetDefinitions = []; - widgets = []; - controller = $controller('DashboardCtrl', { $scope: $scope, $rootScope: $rootScope, $log: $log, $route: route, $routeParams: routeParams, widgetDefinitions: widgetDefinitions, defaultWidgets: widgets, emptyWidgets: widgets, DashboardService: DashboardService }); - - expect($scope.properties.host).toEqual(''); - }); - -}); diff --git a/src/app/dashboard/dashboard.html b/src/app/dashboard/dashboard.html deleted file mode 100644 index 7be2966fa..000000000 --- a/src/app/dashboard/dashboard.html +++ /dev/null @@ -1,23 +0,0 @@ - - -
-
-
-
-
-
-
diff --git a/src/app/dashboard/vector.dashboard.html b/src/app/dashboard/vector.dashboard.html deleted file mode 100644 index 5b5e9bc21..000000000 --- a/src/app/dashboard/vector.dashboard.html +++ /dev/null @@ -1,140 +0,0 @@ -
-
-
-
- Hostname   - - - -
-
-
-
- - -
-
-
-
- Window - -
-
-
-
-
-
- Interval - -
-
-
-
-
-
-
-
- Hostspec          - -
-
- Filter                   - -
-
-
-
-

{{flags.contextAvailable && properties.hostname ? properties.hostname : 'Disconnected'}}

-
-
-
- Error! - {{flash.message}} -
-
-
-
-
- - -
- -
- -
- - - - - - -
- -
-
-
-
-

- {{widget.title}} - - - {{widget.name}} - - -

-
-
-
-
-
-
-
-
-
-
Version: {{vm.version}}
- diff --git a/src/app/datamodels/containerCPUstatMetricTimeSeries.datamodel.js b/src/app/datamodels/containerCPUstatMetricTimeSeries.datamodel.js deleted file mode 100644 index e1e37fec6..000000000 --- a/src/app/datamodels/containerCPUstatMetricTimeSeries.datamodel.js +++ /dev/null @@ -1,86 +0,0 @@ -/**! - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerCPUstatMetricTimeSeriesDataModel - * @desc - */ - function ContainerCPUstatMetricTimeSeriesDataModel(ContainerMetadataService, WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - // create create base metrics - var cpuSysMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.cpuacct.stat.user'), - cpuUserMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.cpuacct.stat.system'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - lastValue2 = []; - - if ( cpuSysMetric.data.length > 0 && cpuUserMetric.data.length > 0){ - angular.forEach(cpuSysMetric.data, function (instance) { - if (instance.values.length > 0 && instance.key.indexOf('docker/')!== -1) { - lastValue2.push(instance.previousValue); - ContainerMetadataService.resolveId(instance.key); - ContainerMetadataService.setCurrentTime(instance.previousTimestamp); - } - }); - - angular.forEach(cpuUserMetric.data, function (instance) { - - if (instance.values.length > 0 && instance.key.indexOf('docker/')!== -1 && ContainerMetadataService.isTimeCurrent(instance.previousTimestamp)) { - var lastValue = instance.values[instance.values.length - 1]; - var filter = ContainerMetadataService.getGlobalFilter(); - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - - if (filter === '' || name.indexOf(filter) !==-1){ - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: instance.previousValue / lastValue2.shift() - }); - } - - } - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.cpuacct.stat.user'); - MetricListService.destroyMetric('cgroup.cpuacct.stat.system'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('ContainerCPUstatMetricTimeSeriesDataModel', ContainerCPUstatMetricTimeSeriesDataModel); - })(); diff --git a/src/app/datamodels/containerMemoryBytesMetricTimeSeries.datamodel.js b/src/app/datamodels/containerMemoryBytesMetricTimeSeries.datamodel.js deleted file mode 100644 index 3361fda1f..000000000 --- a/src/app/datamodels/containerMemoryBytesMetricTimeSeries.datamodel.js +++ /dev/null @@ -1,81 +0,0 @@ -/**! - * - */ - - (function () { - 'use strict'; - - /** - * @name ContainerMemoryBytesMetricTimeSeriesDataModel - * @desc - */ - function ContainerMemoryBytesMetricTimeSeriesDataModel(ContainerMetadataService, $rootScope, WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - // create create base metrics - var inMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.memory.usage'), - derivedFunction; - - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(inMetric.data, function (instance) { - //hack to remove stale Containers by using latest timestamp from server - ContainerMetadataService.setCurrentTime(instance.previousTimestamp); - - if (instance.values.length > 0 && instance.key.indexOf('docker/')!== -1 && ContainerMetadataService.isTimeCurrent(instance.previousTimestamp)) { - - ContainerMetadataService.resolveId(instance.key); - lastValue = instance.values[instance.values.length - 1]; - var filter = ContainerMetadataService.getGlobalFilter(); - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - - if (filter === '' || name.indexOf(filter) !==-1){ - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: instance.previousValue / 1024 / 1024 - }); - } - - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.memory.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('ContainerMemoryBytesMetricTimeSeriesDataModel', ContainerMemoryBytesMetricTimeSeriesDataModel); - })(); diff --git a/src/app/datamodels/containerMemoryUtilizationMetric.datamodel.js b/src/app/datamodels/containerMemoryUtilizationMetric.datamodel.js deleted file mode 100644 index f11c14708..000000000 --- a/src/app/datamodels/containerMemoryUtilizationMetric.datamodel.js +++ /dev/null @@ -1,162 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerMemoryUtilizationMetricDataModel - * @desc - */ - function ContainerMemoryUtilizationMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - var conversionFunction = function (value) { - return value / 1024; - }, - cachedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.cached', conversionFunction), - usedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.used', conversionFunction), - freeMemMetric = MetricListService.getOrCreateConvertedMetric('mem.freemem', conversionFunction), - buffersMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.bufmem', conversionFunction), - containerMemMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.memory.usage'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - usedValue, - cachedValue, - freeValue, - buffersValue, - containerUsedValue, - tempTimestamp; - - - usedValue = (function () { - if (usedMemMetric.data.length > 0) { - var instance = usedMemMetric.data[usedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - cachedValue = (function () { - if (cachedMemMetric.data.length > 0) { - var instance = cachedMemMetric.data[cachedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - freeValue = (function () { - if (freeMemMetric.data.length > 0) { - var instance = freeMemMetric.data[freeMemMetric.data.length - 1]; - if (instance.values.length > 0) { - tempTimestamp = instance.values[instance.values.length - 1].x; - return instance.values[instance.values.length - 1]; - } - } - }()); - - buffersValue = (function () { - if (buffersMemMetric.data.length > 0) { - var instance = buffersMemMetric.data[buffersMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - containerUsedValue = (function () { - var total = 0; - angular.forEach(containerMemMetric.data, function (instance) { - var difference = tempTimestamp - instance.previousTimestamp; - if (instance.values.length > 0 && instance.key.indexOf('docker/')!== -1 && difference < 5500) { - total = total + (instance.previousValue / 1024 / 1024); - } - }); - return Math.round(total); - - }()); - - if (angular.isDefined(usedValue) && - angular.isDefined(containerUsedValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'System used mem', - value: usedValue.y - containerUsedValue - }); - - } - - if (angular.isDefined(freeValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'System free (unused)', - value: freeValue.y - }); - } - - if (angular.isDefined(containerUsedValue) && - angular.isDefined(usedValue)) { - returnValues.push({ - timestamp: usedValue.x, - key: 'Container used mem', - value: containerUsedValue - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric('container.memory.headroom', derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric('container.memory.headroom'); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('mem.util.used'); - MetricListService.destroyMetric('mem.freemem'); - MetricListService.destroyMetric('cgroup.memory.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('ContainerMemoryUtilizationMetricDataModel', ContainerMemoryUtilizationMetricDataModel); - })(); diff --git a/src/app/datamodels/containerMultipleCumulativeMetric.datamodel.js b/src/app/datamodels/containerMultipleCumulativeMetric.datamodel.js deleted file mode 100644 index 3d1a72b09..000000000 --- a/src/app/datamodels/containerMultipleCumulativeMetric.datamodel.js +++ /dev/null @@ -1,90 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerMultipleCumulativeMetricDataModel - * @desc - */ - function ContainerMultipleCumulativeMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateCumulativeMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - if (instance.values.length > 0 && instance.key.indexOf('docker/') !==- 1 ) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', instance.key), - value: lastValue.y - }); - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('ContainerMultipleCumulativeMetricDataModel', ContainerMultipleCumulativeMetricDataModel); - })(); diff --git a/src/app/datamodels/containerNetworkBytesMetric.datamodel.js b/src/app/datamodels/containerNetworkBytesMetric.datamodel.js deleted file mode 100644 index ba859c6b9..000000000 --- a/src/app/datamodels/containerNetworkBytesMetric.datamodel.js +++ /dev/null @@ -1,97 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - (function () { - 'use strict'; - - /** - * @name ContainerNetworkBytesMetricDataModel - * @desc - */ - function ContainerNetworkBytesMetricDataModel(WidgetDataModel, MetricListService, VectorService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - // create create base metrics - var inMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.in.bytes'), - outMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.out.bytes'), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(inMetric.data, function (instance) { - ContainerMetadataService.setCurrentTime(instance.previousTimestamp); - if (instance.values.length > 0 && instance.key.indexOf('veth') !== -1 && ContainerMetadataService.isTimeCurrent(instance.previousTimestamp)) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + ' in', - value: lastValue.y / 1024 - }); - } - }); - - angular.forEach(outMetric.data, function (instance) { - if (instance.values.length > 0 && instance.key.indexOf('veth') !==- 1 && ContainerMetadataService.isTimeCurrent(instance.previousTimestamp)) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + ' out', - value: lastValue.y / 1024 - }); - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric('container.network.interface', derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric('container.network.interface'); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('network.interface.in.bytes'); - MetricListService.destroyMetric('network.interface.out.bytes'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('ContainerNetworkBytesMetricDataModel', ContainerNetworkBytesMetricDataModel); - })(); diff --git a/src/app/datamodels/cpuUtilizationMetric.datamodel.js b/src/app/datamodels/cpuUtilizationMetric.datamodel.js deleted file mode 100644 index 738b1bdec..000000000 --- a/src/app/datamodels/cpuUtilizationMetric.datamodel.js +++ /dev/null @@ -1,102 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CpuUtilizationMetricDataModel - * @desc - */ - function CpuUtilizationMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - // create create base metrics - var cpuSysMetric = MetricListService.getOrCreateCumulativeMetric('kernel.all.cpu.sys'), - cpuUserMetric = MetricListService.getOrCreateCumulativeMetric('kernel.all.cpu.user'), - ncpuMetric = MetricListService.getOrCreateMetric('hinv.ncpu'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - cpuInstance, - cpuCount; - - if (ncpuMetric.data.length > 0) { - cpuInstance = ncpuMetric.data[ncpuMetric.data.length - 1]; - - if (cpuInstance.values.length > 0) { - cpuCount = cpuInstance.values[cpuInstance.values.length - 1].y; - - var pushReturnValues = function(instance, keyName) { - if (instance.values.length > 0) { - var lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: keyName, - value: lastValue.y / (cpuCount * 1000) - }); - } - }; - - angular.forEach(cpuSysMetric.data, function (instance) { - pushReturnValues(instance, 'sys'); - }); - - angular.forEach(cpuUserMetric.data, function (instance) { - pushReturnValues(instance, 'user'); - }); - } - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('kernel.all.cpu.sys'); - MetricListService.destroyMetric('kernel.all.cpu.user'); - MetricListService.destroyMetric('hinv.ncpu'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('CpuUtilizationMetricDataModel', CpuUtilizationMetricDataModel); - })(); diff --git a/src/app/datamodels/cumulativeMetric.datamodel.js b/src/app/datamodels/cumulativeMetric.datamodel.js deleted file mode 100644 index 641431812..000000000 --- a/src/app/datamodels/cumulativeMetric.datamodel.js +++ /dev/null @@ -1,55 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CumulativeMetricDataModel - * @desc - */ - function CumulativeMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - this.metric = MetricListService.getOrCreateCumulativeMetric(this.name); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('CumulativeMetricDataModel', CumulativeMetricDataModel); - })(); diff --git a/src/app/datamodels/cumulativeUtilizationMetric.datamodel.js b/src/app/datamodels/cumulativeUtilizationMetric.datamodel.js deleted file mode 100644 index 0ae190c40..000000000 --- a/src/app/datamodels/cumulativeUtilizationMetric.datamodel.js +++ /dev/null @@ -1,81 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CumulativeUtilizationMetricDataModel - * @desc - */ - function CumulativeUtilizationMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - var rawMetric = MetricListService.getOrCreateCumulativeMetric(this.name), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(rawMetric.data, function (instance) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key, - value: lastValue.y / 1000 - }); - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('CumulativeUtilizationMetricDataModel', CumulativeUtilizationMetricDataModel); - })(); diff --git a/src/app/datamodels/diskLatencyMetric.datamodel.js b/src/app/datamodels/diskLatencyMetric.datamodel.js deleted file mode 100644 index 617b6178e..000000000 --- a/src/app/datamodels/diskLatencyMetric.datamodel.js +++ /dev/null @@ -1,112 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name DiskLatencyMetricDataModel - * @desc - */ - function DiskLatencyMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - var readActiveMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.read_rawactive'), - writeActiveMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.write_rawactive'), - readMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.read'), - writeMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.write'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - rawactiveInstance, - lastValue, - rawactiveLastValue, - value; - - function calculateValues(metric, rawactiveMetric, key, outputArr) { - if (metric.data.length > 0) { - angular.forEach(metric.data, function (instance) { - rawactiveInstance = _.find(rawactiveMetric.data, function (element) { - return element.key === instance.key; - }); - if (angular.isDefined(rawactiveInstance)) { - if (instance.values.length > 0) { - if (rawactiveInstance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - rawactiveLastValue = rawactiveInstance.values[instance.values.length - 1]; - if (lastValue.y > 0) { - value = rawactiveLastValue.y / lastValue.y; - } else { - value = 0; - } - outputArr.push({ - timestamp: lastValue.x, - key: instance.key + key, - value: value - }); - } - } - } - }); - } - } - - calculateValues(readMetric, readActiveMetric, ' read latency', returnValues); - calculateValues(writeMetric, writeActiveMetric, ' write latency', returnValues); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('disk.dev.read_rawactive'); - MetricListService.destroyMetric('disk.dev.write_rawactive'); - MetricListService.destroyMetric('disk.dev.read'); - MetricListService.destroyMetric('disk.dev.write'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('DiskLatencyMetricDataModel', DiskLatencyMetricDataModel); - })(); diff --git a/src/app/datamodels/dummyMetric.datamodel.js b/src/app/datamodels/dummyMetric.datamodel.js deleted file mode 100644 index 832561fe4..000000000 --- a/src/app/datamodels/dummyMetric.datamodel.js +++ /dev/null @@ -1,50 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name DummyMetricDataModel - * @desc - */ - function DummyMetricDataModel(WidgetDataModel, MetricListService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.metric = MetricListService.getOrCreateMetric('kernel.uname.release'); - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric('kernel.uname.release'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('DummyMetricDataModel', DummyMetricDataModel); - })(); diff --git a/src/app/datamodels/memoryUtilizationMetric.datamodel.js b/src/app/datamodels/memoryUtilizationMetric.datamodel.js deleted file mode 100644 index de5666a5e..000000000 --- a/src/app/datamodels/memoryUtilizationMetric.datamodel.js +++ /dev/null @@ -1,149 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MemoryUtilizationMetricDataModel - * @desc - */ - function MemoryUtilizationMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - var conversionFunction = function (value) { - return value / 1024; - }, - cachedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.cached', conversionFunction), - usedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.used', conversionFunction), - freeMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.free', conversionFunction), - buffersMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.bufmem', conversionFunction), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - usedValue, - cachedValue, - freeValue, - buffersValue; - - - usedValue = (function () { - if (usedMemMetric.data.length > 0) { - var instance = usedMemMetric.data[usedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - cachedValue = (function () { - if (cachedMemMetric.data.length > 0) { - var instance = cachedMemMetric.data[cachedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - freeValue = (function () { - if (freeMemMetric.data.length > 0) { - var instance = freeMemMetric.data[freeMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - buffersValue = (function () { - if (buffersMemMetric.data.length > 0) { - var instance = buffersMemMetric.data[buffersMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - if (angular.isDefined(usedValue) && - angular.isDefined(cachedValue) && - angular.isDefined(buffersValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'application', - value: usedValue.y - cachedValue.y - buffersValue.y - }); - } - - if (angular.isDefined(cachedValue) && - angular.isDefined(buffersValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'free (cache)', - value: cachedValue.y + buffersValue.y - }); - } - - if (angular.isDefined(freeValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'free (unused)', - value: freeValue.y - }); - } - - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('mem.util.cached'); - MetricListService.destroyMetric('mem.util.used'); - MetricListService.destroyMetric('mem.util.free'); - MetricListService.destroyMetric('mem.util.bufmem'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('MemoryUtilizationMetricDataModel', MemoryUtilizationMetricDataModel); - })(); diff --git a/src/app/datamodels/multipleCumulativeMetric.datamodel.js b/src/app/datamodels/multipleCumulativeMetric.datamodel.js deleted file mode 100644 index f23b228aa..000000000 --- a/src/app/datamodels/multipleCumulativeMetric.datamodel.js +++ /dev/null @@ -1,90 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MultipleCumulativeMetricDataModel - * @desc - */ - function MultipleCumulativeMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateCumulativeMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', instance.key), - value: lastValue.y - }); - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('MultipleCumulativeMetricDataModel', MultipleCumulativeMetricDataModel); - })(); diff --git a/src/app/datamodels/multipleMetric.datamodel.js b/src/app/datamodels/multipleMetric.datamodel.js deleted file mode 100644 index 1fffa0160..000000000 --- a/src/app/datamodels/multipleMetric.datamodel.js +++ /dev/null @@ -1,90 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MultipleMetricDataModel - * @desc - */ - function MultipleMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', instance.key), - value: lastValue.y - }); - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('MultipleMetricDataModel', MultipleMetricDataModel); - })(); diff --git a/src/app/datamodels/networkBytesMetric.datamodel.js b/src/app/datamodels/networkBytesMetric.datamodel.js deleted file mode 100644 index e06f32078..000000000 --- a/src/app/datamodels/networkBytesMetric.datamodel.js +++ /dev/null @@ -1,93 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - (function () { - 'use strict'; - - /** - * @name NetworkBytesMetricDataModel - * @desc - */ - function NetworkBytesMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - // create create base metrics - var inMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.in.bytes'), - outMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.out.bytes'), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue; - - var pushReturnValues = function(instance, metricName) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + metricName, - value: lastValue.y / 1024 - }); - } - }; - - angular.forEach(inMetric.data, function (instance) { - pushReturnValues(instance, ' in'); - }); - - angular.forEach(outMetric.data, function (instance) { - pushReturnValues(instance, ' out'); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('network.interface.in.bytes'); - MetricListService.destroyMetric('network.interface.out.bytes'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('NetworkBytesMetricDataModel', NetworkBytesMetricDataModel); - })(); diff --git a/src/app/datamodels/perCpuUtilizationMetric.datamodel.js b/src/app/datamodels/perCpuUtilizationMetric.datamodel.js deleted file mode 100644 index b9fec2b37..000000000 --- a/src/app/datamodels/perCpuUtilizationMetric.datamodel.js +++ /dev/null @@ -1,95 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name PerCpuUtilizationMetricDataModel - * @desc - */ - function PerCpuUtilizationMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - var cpuSysMetric = MetricListService.getOrCreateCumulativeMetric('kernel.percpu.cpu.sys'), - cpuUserMetric = MetricListService.getOrCreateCumulativeMetric('kernel.percpu.cpu.user'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - cpuUserInstance, - cpuSysLastValue, - cpuUserLastValue; - - angular.forEach(cpuSysMetric.data, function (cpuSysInstance) { - if (cpuSysInstance.values.length > 0) { - cpuUserInstance = _.find(cpuUserMetric.data, function (el) { - return el.key === cpuSysInstance.key; - }); - if (angular.isDefined(cpuUserInstance)) { - cpuSysLastValue = cpuSysInstance.values[cpuSysInstance.values.length - 1]; - cpuUserLastValue = cpuUserInstance.values[cpuUserInstance.values.length - 1]; - if (cpuSysLastValue.x === cpuUserLastValue.x) { - returnValues.push({ - timestamp: cpuSysLastValue.x, - key: cpuSysInstance.key, - value: (cpuSysLastValue.y + cpuUserLastValue.y) / 1000 - }); - } - } - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('kernel.percpu.cpu.sys'); - MetricListService.destroyMetric('kernel.percpu.cpu.user'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('PerCpuUtilizationMetricDataModel', PerCpuUtilizationMetricDataModel); - })(); diff --git a/src/app/datamodels/simpleMetric.datamodel.js b/src/app/datamodels/simpleMetric.datamodel.js deleted file mode 100644 index 8896d02fe..000000000 --- a/src/app/datamodels/simpleMetric.datamodel.js +++ /dev/null @@ -1,55 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name SimpleMetricDataModel - * @desc - */ - function SimpleMetricDataModel(WidgetDataModel, MetricListService, VectorService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + VectorService.getGuid(); - - this.metric = MetricListService.getOrCreateMetric(this.name); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('app.datamodels') - .factory('MetricDataModel', SimpleMetricDataModel); - })(); diff --git a/src/app/help/CommonIssues.jsx b/src/app/help/CommonIssues.jsx new file mode 100644 index 000000000..392b5637b --- /dev/null +++ b/src/app/help/CommonIssues.jsx @@ -0,0 +1,39 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +class CommonIssues extends React.PureComponent { + render () { + return ( +
+

Common Issues

+ +

Broken stacks: If the runtime does not expose a stack walker that the profiler can use (commonly frame-pointer based), then stack traces will be broken and ancestry will be missing. This is usually visible as a "bed of grass": thin frames all at the same level. The fix depends on the runtime and stack walking technique. Eg, to use frame-pointer walking with Java, Java must be run with -XX:+PreserveFramePointer.

+ +

Missing frames: This shows the native stack trace, after inlining. Runtimes like the JVM can inline as much as 70% of all frames, which will be missing from the flame graph. Vector has an uninlined CPU flame graph task that can reveal these missing frames.

+ +

Missing symbols: JIT runtimes need to export a symbol file for the profiler to use. This depends on the runtime. Java should be handled automatically by Vector, making use of perf-map-agent. Node.js currently needs to run with --perf_basic_prof_only_funcitons or --perf_basic_prof.

+ +

ERROR PMCs not available on this instance (see help): This is commonly the case in the cloud. See the earlier PMCs section.

+
+ ) + } +} + +export default CommonIssues diff --git a/src/app/help/CpuFlamegraphHelp.jsx b/src/app/help/CpuFlamegraphHelp.jsx new file mode 100644 index 000000000..b1d0781a1 --- /dev/null +++ b/src/app/help/CpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function CpuFlamegraphHelp () { + return ( +
+

Summary

+ +

CPU flame graphs visualize code that is consuming CPUs. This widget works using a profiler that does timed sampling of stack traces at 49 Hertz, on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU Profiling

+ +

Timed sampling of stack traces is a common industry method for understanding CPU usage with low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect).

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/CswFlamegraphHelp.jsx b/src/app/help/CswFlamegraphHelp.jsx new file mode 100644 index 000000000..c7d0823ee --- /dev/null +++ b/src/app/help/CswFlamegraphHelp.jsx @@ -0,0 +1,55 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function CswFlamegraphHelp() { + return ( +
+

Summary

+ +

Context switch flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention. This widget works by tracing scheduler context switches, then aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This visualization shows the number of context switches. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler events, which can be very high frequency: tens of millions of events per second. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles to each event will add up, and for high rates of events may begin to cost noticable overhead. Because of this, the default duration is ten seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more frequently it was present in a code path that led to a block (regardless of the blocking duration). The top edge shows what blocked, and beneath it is its ancestry. The color is blue to indicate blocked time, and the saturation value is randomized to differentiate between frames.

+ +

Interpretation & Actionable Items

+ +

This shows code paths that lead to blocking and waiting off-CPU, such as for disk I/O or lock contention. Ideally these can be minimized. Look for the widest stacks and investigate them first. To understand the duration that these spent off-CPU, use the off-CPU time flame graph.

+ +

The actionable fix depends on the code path. Disk I/O can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + + + +
+ ) +} diff --git a/src/app/help/DiskioFlamegraphHelp.jsx b/src/app/help/DiskioFlamegraphHelp.jsx new file mode 100644 index 000000000..9d65adecc --- /dev/null +++ b/src/app/help/DiskioFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function DiskioFlamegraphHelp () { + return ( +
+

Summary

+ +

Disk I/O flame graphs visualize code that directly requested disk I/O, helping explain the cause of disk I/O. This widget works by tracing whenever a disk I/O event is enqueued. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have low overhead while tracing, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph is generated. Relative to other events, disk I/O is usually a low rate activity, hence the low overhead. There are some exceptions: a large database server may be calling tens of thousands of disk I/O per second, which will have a higher overhead to trace, not just for the extra CPU cycles, but also for the file system and storage I/O to store the trace data. If you suspect you have a high overhead case, test and measure overhead before production use.

+ +

Disk I/O Tracing

+ +

The intent here is to show which code paths are causing disk I/O. It workes by tracing when disk I/O events are inserted on a storage queue to be later issued to the device. (This uses the Linux tracepoint: block:block_rq_insert.) This approach is simple and usually identifies the code path of interest. There are worse approaches: for example, mesauring when the disk I/O actually begins, which is often asynchronous to the request, and so does not identify the code path of interest.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what directly triggered a disk I/O request to be queued, and beneath it is its ancestry. The x-axis width is relative to the number of I/O. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/ExternalResources.jsx b/src/app/help/ExternalResources.jsx new file mode 100644 index 000000000..9424c3f05 --- /dev/null +++ b/src/app/help/ExternalResources.jsx @@ -0,0 +1,52 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class ExternalResources extends React.PureComponent { + render () { + const { targetUrl, text } = this.props + + return ( +
+

External Resources

+ + +
+ ) + } +} + +ExternalResources.propTypes = { + targetUrl: PropTypes.string, + text: PropTypes.string, +} + +export default ExternalResources diff --git a/src/app/help/IpcFlamegraphHelp.jsx b/src/app/help/IpcFlamegraphHelp.jsx new file mode 100644 index 000000000..8b4086e32 --- /dev/null +++ b/src/app/help/IpcFlamegraphHelp.jsx @@ -0,0 +1,67 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function IpcFlamegraphHelp () { + return ( +
+

Summary

+ +

IPC flame graphs visualize code that is consuming CPUs, and uses a color spectrum to indicate the instructions-per-cycle (IPC) for individual functions: red means instruction heavier, and blue means cycle heavier (usually stall cycles). This widget works by using a profiler that does overflow-based sampling of stack traces for CPU cycle and instruction events via performance monitoring counters (PMCs), on all running CPUs. Only one in 100 million events are sampled. This runs as a background task until the profile is completed. This only works if PMCs are available on the server, which for many cloud instance types will not be.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

PMCs

+ +

Performance monitoring counters (PMCs) are special programmable hardware counters that report low-level processor behavior. In many cloud environments they are currently disabled. They should currently be available for the largest instance types on AWS EC2. To test at the command line, on Linux, run "perf stat ls" and see if the cycles and instructions counters are measured (if not, they will report "<not supported>").

+ +

IPC Profiling

+ +

Instructions-per-cycle (IPC) is a PMC-based metric commonly used as a starting point for understanding for low-level CPU behavior, particularly whether code is limited by the speed of instruction execution or other resources (usually main memory). The higher the IPC, the more quickly the processor is completing instructions (aka "retiring" instructions). The are many more PMCs for providing more information when desired.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the profile of CPU cycles (equivalent to a CPU flame graph). The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used to show the range of IPC values present in the profile, from red (more instruction heavy) to blue (more cycle heavy). The color spectrum is relative to each flame graph, so the most blue frame in one flame graph may have a different IPC to the most blue frame in another. The gloabal IPC value for the flame graph is shown in the subtitle.

+ +

Interpretation & Actionable Items

+ +

If functions are colored red, they are instruction heavy (with a high IPC), if they are colored blue, they are cycle heavy (a low IPC) and likely stalled on memory I/O.

+

Examples of instruction optimizations:

+
    +
  • – by the system administrator: choosing systems with faster processors, disabling hyperthreads, reducing CPU contention.
  • +
  • – by the developer: finding and eliminating unnecessary work, using faster algorithms.
  • +
+

Examples of memory I/O optimizations:

+
    +
  • – by the system administrator: using different system NUMA settings, using different memory settings including large pages, and choosing systems with larger CPU caches or with faster main memory.
  • +
  • – by the developer: changing the code to do fewer memory copies and object allocations, and using more memory efficient data structures.
  • +
+

As for the IPC value shown in the subtitle: interpreting this depends on the processor and its superscalar retire width. For example, many modern processors can retire four instructions with every cycle, which means its top speed IPC is 4.0 (when executing NOPs). For a production workload that involves memory I/O, an IPC of 1.5 may be considered good (it depends).

+ + + + +
+ ) +} diff --git a/src/app/help/OffcpuFlamegraphHelp.jsx b/src/app/help/OffcpuFlamegraphHelp.jsx new file mode 100644 index 000000000..6f2436565 --- /dev/null +++ b/src/app/help/OffcpuFlamegraphHelp.jsx @@ -0,0 +1,53 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function OffcpuFlamegraphHelp () { + return ( +
+

Summary

+ +

Off-CPU time flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention, and is a complementary visualization to CPU flame graphs. This widget works by tracing scheduler context switches, then aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler events, which can be very high frequency: tens of millions of events per second. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles to each event will add up, and for high rates of events may begin to cost noticable overhead. Because of this, the default duration is ten seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the trace of off-CPU time. The top edge shows what blocked, and beneath it is its ancestry. The color is blue to indicate blocked time, and the saturation value is randomized to differentiate between frames.

+ +

Interpretation & Actionable Items

+ +

Look for applications of interest (the process name is the bottom frame), and then brows its blocked stacks from the widest to the thinnest. There will likely be many paths that are the application waiting for work, and so the stack trace is not interesting. Those are often the widest. Look for paths that occur during an application request, such as for lock contention and disk I/O.

+ +

The actionable fix depends on the code path. Disk I/O time can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + +
+ ) +} diff --git a/src/app/help/OffwakeFlamegraphHelp.jsx b/src/app/help/OffwakeFlamegraphHelp.jsx new file mode 100644 index 000000000..ad7a6a08f --- /dev/null +++ b/src/app/help/OffwakeFlamegraphHelp.jsx @@ -0,0 +1,57 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PackagenameCpuFlamegraphHelp() { + return ( +
+

Summary

+ +

Off-Wake time flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention, and include both the blocked stack and the waker stack. This is an advanced visualization that works by tracing blocking and wakeup scheduler events, then associating and aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler switch and wakeup events, which can be very high frequency: tens of millions of events per second, and saves wakeup stacks in kernel memory to associate with blocked stacks. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles and memory usage to each event will add up, and for high rates of events this may cost significant overhead. Because of this, the default duration is five seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the trace of off-CPU time. The saturation value is randomized to differentiate between frames.

+ +

In shades of blue, and up until a "--" delimiter frame, is the blocking (off-CPU) stack trace. The top frame of this shows what blocked, and beneath it is its ancestry. The very bottom frame is the process name. The width is how long it was blocked off-CPU.

+ +

In shades of aqua, above a "--" delimiter frame, is the wakeup stack trace. This is in reverse order, so the bottom frame is the top of the stack which did the wakeup, and everything above it is ancestry. This reversing allows the wakeup frame to meet the blocked frame that it woke up in the middle. The very top frame is the process name that did the wakeup.

+ +

Interpretation & Actionable Items

+ +

Look for applications of interest (the process name is the bottom frame), and then brows its blocked stacks from the widest to the thinnest. There will likely be many paths that are the application waiting for work, and so the stack trace is not interesting. Those are often the widest. Look for paths that occur during an application request, such as for lock contention and disk I/O. You can browse the wakeup stacks for more context on why something was blocked.

+ +

The actionable fix depends on the code path. Disk I/O time can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + +
+ ) +} diff --git a/src/app/help/PackagenameCpuFlamegraphHelp.jsx b/src/app/help/PackagenameCpuFlamegraphHelp.jsx new file mode 100644 index 000000000..fcb432cc0 --- /dev/null +++ b/src/app/help/PackagenameCpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PackagenameCpuFlamegraphHelp() { + return ( +
+

Summary

+ +

Package name flame graphs visualize code that is directly consuming CPUs, and visualizes this as a hierarchy based on the package name (currently only supports Java package names). This widget works using a profiler that does timed sampling of the instruction pointer at 49 Hertz, on all running CPUs. This does not need the application to support stack traces, as it only measures the running function (ie, for Java, this does not need -XX:+PreserveFramePointer, so this can be useful for analyzing applications that are running without it). It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU IP Profiling

+ +

Timed sampling of the instruction pointer (aka program counter) is a common industry method for understanding CPU usage with very low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect). This is also different to profiling stack traces, as is typical with flame graphs. In this case, the stack trace is not collected, so code ancestry is not known or shown. The advantage is a different view of CPU consumption, that can be used in addition to normal flame graphs.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis in this case traverses components of the function or method package name. Each rectangle represents a component of the function or method name. The wider a frame is is, the more often it was present in the profile. The top edge shows the functions that are on-CPu, and beneath them are the larger package groups that they belong to. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/PagefaultFlamegraphHelp.jsx b/src/app/help/PagefaultFlamegraphHelp.jsx new file mode 100644 index 000000000..61628e8ad --- /dev/null +++ b/src/app/help/PagefaultFlamegraphHelp.jsx @@ -0,0 +1,51 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PagefaultFlamegraphHelp () { + return ( +
+

Summary

+ +

Page fault flame graphs visualize code that is triggering page faults, which can explain application memory growth (the growth of resident set size: RSS). This widget works by tracing page faults on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have low overhead while tracing, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated. Page faults are usually a low rate activity, hence the low overhead. There are some exceptions: software builds that use hundreds of short-lived processes per second can have a much higher rate of page faults, as well as applications that are growing RSS quickly. In such cases, this task may have a higher overhead, not just for the extra CPU cycles, but also for the file system and storage I/O to store the trace data. If you suspect you have a high overhead case, test and measure overhead before production use.

+ +

Page Fault Tracing

+ +

This is one way to analyze memory growth, in this case, the growth of resident set size (RSS).

+

Linux (like most operating systems) uses on-demand memory page allocation. When an application allocates memory (eg, malloc()), the operating system tracks the allocation but does not map physical memory to the process until it begins writing to it. At that point, the lie is revealed, and the processor's memory manangement unit (MMU) will "fault", as there is no virtual-to-physical mapping for the requested address. The kernel handles the fault, and makes the mapping. This is a normal way that processes end up using main memory, and defers the cost of allocation to later on, and only for the pages (unit of memory) that are written to.

+

Some applications pre-allocate memory (by which they mean touch it all – they write to it on startup so that it has mapped to physical memory). In those cases, RSS should be static, and this flame graph won't show many trace application events.

+

To be clear about this: page fault tracing can explain memory growth where the application may end up being out-of-memory (OOM) killed. It usually can't explain memory leaks where the application ends up calling garbage collection more frequently, since in those cases the application may or may not be growing RSS. This can only see RSS growth.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what directly triggered page faults, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + +
+ ) +} diff --git a/src/app/help/UninlinedCpuFlamegraphHelp.jsx b/src/app/help/UninlinedCpuFlamegraphHelp.jsx new file mode 100644 index 000000000..84b596d3b --- /dev/null +++ b/src/app/help/UninlinedCpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function UninlinedCpuFlamegraphHelp () { + return ( +
+

Summary

+ +

Uninlined CPU flame graphs visualize code that is consuming CPUs, and attempts to uninline application frames so that full stacks are shown (currently only supports Java). This widget works using a profiler that does timed sampling of stack traces at 49 Hertz, on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU Profiling

+ +

Timed sampling of stack traces is a common industry method for understanding CPU usage with low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect).

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/index.html b/src/app/index.html new file mode 100644 index 000000000..043b1b207 --- /dev/null +++ b/src/app/index.html @@ -0,0 +1,15 @@ + + + + + Vector + + + + + + + +
+ + diff --git a/src/app/metrics/converted.metric.js b/src/app/metrics/converted.metric.js deleted file mode 100644 index 63e55a30b..000000000 --- a/src/app/metrics/converted.metric.js +++ /dev/null @@ -1,72 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name ConvertedMetric - * @desc - */ - function ConvertedMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name, conversionFunction) { - this.base = SimpleMetric; - this.base(name); - this.conversionFunction = conversionFunction; - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - convertedValue; - - convertedValue = self.conversionFunction(value); - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isDefined(instance) && instance !== null) { - instance.values.push({ x: timestamp, y: convertedValue }); - overflow = instance.values.length - (($rootScope.properties.window * 60) / $rootScope.properties.interval); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } else { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [{x: timestamp, y: convertedValue}, {x: timestamp + 1, y: convertedValue}] - }; - self.data.push(instance); - } - }; - - return Metric; - } - - angular - .module('app.metrics') - .factory('ConvertedMetric', ConvertedMetric); - })(); diff --git a/src/app/metrics/cumulative.metric.js b/src/app/metrics/cumulative.metric.js deleted file mode 100644 index 306fd477c..000000000 --- a/src/app/metrics/cumulative.metric.js +++ /dev/null @@ -1,78 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name CumulativeMetric - * @desc - */ - function CumulativeMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name) { - this.base = SimpleMetric; - this.base(name); - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - diffValue; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [], - previousValue: value, - previousTimestamp: timestamp - }; - self.data.push(instance); - } else { - diffValue = ((value - instance.previousValue) / ((timestamp - instance.previousTimestamp) / 1000)); // sampling frequency - if (instance.values.length < 1) { - instance.values.push({ x: timestamp, y: diffValue }, { x: timestamp + 1, y: diffValue }); - } else { - instance.values.push({ x: timestamp, y: diffValue }); - } - instance.previousValue = value; - instance.previousTimestamp = timestamp; - overflow = instance.values.length - (($rootScope.properties.window * 60) / $rootScope.properties.interval); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }; - - return Metric; - } - - angular - .module('app.metrics') - .factory('CumulativeMetric', CumulativeMetric); - })(); diff --git a/src/app/metrics/cumulativeConverted.metric.js b/src/app/metrics/cumulativeConverted.metric.js deleted file mode 100644 index b2de81fef..000000000 --- a/src/app/metrics/cumulativeConverted.metric.js +++ /dev/null @@ -1,77 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name CumulativeConvertedMetric - * @desc - */ - function CumulativeConvertedMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name, conversionFunction) { - this.base = Metric; - this.base(name); - this.conversionFunction = conversionFunction; - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - diffValue, - convertedValue; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [], - previousValue: value, - previousTimestamp: timestamp - }; - self.data.push(instance); - } else { - diffValue = ((value - instance.previousValue) / (timestamp - instance.previousTimestamp)); // sampling frequency - convertedValue = self.conversionFunction(diffValue); - instance.values.push({ x: timestamp, y: convertedValue }); - instance.previousValue = value; - instance.previousTimestamp = timestamp; - overflow = instance.values.length - (($rootScope.properties.window * 60) / $rootScope.properties.interval); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }; - - return Metric; - } - - angular - .module('app.metrics') - .factory('CumulativeConvertedMetric', CumulativeConvertedMetric); - })(); diff --git a/src/app/metrics/derived.metric.js b/src/app/metrics/derived.metric.js deleted file mode 100644 index 9961dc251..000000000 --- a/src/app/metrics/derived.metric.js +++ /dev/null @@ -1,79 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name DerivedMetric - * @desc - */ - function DerivedMetric($rootScope) { - - var Metric = function (name, derivedFunction) { - this.name = name; - this.data = []; - this.subscribers = 1; - this.derivedFunction = derivedFunction; - }; - - Metric.prototype.updateValues = function () { - var self = this, - values; - - values = self.derivedFunction(); // timestamp, key, data - - if (values.length !== self.data.length) { - self.data.length = 0; - } - - angular.forEach(values, function (data) { - var overflow, - instance = _.find(self.data, function (el) { - return el.key === data.key; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: data.key, - values: [{x: data.timestamp, y: data.value}, {x: data.timestamp + 1, y: data.value}] - }; - self.data.push(instance); - } else { - instance.values.push({x: data.timestamp, y: data.value}); - overflow = instance.values.length - (($rootScope.properties.window * 60) / $rootScope.properties.interval); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }); - }; - - Metric.prototype.clearData = function () { - this.data.length = 0; - }; - - return Metric; - } - - angular - .module('app.metrics') - .factory('DerivedMetric', DerivedMetric); - })(); diff --git a/src/app/metrics/simple.metric.js b/src/app/metrics/simple.metric.js deleted file mode 100644 index 0935381e1..000000000 --- a/src/app/metrics/simple.metric.js +++ /dev/null @@ -1,75 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name SimpleMetric - * @desc - */ - function SimpleMetric($rootScope) { - - var Metric = function (name) { - this.name = name || null; - this.data = []; - this.subscribers = 1; - }; - - Metric.prototype.toString = function () { - return this.name; - }; - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isDefined(instance) && instance !== null) { - instance.values.push({ x: timestamp, y: value }); - overflow = instance.values.length - (($rootScope.properties.window * 60) / $rootScope.properties.interval); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } else { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [{x: timestamp, y: value}, {x: timestamp + 1, y: value}] - }; - self.data.push(instance); - } - }; - - Metric.prototype.clearData = function () { - this.data.length = 0; - }; - - return Metric; - } - - angular - .module('app.metrics') - .factory('SimpleMetric', SimpleMetric); - })(); diff --git a/src/app/processors/customChartModel.js b/src/app/processors/customChartModel.js new file mode 100644 index 000000000..9b46f789b --- /dev/null +++ b/src/app/processors/customChartModel.js @@ -0,0 +1,69 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +import { + defaultTitleAndKeylabel, + cumulativeTransform, + mathAllValues, +} from './transforms' + +/** + * Extracts all required data for a chart from the input datasets. Constructs the + * transform pipeline from the chart configuration at runtime. + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = constructTransformPipeline(chartInfo) + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + return transformed +} + +/** + * Creates the transform pipeline for the custom metric + */ +function constructTransformPipeline(chartInfo) { + let transforms = [] + transforms.push(defaultTitleAndKeylabel()) + if (chartInfo.cumulative) { + transforms.push(cumulativeTransform()) + } + if (chartInfo.converted && chartInfo.conversionFunction) { + const conversionFunction = new Function('value', 'return ' + chartInfo.conversionFunction + ';') + transforms.push(mathAllValues(conversionFunction)) + } + return transforms +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || null +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/customTableModel.js b/src/app/processors/customTableModel.js new file mode 100644 index 000000000..cd2ca3b02 --- /dev/null +++ b/src/app/processors/customTableModel.js @@ -0,0 +1,72 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +import { + defaultTitleAndKeylabel, + cumulativeTransform, + mathAllValues, + onlyLatestValues, +} from './transforms' + +/** + * Extracts all required data for a chart from the input datasets. Constructs the + * transform pipeline from the chart configuration at runtime. + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = constructTransformPipeline(chartInfo) + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + return transformed +} + +/** + * Creates the transform pipeline for the custom metric + */ +function constructTransformPipeline(chartInfo) { + let transforms = [] + transforms.push(defaultTitleAndKeylabel()) + if (chartInfo.cumulative) { + transforms.push(cumulativeTransform()) + } + if (chartInfo.converted && chartInfo.conversionFunction) { + const conversionFunction = new Function('value', 'return ' + chartInfo.conversionFunction + ';') + transforms.push(mathAllValues(conversionFunction)) + } + transforms.push(mathAllValues(chartInfo.yTickFormat)) + transforms.push(onlyLatestValues()) + return transforms +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || null +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/formats.js b/src/app/processors/formats.js new file mode 100644 index 000000000..31003c088 --- /dev/null +++ b/src/app/processors/formats.js @@ -0,0 +1,23 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as d3 from "d3-format"; // does work + +export const percentage = d3.format('.0%') +export const integer = d3.format('.0f') +export const number = d3.format('.02f') diff --git a/src/app/processors/formats.spec.js b/src/app/processors/formats.spec.js new file mode 100644 index 000000000..2f80b8bd2 --- /dev/null +++ b/src/app/processors/formats.spec.js @@ -0,0 +1,82 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as formats from './formats' +import { expect } from 'chai' + +describe('percentage', () => { + describe('with integer', () => { + let data = 3 + it('returns correct percentage', () => { + let result = formats.percentage(data) + expect(result).to.equal('300%') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns two decimal place number', () => { + let result = formats.percentage(data) + expect(result).to.equal('312%') + }) + }) + + describe('with real number (0 first place)', () => { + let data = 0.12345 + it('returns two decimal place number', () => { + let result = formats.percentage(data) + expect(result).to.equal('12%') + }) + }) +}) + +describe('number', () => { + describe('with integer', () => { + let data = 3 + it('returns two decimal place number', () => { + let result = formats.number(data) + expect(result).to.equal('3.00') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns two decimal place number', () => { + let result = formats.number(data) + expect(result).to.equal('3.12') + }) + }) +}) + +describe('integer', () => { + describe('with integer', () => { + let data = 3 + it('returns integer', () => { + let result = formats.integer(data) + expect(result).to.equal('3') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns integer', () => { + let result = formats.integer(data) + expect(result).to.equal('3') + }) + }) +}) diff --git a/src/app/processors/modelUtils.js b/src/app/processors/modelUtils.js new file mode 100644 index 000000000..515bdf62c --- /dev/null +++ b/src/app/processors/modelUtils.js @@ -0,0 +1,61 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +export function transformRawDataToPipelineData (datasets, chartInfo) { + // quick clean loops + const passMetrics = chartInfo.metricNames + + let output = [] + for(const { timestamp, values } of datasets) { + const ts = new Date(timestamp.s * 1000 + timestamp.us / 1000) + + // TODO this is a hot loop, some different data access especially output.find() will probably improve things greatly + for (const { name, instances } of values) { + if (!passMetrics.includes(name)) continue + + for (const { instance, value } of instances) { + if (value === null) continue + + // ensure there is a metric inside the instance + let mi = output.find(e => e.metric === name && e.instance === instance) + if (!mi) { + mi = { metric: name, instance, data: [] } + output.push(mi) + } + + // and put the data in there + mi.data.push({ ts, value }) + } + } + } + + return output +} + +export function getLargestValueInDataset (dataset) { + let max = -Number.MAX_VALUE + if (!dataset) return undefined + + for (let d of dataset) { + for (let tsv of d.data) { + max = Math.max(max, tsv.value) + } + } + return (max === -Number.MAX_VALUE) ? undefined : max +} + diff --git a/src/app/processors/modelUtils.spec.js b/src/app/processors/modelUtils.spec.js new file mode 100644 index 000000000..a58e9f807 --- /dev/null +++ b/src/app/processors/modelUtils.spec.js @@ -0,0 +1,284 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './modelUtils' +import { expect } from 'chai' + +describe('transformRawDataToPipelineData', () => { + describe('with a full dataset', () => { + let rawdatasets + beforeEach(() => { + rawdatasets = require('../../../test/rawdata.json') + }) + + describe('for kernel.all.load', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['kernel.all.load'] }) + expect(pipelineData.length).to.equal(3) + expect(pipelineData).to.have.deep.members([ + { "metric": "kernel.all.load", "instance": 1, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.1 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.1 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0.090000004 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0.090000004 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0.090000004 } + ] }, + { "metric": "kernel.all.load", "instance": 5, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0.039999999 } + ] }, + { "metric": "kernel.all.load", "instance": 15, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.0099999998 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.0099999998 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0 } + ] + } + ]) + }) + }) + + describe('for bcc.runq.latency', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['bcc.runq.latency'] }) + expect(pipelineData.length).to.equal(18) + expect(pipelineData).to.have.deep.members([ + { "metric": "bcc.runq.latency", "instance": 0, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 5583 } + ] }, + { "metric": "bcc.runq.latency", "instance": 1, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 130837 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 130838 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 130840 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 130840 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 130842 } + ] }, + { "metric": "bcc.runq.latency", "instance": 2, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 256041 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 256049 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 256061 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 256063 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 256079 } + ] }, + { "metric": "bcc.runq.latency", "instance": 3, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 107807 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 107833 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 107855 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 107858 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 107885 } + ] }, + { "metric": "bcc.runq.latency", "instance": 4, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 110856 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 110898 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 110937 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 110974 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 110997 } + ] }, + { "metric": "bcc.runq.latency", "instance": 5, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 60577 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 60583 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 60595 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 60615 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 60642 } + ] }, + { "metric": "bcc.runq.latency", "instance": 6, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 294239 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 294242 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 294249 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 294255 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 294266 } + ] }, + { "metric": "bcc.runq.latency", "instance": 7, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 29600 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 29602 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 29606 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 29611 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 29616 } + ] }, + { "metric": "bcc.runq.latency", "instance": 8, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 6820 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 6822 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 6827 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 6827 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 6829 } + ] }, + { "metric": "bcc.runq.latency", "instance": 9, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 3919 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 3922 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 3923 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 3923 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 3925 } + ] }, + { "metric": "bcc.runq.latency", "instance": 10, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2453 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2454 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2454 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2457 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2459 } + ] }, + { "metric": "bcc.runq.latency", "instance": 11, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 3321 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 3322 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 3323 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 3324 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 3328 } + ] }, + { "metric": "bcc.runq.latency", "instance": 12, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2065 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2066 } + ] }, + { "metric": "bcc.runq.latency", "instance": 13, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 588 } + ] }, + { "metric": "bcc.runq.latency", "instance": 14, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 209 } + ] }, + { "metric": "bcc.runq.latency", "instance": 15, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 57 } + ] }, + { "metric": "bcc.runq.latency", "instance": 16, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 19 } + ] }, + { "metric": "bcc.runq.latency", "instance": 17, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2 } + ] } + ]) + }) + }) + + describe('for kernel.all.cpu.sys and hinv.ncpu', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['kernel.all.cpu.sys', 'hinv.ncpu'] }) + expect(pipelineData.length).to.equal(2) + expect(pipelineData).to.have.deep.members([ + { "metric": "kernel.all.cpu.sys", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 365600 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 365620 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 365630 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 365640 } + ] }, + { "metric": "hinv.ncpu", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 1 } + ] } + ]) + }) + }) + + describe('for invalid metric', () => { + it.skip('returns null', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['zzzz'] }) + expect(pipelineData).to.equal(null) + }) + }) + }) +}) + +describe('getLargestValueInDataset', () => { + describe('with undefined input', () => { + let data = undefined + it('returns undefined', () => { + expect(utils.getLargestValueInDataset(data)).to.equal(undefined) + }) + }) + + describe('with no values', () => { + let data = [] + it('returns undefined', () => { + expect(utils.getLargestValueInDataset(data)).to.equal(undefined) + }) + }) + + describe('with many values', () => { + let rawdatasets = [ + { "metric": "kernel.all.cpu.sys", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 365600 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 365620 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 365630 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 365640 } + ] }, + { "metric": "hinv.ncpu", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 1 } + ] } + ] + it('returns the biggest', () => { + expect(utils.getLargestValueInDataset(rawdatasets)).to.equal(365640) + }) + }) +}) diff --git a/src/app/processors/nullModel.js b/src/app/processors/nullModel.js new file mode 100644 index 000000000..1b4a16056 --- /dev/null +++ b/src/app/processors/nullModel.js @@ -0,0 +1,33 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/** + * Provides a dummy model that produces no data + */ +function calculateChart() { + return [ 'empty' ] +} + +function requiredMetricNames() { + return [] +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/simpleModel.js b/src/app/processors/simpleModel.js new file mode 100644 index 000000000..3e614b385 --- /dev/null +++ b/src/app/processors/simpleModel.js @@ -0,0 +1,47 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +/** + * Extracts all required data for a chart from the input datasets, and applies required transforms + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = chartInfo.transforms || [] + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + + return transformed +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || [] +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/transforms.js b/src/app/processors/transforms.js new file mode 100644 index 000000000..cd967d45a --- /dev/null +++ b/src/app/processors/transforms.js @@ -0,0 +1,350 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + untransposeTimeslices, + applyFunctionsToTimeslices, + combineValuesByTitleReducer, + transposeToTimeslices +} from './utils' + +/* helper to allow selecting all values */ +const SELECT_ALL_FN = () => true + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @param {function} the function that decides whether a cumulative transform should be applied + * @returns {function} a transform function + */ +function cumulativeTransformSelective (shouldApplyFn) { + function nominalTsValueToIntervalTsValue(elem, index, arr) { + if (index === 0) return [] + let prev = arr[index - 1] + return { + ...elem, // copy everything over and replace the value with time scaled from previous + value: ((elem.value - prev.value) / ((elem.ts - prev.ts) / 1000)) + } + } + + return function _cumulativeTransformSelective (metricInstances) { + return metricInstances.map(mi => { + return shouldApplyFn(mi) + ? { ...mi, data: mi.data.map(nominalTsValueToIntervalTsValue).slice(1) } + : mi + }) + } +} + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @returns {function} a transform function + */ +export const cumulativeTransform = () => cumulativeTransformSelective(SELECT_ALL_FN) + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @param {metricNames} list of metric names to apply transform to + * @returns {function} a transform function + */ +export function cumulativeTransformOnlyMetrics (metricNames) { + return cumulativeTransformSelective(mi => metricNames.includes(mi.metric)) +} + +/** + * Perform generic (typically linear) math on instantaneous values + * + * @param {function} math the function that will be executed on all values + * @param {function} shouldApplyFn the function that decides whether the transform will apply + * @return {function} a transform function + */ +export function mathValuesSelective (math, shouldApplyFn) { + return function _mathSomeSelective (metricInstances) { + return metricInstances.map(mi => { + let result = shouldApplyFn(mi) + ? { ...mi, data: mi.data.map(({ ts, value }) => ({ ts, value: math(value) })) } + : mi + return result + }) + } +} + +/** + * Perform generic (typically linear) math on all instantaneous values in a dataset + * + * @param {function} math the function that will be executed on all values + * @return {function} a transform function + */ +export const mathAllValues = (fn) => mathValuesSelective(fn, SELECT_ALL_FN) + +/** + * Perform a kb->gb conversion of all values (ie: divide by 1024^2) + * + * @return {function} a transform function + */ +export const kbToGb = () => mathAllValues(v => v / 1024 / 1024) + +/** + * Perform a division of all values by a constant + * + * @param {number} divisor the constant that will be the divisor + * @return {function} a transform function + */ +export const divideBy = (divisor) => mathAllValues(v => v / divisor) + +/** + * Perform a Math.ceiling against all values + * + * @return {function} a transform function + */ +export const ceiling = () => mathAllValues(v => Math.ceil(v)) + +/** + * Perform a division of values by a constant for the given metrics + * + * @param {number} divisor the constant that will be the divisor + * @param {metricNames} array the list of metric names to transform + * @return {function} a transform function + */ +export const divideByOnlyMetric = (divisor, metricNames) => + mathValuesSelective((v) => v / divisor, (i) => metricNames.includes(i.metric)) + +/** + * Combine metrics sharing the same 'title', applying some function to combine them, for + * example a sum function. + * + * @param {function} fn the combiner (eg a sum function) that will be used to reduce across values + * @return {function} a transform function + */ +export function combineValuesByTitle (fn) { + return function _combineValuesByTitle (metricInstances) { + return metricInstances.reduce(combineValuesByTitleReducer(fn), []) + } +} + +/** + * Divide all values (excluding seriesName) by the values in seriesName, assumes there is only one instance + * for the divisor metric. + * + * @param {string} metricName the divisor metric name + * @return {function} a transform function + */ +export function divideBySeries (divisorMetricName) { + return function _divideBySeries (metricInstances) { + const divisorSeries = metricInstances.find(mi => mi.metric === divisorMetricName).data + const outputs = metricInstances.filter(mi => mi.metric !== divisorMetricName) + let result = outputs.map(mi => { + return { + ...mi, + data: mi.data.map(({ ts, value }) => { + // look up ts in divisor array + let divPoint = divisorSeries.find(divisor => ts.getTime() === divisor.ts.getTime()) + // return value divided by divisor value + return { ts, value: value / divPoint.value } + }) + } + }) + return result + } +} + +/** + * Adds a default title and keylabel to the metric instances + * + * @return {function} a transform function + */ +export function defaultTitleAndKeylabel () { + return function _defaultTitleAndKeylabel (metricInstances) { + return metricInstances.map(mi => { + const defaultTitle = (mi.instance === -1 || mi.instance === '-1') ? mi.metric : `${mi.metric} (${mi.instance})` + return { ...mi, title: defaultTitle, keylabel: defaultTitle } + }) + } +} + +/** + * Adds a custom title and keylabel to the metric instances, where the title and keylabel is generated by a + * user specified function + * + * @param {function} titleFn the fn that will be called to map the metric and instance names to a title + * @return {function} a transform function + */ +export function customTitleAndKeylabel (titleFn) { + return function _customTitleAndKeylabel (metricInstances) { + return metricInstances.map(mi => { + const newTitleAndKeylabel = titleFn(mi.metric, mi.instance) + return { + ...mi, + title: newTitleAndKeylabel, + keylabel: newTitleAndKeylabel, + } + }) + } +} + +/** + * Maps PCP instance domains to metric instances + * Used to map pcp instance ids (such as 0, 1, 2, ...) to strings such as ('xvda', 'xvdb', etc) + * + * @param {string} the instance name to map as, 'instance' if not provided + * @return {function} a transform function + */ +export function mapInstanceDomains (name) { + let tagName = name || 'instance' + return function _mapInstanceDomains (metricInstances, { instanceDomainMappings }) { + return metricInstances.map(mi => ({ + ...mi, + [tagName]: (instanceDomainMappings[mi.metric] && instanceDomainMappings[mi.metric][mi.instance]) || mi.instance + })) + } +} + +/** + * Maps container names to the container instance id + * + * @param {metricNames} array the list of metric names that will have the instance tag mapped to a container + * @param {containerNameResolver} function callback to transform metadata to container name, will be passed { instance, cgroup, containerId } + * @return {function} a transform function + */ +export function mapContainerNames (metricNames, containerNameResolver) { + return function _mapContainerNames (metricInstances, { containerList }) { + return metricInstances + .map(mi => { + if (! metricNames.includes(mi.metric)) return mi + let container = containerList.find(e => e.cgroup === mi.instance) || {} + return { ...mi, instance: containerNameResolver(container) } + }) + // make sure the instance had a valid name + .filter(mi => !!mi.instance) + } +} + +/** + * Logs data at this point in the pipeline (does not actually transform the data) + * + * @param {string} message the log message to add to the console output + * @return {function} a transform function + */ +export function log (message) { + return function _log (metricInstances) { + console.log(message, metricInstances) + return metricInstances + } +} + +/** + * Completely transforms an input set of data at each timepoint + * Assumes that a time sample exists at each point + * + * This is probably an expensive transform though so there may be cheaper ways to hardcode (tbc) + * + * Best to see some of the examples to see what is possible + * + * @param {object} an associative set specifying, for a given output at a given time series, what the fn to be applied should be + * @return {function} a transform function + */ +export function timesliceCalculations (calcs) { + return function _timesliceCalculations (metricInstances) { + const slices = transposeToTimeslices(metricInstances) + const calculated = applyFunctionsToTimeslices(slices, calcs) + const untransposed = untransposeTimeslices(calculated) + return untransposed + } +} + +/** + * Renames one or more metric names + * + * @param {object} a rename mapping table + * @return {function} a transform function + */ +export function renameMetric (renames) { + return function _renameMetric (metricInstances) { + return metricInstances.map(mi => ({ + ...mi, + metric: (mi.metric in renames) ? renames[mi.metric] : mi.metric + })) + } +} + +/** + * Removes anything not matching the configured containerId + * + * Assumes the 'instance' tag refers to the container id, which it should do immediately after a mapContainerNames + * if containerId is falsey, return existing instances + * + * @param {string} metricNames the metric names to check for valid container ids + * @return {function} a transform function + */ +export function filterForContainerId (metricNames) { + return function _filterForContainerId (metricInstances, { containerId }) { + if (!containerId) return metricInstances + // only filter out where (it is not a filterable metric) or (it is a filterable metric and the container instance matches) + return metricInstances.filter(mi => !metricNames.includes(mi.metric) || metricNames.includes(mi.metric) && containerId === mi.instance) + } +} + +/** + * Filter metric names so that only metrics in the referenced list will be passed through + * + * @param {string} the name of the key in which to find metric names to filter by (this will be read from chartInfo) + * + * @return {function} a transform function + */ +export function filterKeepSelectedMetrics (chartInfoKey) { + return function _filterKeepSelectedMetrics (metricInstances, { chartInfo }) { + const selectedMetrics = chartInfo[chartInfoKey] || [] + return metricInstances.filter(mi => selectedMetrics.includes(mi.metric)) + } +} + +export function onlyLatestValues () { + function extractLatest(acc, elem) { + return (acc.ts.getTime() > elem.ts.getTime()) ? acc : elem + } + + return function _onlyLatestValues (metricInstances) { + return metricInstances.map(mi => ({ + ...mi, + data: [ mi.data.reduce(extractLatest, mi.data[0]) ], + })) + } +} + +/* + * Filter out data points that are above the included metric + * + * Also filter out an entire series if there are no data points that meet it + * + * @return {function} a transform function + */ +export function filterAboveMaxInstanceValue () { + return function _filterAboveMaxInstanceValue (metricInstances, { chartInfo }) { + return chartInfo.maxInstanceValue + ? metricInstances.filter(mi => (mi.instance <= chartInfo.maxInstanceValue)) + : metricInstances + } +} diff --git a/src/app/processors/transforms.spec.js b/src/app/processors/transforms.spec.js new file mode 100644 index 000000000..d3491b0f2 --- /dev/null +++ b/src/app/processors/transforms.spec.js @@ -0,0 +1,232 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as transforms from './transforms' +import { expect } from 'chai' + +describe('filterForContainerId', () => { + let data = [ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ] + describe('with a different metric id', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a matching metric id and invalid container id', () => { + it('returns only other metric values', () => { + let filtered = transforms.filterForContainerId([ 'containercpu' ])(data, { containerId: 'zzz' }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a matching metric id', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containercpu' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(3) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a list including all metrics and empty filter', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk', 'containercpu', 'containerram' ])(data, { containerId: '' }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a list including all metrics', () => { + it('returns filtered values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk', 'containercpu', 'containerram' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + ]) + }) + }) +}) + +describe('filterKeepSelectedMetrics', () => { + let data = [ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ] + + describe('with empty selected metrics', () => { + it('returns no values', () => { + let chartInfo = { selectedMetrics: [ ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(0) + }) + }) + + describe('with all metrics', () => { + it('returns all values', () => { + let chartInfo = { selectedMetrics: [ 'containercpu', 'containerram' ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + + describe('with one selected metrics', () => { + it('returns selected values', () => { + let chartInfo = { selectedMetrics: [ 'containercpu' ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) +}) + +describe('onlyLatestValues', () => { + describe('with all equivalent values', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 5 }, { ts: new Date(1236), value: 7 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 }, { ts: new Date(1235), value: 6 }, { ts: new Date(1236), value: 8 } ] }, + ] + it('returns only latest', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1236), value: 7 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1236), value: 8 } ] }, + ]) + }) + }) + + describe('with mixed values', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 5 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ] + it('returns latest for each', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1235), value: 5 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ]) + }) + }) + + describe('with one value', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ] + it('returns input', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ]) + }) + }) +}) + +describe('filterAboveMaxInstanceValue', () => { + let data = [ + { metric: 'containercpu', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 2, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 3, data: [ { ts: new Date(1234), value: 3 } ] }, + ] + + describe('with no value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: {} }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a 0 value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 0 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a middle value set (1)', () => { + it('returns values for 1 and below', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 1 } }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 1, data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + + describe('with a value on the upper edge', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 4 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a super high value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 9999999 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) +}) diff --git a/src/app/processors/utils.js b/src/app/processors/utils.js new file mode 100644 index 000000000..9d8a4073b --- /dev/null +++ b/src/app/processors/utils.js @@ -0,0 +1,156 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + flatten, + keyValueArrayToObjectReducer, +} from '../utils' + +/** + * Given an array of { ts, value } tuples, combine them so that there is only + * one ts value, using combine function + */ +function combineValuesAtTimestampReducer(combiner) { + return (acc, dp) => { + const existingIndex = acc.findIndex(e => e.ts.getTime() === dp.ts.getTime()) + // not found in array + if (existingIndex === -1) { + return acc.concat(dp) + } + + // found in array, clone the array but replace the element + const newArray = acc.slice() + newArray[existingIndex] = { + ts: acc[existingIndex].ts, + value: combiner(acc[existingIndex].value, dp.value), + } + return newArray + } +} + +/** + * Given an array of [ { title, keylabel, data: { ts, value } } ], + * and having duplicated title lines, combine each of the datapoints, + * applying combiner to the data values such that there will only be unique 'title' lines + */ +function combineValuesByTitleReducer(combiner) { + return (acc, ds) => { + const existingIndex = acc.findIndex(e => e.title === ds.title) + // not found + if (existingIndex === -1) { + return acc.concat(ds) + } + + // found in array, clone array but replace dataset + const newArray = acc.slice() + const newData = [].concat(acc[existingIndex].data, ds.data) + .reduce(combineValuesAtTimestampReducer(combiner), []) + + newArray[existingIndex] = { + ...acc[existingIndex], + data: newData + } + return newArray + } +} + +function getAllMetricInstancesAtTs(metricInstances, ts) { + return metricInstances + .map(({ metric, instance, data }) => { + const tsv = data.find(tsv => tsv.ts.getTime() === ts.getTime()) + return { + metric: metric, + instance: instance, + value: tsv && tsv.value, + } + }) + .filter(({ value }) => value !== null && typeof value !== 'undefined') +} + +/** + * Note: this only keeps timestamps which are present in the first index + */ +function transposeToTimeslices(metricInstances) { + if (!metricInstances || metricInstances.length === 0) return metricInstances + + const timestamps = metricInstances[0].data.map(tsv => tsv.ts) + return timestamps.map(ts => { + const values = getAllMetricInstancesAtTs(metricInstances, ts) + // transform to a hierarchy of associative objects rather than an array of tuples + const transformed = values.reduce((acc, { metric, instance, value }) => { + acc[metric] = acc[metric] || {} + acc[metric][instance] = value + return acc + }, {}) + return { ts, values: transformed } + }) +} + +function applyFunctionsToTimeslices(timeslices, fns) { + return timeslices.map(({ ts, values }) => { + return { + ts, + values: Object.keys(fns) + // apply the function to all the values + .map(fname => { + let valuesOut + try { + valuesOut = fns[fname](values) + } catch (err) { + console.warn('could not apply fn', err.message) + } + return { key: fname, value: valuesOut } + }) + .reduce(keyValueArrayToObjectReducer, {}) + } + }) +} + +function getMetricInstancesFromTimeslice(slice) { + return Object.keys(slice.values).map(metric => { + if (!slice.values[metric]) return [] + const instancesForThisMetric = Object.keys(slice.values[metric]) + return instancesForThisMetric.map(instance => ({ metric, instance })) + }).reduce(flatten, []) +} + + +function untransposeTimeslices(timeslices) { + if (!timeslices.length) return timeslices + + const metricInstances = timeslices + .map(t => getMetricInstancesFromTimeslice(t)) + .reduce(flatten) + .filter((val, index, arr) => arr.findIndex(e => e.metric === val.metric && e.instance === val.instance) === index) + + const untransposed = metricInstances.map(({ metric, instance}) => ({ + metric, + instance, + data: timeslices.map(({ ts, values }) => ({ ts, value: values && values[metric] && values[metric][instance] })).filter(tsv => !!tsv.value) + })) + return untransposed +} + +export { + combineValuesAtTimestampReducer, + combineValuesByTitleReducer, + getAllMetricInstancesAtTs, + transposeToTimeslices, + untransposeTimeslices, + applyFunctionsToTimeslices, +} diff --git a/src/app/processors/utils.spec.js b/src/app/processors/utils.spec.js new file mode 100644 index 000000000..fcb3395e7 --- /dev/null +++ b/src/app/processors/utils.spec.js @@ -0,0 +1,349 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './utils' +import { expect } from 'chai' + +describe('combineValuesAtTimestampReducer', () => { + describe('with a sum combiner', () => { + const sum = (a, b) => (a + b) + describe('with no timestamps', () => { + const data = [] + it('produces an empty array', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(0) + }) + }) + + describe('with no matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(4567), value: 3 }, + ] + it('produces a concat result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 1 }, + { ts: new Date(4567), value: 3 }, + ]) + }) + }) + + describe('with two matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + ] + it('produces a single output with combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 4 }, + ]) + }) + }) + + describe('with four matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + { ts: new Date(1234), value: 5 }, + { ts: new Date(1234), value: 9 }, + ] + it('produces a single output with combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 18 }, + ]) + }) + }) + + describe('with two timestamps and four values each', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + { ts: new Date(1234), value: 5 }, + { ts: new Date(1234), value: 9 }, + { ts: new Date(5678), value: 101 }, + { ts: new Date(5678), value: 103 }, + { ts: new Date(5678), value: 105 }, + { ts: new Date(5678), value: 109 }, + ] + it('produces two timestamps with correct combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 18 }, + { ts: new Date(5678), value: 418 }, + ]) + }) + }) + }) +}) + +describe('combineValuesByTitleReducer', () => { + describe('with a sum combiner', () => { + const sum = (a, b) => (a + b) + describe('with empty input', () => { + const data = [] + it('returns an empty array', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(0) + }) + }) + describe('with no overlap at same time', () => { + const data = [ + { metric: 'cpu', instance: 'cpu0', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { metric: 'iops', instance: 0, title: 'disk', keylabel: 'disk', data: [ { ts: new Date(1234), value: 1 } ] }, + ] + it('returns unique titles', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { metric: 'cpu', instance: 'cpu0', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { metric: 'iops', instance: 0, title: 'disk', keylabel: 'disk', data: [ { ts: new Date(1234), value: 1 } ] }, + ]) + }) + }) + + describe('with no overlap at different time', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + ] + it('returns unique titles', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + ]) + }) + }) + + describe('with overlap at different time', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(5678), value: 7 } ] }, + ] + it('returns a single timeline', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 7 } ] }, + ]) + }) + }) + + describe('with a single title and multiple lines', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 5 } ] }, + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(5678), value: 50 } ] }, + ] + it('combines to a single title', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 11 }, { ts: new Date(5678), value: 55 } ] }, + ]) + }) + }) + + describe('with a mix of titles with multiple lines', () => { + const data = [ + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 5 } ] }, + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(5678), value: 50 } ] }, + { metric: 'iops', title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(1234), value: 5 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(5678), value: 7 } ] }, + ] + it('combines to the correct mix', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(3) + expect(result).to.have.deep.members([ + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 11 }, { ts: new Date(5678), value: 55 } ] }, + { metric: 'iops', title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(1234), value: 5 }, { ts: new Date(5678), value: 7 } ] }, + ]) + }) + }) + }) +}) + +describe('getAllMetricInstancesAtTs', () => { + describe('with a single instance', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0.5 }, { ts: new Date(1235), value: 0.6 }, { ts: new Date(1236), value: 0.5 } ] }, + ] + it('fetches nothing for missing values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1233))).to.deep.equal([ ]) + }) + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1235))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.6 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1236))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + ]) + }) + }) + describe('with multiple instances', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0.5 }, { ts: new Date(1235), value: 0.6 }, { ts: new Date(1236), value: 0.5 } ] }, + { metric: 'network', instance: 'eth0', data: [ { ts: new Date(1234), value: 100 }, { ts: new Date(1235), value: 105 }, { ts: new Date(1236), value: 110 } ] } + ] + it('fetches nothing for missing values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1233))).to.deep.equal([ ]) + }) + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + { metric: 'network', instance: 'eth0', value: 100 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1235))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.6 }, + { metric: 'network', instance: 'eth0', value: 105 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1236))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + { metric: 'network', instance: 'eth0', value: 110 }, + ]) + }) + }) + describe('with a zero value', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0 } ] } + ] + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0 }, + ]) + }) + }) +}) + +describe('transposeToTimeslices', () => { + describe('with multiple instances', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ] + it('transposes', () => { + let transposed = utils.transposeToTimeslices(data) + expect(transposed.length).to.equal(3) + expect(transposed).to.have.deep.members([ + { ts: new Date(1234), values: { 'mem.free': { '-1': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '-1': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '-1': 30 }, 'mem.used': { '-1': 70 } } }, + ]) + }) + }) + describe('with instance tags of 0', () => { + let data = [ + { metric: 'mem.free', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ] + it('transposes', () => { + let transposed = utils.transposeToTimeslices(data) + expect(transposed.length).to.equal(3) + expect(transposed).to.have.deep.members([ + { ts: new Date(1234), values: { 'mem.free': { '0': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30 }, 'mem.used': { '-1': 70 } } }, + ]) + }) + }) +}) + +describe('applyFunctionsToTimeslices', () => { + let functions = { + 'sum': slice => ({ '-1': slice['mem.free']['0'] + slice['mem.used']['-1'] }), + 'min': slice => ({ '-1': Math.min(slice['mem.free']['0'], slice['mem.used']['-1']) }), + } + let timeslices = [ + { ts: new Date(1234), values: { 'mem.free': { '0': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30 }, 'mem.used': { '-1': 70 } } }, + ] + it('applies the functions', () => { + let applied = utils.applyFunctionsToTimeslices(timeslices, functions) + expect(applied.length).to.equal(3) + expect(applied).to.have.deep.members([ + { ts: new Date(1234), values: { 'sum': { '-1': 100 }, 'min': { '-1': 10 } } }, + { ts: new Date(1235), values: { 'sum': { '-1': 100 }, 'min': { '-1': 15 } } }, + { ts: new Date(1236), values: { 'sum': { '-1': 100 }, 'min': { '-1': 30 } } }, + ]) + }) +}) + +describe('untransposeTimeslices', () => { + describe('with multiple instances', () => { + let data = [ + { ts: new Date(1234), values: { 'mem.free': { '-1': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '-1': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '-1': 30 }, 'mem.used': { '-1': 70 } } }, + ] + it('untransposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(2) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '-1', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) + + describe('with instance tags of 0', () => { + let data = [ + { ts: new Date(1234), values: { 'mem.free': { '0': 10, 'foo': 3 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15, 'foo': 4 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30, 'foo': 5 }, 'mem.used': { '-1': 70 } } }, + ] + it('transposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(3) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '0', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.free', instance: 'foo', data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 4 }, { ts: new Date(1236), value: 5 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) + + describe('with an empty first timeslice', () => { + let data = [ + { ts: new Date(1234), values: { } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15, 'foo': 4 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30, 'foo': 5 }, 'mem.used': { '-1': 70 } } }, + ] + it('transposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(3) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '0', data: [ { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.free', instance: 'foo', data: [ { ts: new Date(1235), value: 4 }, { ts: new Date(1236), value: 5 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) +}) diff --git a/src/app/reboot.min.css b/src/app/reboot.min.css deleted file mode 100644 index bc185e95c..000000000 --- a/src/app/reboot.min.css +++ /dev/null @@ -1,2 +0,0 @@ -body{font-family:'Source Sans Pro',sans-serif;font-size:14px;background-color:#f8f8f8;margin:0}main{padding:30px;margin:0}details,main,summary{display:block}audio,canvas,progress,video{vertical-align:baseline}a{color:#478cc8;text-decoration:none;background:0 0}a:hover{text-decoration:underline}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}img{border:0}hr{box-sizing:content-box;height:0;border-width:0 0 1px;border-color:#c4c4c4}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:14px}ol,ul{list-style:none}b,strong{font-weight:600}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:600;margin:0 0 10px}.h1,h1{font-size:32px}.h2,h2{font-size:28px}.h3,h3{font-size:22px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.nf-light{font-weight:300}.nf-normal{font-weight:400}.nf-bold{font-weight:600}.txt-right{text-align:right}.txt-left{text-align:left}.txt-center,.txt-centre{text-align:center}.nf-button,button{margin:5px;font-family:inherit;font-size:100%;padding:.5em 1em;color:#333;background-color:#fff;border:1px solid #c4c4c4;text-decoration:none;text-transform:none;border-radius:4px;overflow:visible;display:inline-block;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}button::-moz-focus-inner{padding:0;border:0}.nf-btn-hover,.nf-button:focus,.nf-button:hover,.nf-group input[type=checkbox]:checked+label,.nf-group input[type=radio]:checked+label,button:focus,button:hover,grouped input[type=checkbox]:checked+label,grouped input[type=radio]:checked+label,grouped label:focus,grouped label:hover,nf-group label:focus,nf-group label:hover{background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.nf-button-active,.nf-button:active,.nf-group input[type=checkbox]:checked+label,.nf-group input[type=radio]:checked+label,button:active,grouped input[type=checkbox]:checked+label,grouped input[type=radio]:checked+label,grouped label:active,nf-group label:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.nf-button:focus,button:focus{outline:0}.is-disabled,.is-disabled:active,.is-disabled:focus,.is-disabled:hover,.nf-button[disabled],button[disabled]{background-image:none;opacity:.4;cursor:default;box-shadow:none;pointer-events:none}.btn-error,.btn-primary,.btn-success{color:#fff!important;border:1px solid rgba(0,0,0,.2)!important;text-shadow:0 1px 1px rgba(0,0,0,.2)!important}.btn-error nf-icon,.btn-primary nf-icon,.btn-success nf-icon{color:#fff!important}.btn-primary{background-color:#478cc8!important}.btn-success{background:#8dac71!important}.btn-classic{background-color:#e6e6e6!important}.btn-error{background:#b6272b!important}.nf-group,grouped{display:inline-block;margin:5px;vertical-align:middle}.nf-group label,grouped label{font-family:inherit;font-size:100%;padding:.5em 1em;color:#333;background-color:transparent;border:1px solid #c4c4c4;text-decoration:none;display:inline-block;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nf-group .nf-buton,.nf-group button,.nf-group label,grouped .nf-buton,grouped button,grouped label{border-radius:0;margin:0;float:left;border-left-width:0}.nf-group .nf-buton:first-child,.nf-group button:first-child,.nf-group label:first-of-type,grouped .nf-buton:first-child,grouped button:first-child,grouped label:first-of-type{border-top-left-radius:4px;border-bottom-left-radius:4px;border-left-width:1px}.nf-group .nf-buton:last-child,.nf-group button:last-child,.nf-group label:last-child,grouped .nf-buton:last-child,grouped button:last-child,grouped label:last-of-type{border-top-right-radius:4px;border-bottom-right-radius:4px}.nf-group input[type=checkbox],.nf-group input[type=radio],grouped input[type=checkbox],grouped input[type=radio]{display:none}.nf-pill,pill{font-family:inherit;font-size:.8em;line-height:.8em;padding:.3em 1em;color:#333;background-color:transparent;border:1px solid #c4c4c4;border-radius:6px;text-transform:uppercase;cursor:default;display:inline-block;white-space:nowrap;vertical-align:baseline;text-align:center;-webkit-transform:translateY(-.15em);transform:translateY(-.15em)}.nf-pill.pill-ok,.nf-pill[ok],pill.pill-ok,pill[ok]{background:#8dac71;color:#fff}.nf-pill.pill-failed,.nf-pill[failed],pill.pill-failed,pill[failed]{background:#b6272b;color:#fff}.nf-pill.pill-marginal,.nf-pill[marginal],pill.pill-marginal,pill[marginal]{background:#d2bc5e;color:#fff}.nf-pill.pill-primary,.nf-pill[primary],pill.pill-primary,pill[primary]{background-color:#478cc8;color:#fff}.nf-badge,badge{background:#fff;color:#333}.nf-badge.badge-ok,.nf-badge[ok],badge.badge-ok,badge[ok]{background:#8dac71;color:#fff}.nf-badge.badge-marginal,.nf-badge[marginal],badge.badge-marginal,badge[marginal]{background:#d2bc5e;color:#fff}.nf-badge.badge-failed,.nf-badge[failed],badge.badge-failed,badge[failed]{background:#b6272b;color:#fff}.nf-badge,badge{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;flex-wrap:wrap;text-align:center;vertical-align:middle;width:120px;height:120px;border:1px solid #c4c4c4;border-radius:6px;word-break:break-all;cursor:default;overflow:hidden}input:not([type]),input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{margin:7px;vertical-align:top;padding:.5em .6em;display:inline-block;border:1px solid #d9d9d9;border-radius:4px;box-sizing:border-box;color:#6a6a6a;font:inherit}input.is-focused,input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select.is-focused,select:focus,textarea.is-focused,textarea:focus{outline:0;border-color:#129fea}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:#129fea auto 1px}input[type=checkbox],input[type=radio]{margin:.5em 0;padding:0;display:inline-block;box-sizing:border-box}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],select[disabled],textarea[disabled]{cursor:default;background-color:#eaeded;color:#cad2d3}input[readonly],select[readonly],textarea[readonly]{background:#eee;color:#777;border-color:#d9d9d9}input:focus:invalid,input:not([type]).is-invalid,input[type=color].is-invalid,input[type=date].is-invalid,input[type=datetime-local].is-invalid,input[type=datetime].is-invalid,input[type=email].is-invalid,input[type=month].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,input[type=search].is-invalid,input[type=tel].is-invalid,input[type=text].is-invalid,input[type=time].is-invalid,input[type=url].is-invalid,input[type=week].is-invalid,select.is-invalid,select:focus:invalid,textarea.is-invalid,textarea:focus:invalid{color:#b94a48;border-color:#e9322d}input[type=checkbox].is-invalid,input[type=checkbox]:focus:invalid:focus,input[type=file].is-invalid,input[type=file]:focus:invalid:focus,input[type=radio].is-invalid,input[type=radio]:focus:invalid:focus{outline-color:#e9322d}input::-webkit-input-placeholder{color:#c4c4c4;font-weight:300}input::-moz-placeholder{color:#c4c4c4;font-weight:300}input:-ms-input-placeholder{color:#c4c4c4;font-weight:300}input::placeholder{color:#c4c4c4;font-weight:300}textarea::-webkit-input-placeholder{color:#c4c4c4;font-weight:300}textarea::-moz-placeholder{color:#c4c4c4;font-weight:300}textarea:-ms-input-placeholder{color:#c4c4c4;font-weight:300}textarea::placeholder{color:#c4c4c4;font-weight:300}input{line-height:normal}input::-moz-focus-inner{border:0;padding:0}html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}select{text-transform:none;border:1px solid #d9d9d9;background-color:#fff}textarea{overflow:auto}select[multiple]{height:auto}label{margin:.5em;padding-top:2px}fieldset{margin:0;padding:.35em 0 .75em;border:0}legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:none}td,th{border-bottom:1px solid #ccc;border-width:0 0 1px;font-size:inherit;margin:0;overflow:hidden;padding:.8em 1em}th{font-weight:600}td{word-break:break-all}td:first-child,th:first-child{border-left-width:0}tr:last-child td{border-bottom:none}thead{background:0 0;color:#333;font-weight:600;text-align:left;vertical-align:bottom}td{background-color:transparent}.is-odd td,.is-striped tr:nth-child(odd) td{background-color:#f1f1f1}dt{font-weight:700;text-align:right;box-sizing:border-box;width:25%;margin-right:10px;float:left;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}dd{margin-left:calc(25% + 10px)}dd,dt{margin-bottom:10px}nav ul,ul.is-subnav{list-style:none;padding:0;margin:0;font-weight:300}nav li a,ul.is-subnav a{display:block;height:100%;padding:0 20px}nav li a,nav ul a:hover,ul.is-subnav a,ul.is-subnav a:hover{text-decoration:none}nav li,ul.is-subnav li{position:relative;float:left;font-size:17px;text-align:center;line-height:50px;box-sizing:border-box;height:100%;transition:background-color .2s ease;padding:0;cursor:pointer}nav{height:50px;background-color:#5b5b5b}nav ul{display:block;height:100%}nav li{color:#fff}nav li.is-selected::after{content:'';position:absolute;top:0;left:0;right:0;height:4px;background-color:#fff}nav li a{color:#fff}nav .logo{text-transform:uppercase;font-size:23px;letter-spacing:1px;padding:0 20px;margin-left:5px;cursor:default}nav .logo img{width:35px;height:35px;position:relative;top:9px;margin-right:-5px}nav li:hover:not(.logo){background-color:#a6a6a6}ul.is-subnav{display:inline-block;height:50px;color:#477fc5;vertical-align:bottom}ul.is-subnav li{font-size:14px;font-weight:500}ul.is-subnav li.is-selected::after{content:'';position:absolute;bottom:0;left:0;right:0;height:4px;background-color:#477fc5}ul.is-subnav a,ul.is-subnav li{text-transform:uppercase}.nf-header,main>header{border-bottom:1px solid #c4c4c4;text-align:left;margin-bottom:30px}.nf-header h1,main>header h1{margin-right:20px;display:inline-block}.nf-panel,panel{display:block;background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;padding:20px}.nf-panel header,panel header{background-color:#f1f1f1;padding:10px 20px;border-bottom:1px solid #d9d9d9;margin:-20px -20px 20px}.nf-panel header h1,.nf-panel header h2,.nf-panel header h3,.nf-panel header h4,.nf-panel header h5,.nf-panel header h6,panel header h1,panel header h2,panel header h3,panel header h4,panel header h5,panel header h6{margin-bottom:0}.nf-panel footer,panel footer{background-color:#f1f1f1;padding:10px 20px;border-top:1px solid #d9d9d9;margin:20px -20px -20px}.nf-panel table,panel table{border-top:1px solid #ccc;width:calc(100% + 40px);margin-left:-20px;margin-bottom:-20px;margin-top:30px}.nf-panel table[is=nf-table] table,panel table[is=nf-table] table{margin-left:0;margin-top:0;margin-bottom:0}.nf-grid{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.nf-1,.nf-10,.nf-11,.nf-12,.nf-13,.nf-14,.nf-15,.nf-16,.nf-2,.nf-3,.nf-4,.nf-5,.nf-6,.nf-7,.nf-8,.nf-9{display:inline-block;box-sizing:border-box}.nf-1{width:6.25%}.nf-2{width:12.5%}.nf-3{width:18.75%}.nf-4{width:25%}.nf-5{width:31.25%}.nf-6{width:37.5%}.nf-7{width:43.75%}.nf-8{width:50%}.nf-9{width:56.25%}.nf-10{width:62.5%}.nf-11{width:68.75%}.nf-12{width:75%}.nf-13{width:81.25%}.nf-14{width:87.5%}.nf-15{width:93.75%}.nf-16{width:100%}.nf-grid-centered{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.nf-grid-centered>*{display:-webkit-flex;display:flex}.nf-grid-centered>*>*{text-align:center;margin:auto}.nf-right{float:right}.nf-left{float:left}.nf-inline{display:inline}.nf-clickable{cursor:pointer}.clearfix:after{content:"";display:table;clear:both}.is-hidden,.isHidden,[hidden]{display:none!important} -/*# sourceMappingURL=reboot.min.css.map */ \ No newline at end of file diff --git a/src/app/reboot.min.css.map b/src/app/reboot.min.css.map deleted file mode 100644 index 5cbf1dcb4..000000000 --- a/src/app/reboot.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["style.css"],"names":[],"mappings":"AAAA;gCACA;AACA;EACA,4CAAA;EACA,iBAAA;EACA,2BAAA;EACA,WAAA;EACA;AACA;EACA,eAAA;EACA,WAAA;EACA;AACA;;;EAGA,gBAAA;EACA;AACA;;;;EAIA,0BAAA;EACA;AACA;EACA,gBAAA;EACA,uBAAA;EACA,yBAAA;EACA;AACA;EACA,4BAAA;EACA;AACA;;EAEA,YAAA;EACA;AACA;EACA,2BAAA;EACA;AACA;EACA,WAAA;EACA;AACA;EACA,yBAAA;EACA,WAAA;EACA,yBAAA;EACA,uBAAA;EACA;AACA;EACA,gBAAA;EACA;AACA;;;;EAIA,mCAAA;EACA,iBAAA;EACA;AACA;;EAEA,kBAAA;EACA;AACA;gCACA;AACA;;EAEA,kBAAA;EACA;AACA;EACA,gBAAA;EACA;AACA;;EAEA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;EACA;AACA;EACA,aAAA;EACA;AACA;EACA,iBAAA;EACA;AACA;gCACA;AACA;;;;;;;;;;;;EAYA,kBAAA;EACA,oBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;;EAEA,iBAAA;EACA;AACA;gCACA;AACA;EACA,kBAAA;EACA;AACA;EACA,kBAAA;EACA;AACA;EACA,kBAAA;EACA;AACA;gCACA;AACA;EACA,mBAAA;EACA;AACA;EACA,kBAAA;EACA;AACA;;EAEA,oBAAA;EACA;AACA;gCACA;AACA;;EAEA,aAAA;EACA,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,aAAA;EACA,wBAAA;EACA,2BAAA;EACA,uBAAA;EACA,sBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,qBAAA;EACA,qBAAA;EACA,0BAAA;EACA,oBAAA;EACA,iBAAA;EACA,yBAAA;EACA,2BAAA;EACA,wBAAA;EACA,uBAAA;EACA,mBAAA;EACA;AACA;EACA,YAAA;EACA,WAAA;EACA;AACA;;;;;;;;;;;;;EAeA,uFAAA;EACA;AACA;;;;;;;;;EASA,6EAAA;EACA;AACA;;EAEA,YAAA;EACA;AACA;;;;;;EAMA,wBAAA;EACA,cAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA;AACA;;;EAGA,wBAAA;EACA,8CAAA;EACA,mDAAA;EACA;AACA;;;EAGA,wBAAA;EACA;AACA;EACA,sCAAA;EACA;AACA;EACA,gCAAA;EACA;AACA;EACA,sCAAA;EACA;AACA;EACA,gCAAA;EACA;AACA;gCACA;AACA;;EAEA,uBAAA;EACA,aAAA;EACA,wBAAA;EACA;AACA;;EAEA,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,aAAA;EACA,+BAAA;EACA,2BAAA;EACA,uBAAA;EACA,uBAAA;EACA,qBAAA;EACA,qBAAA;EACA,0BAAA;EACA,oBAAA;EACA,iBAAA;EACA,yBAAA;EACA,2BAAA;EACA,wBAAA;EACA,uBAAA;EACA,mBAAA;EACA;AACA;;;;;;EAMA,kBAAA;EACA,WAAA;EACA,aAAA;EACA,sBAAA;EACA;AACA;;;;;;EAMA,6BAAA;EACA,gCAAA;EACA,wBAAA;EACA;AACA;;;;;;EAMA,8BAAA;EACA,iCAAA;EACA;AACA;gCACA;AACA;;;;EAIA,eAAA;EACA;AACA;gCACA;AACA;;EAEA,sBAAA;EACA,kBAAA;EACA,oBAAA;EACA,oBAAA;EACA,aAAA;EACA,+BAAA;EACA,2BAAA;EACA,oBAAA;EACA,2BAAA;EACA,iBAAA;EACA,uBAAA;EACA,qBAAA;EACA,0BAAA;EACA,oBAAA;AACA,2DAAA;EACA,wCAAA;UAAA,gCAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,2BAAA;EACA,aAAA;EACA;AACA;gCACA;AACA;;EAEA,kBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;;;EAIA,qBAAA;EACA,aAAA;EACA;AACA;;EAEA,8BAAA;EAAA,sBAAA;EACA,6BAAA;UAAA,qBAAA;EACA,iCAAA;UAAA,yBAAA;EACA,gCAAA;UAAA,wBAAA;EACA,yBAAA;UAAA,iBAAA;EACA,oBAAA;EACA,wBAAA;EACA;AACA;;EAEA,cAAA;EACA,eAAA;EACA,2BAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA;AACA;gCACA;AACA;;;;;;;;;;;;;;;;;EAiBA,aAAA;EACA,qBAAA;EACA,sBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EAGA,wBAAA;EACA,gBAAA;EACA,eAAA;EACA;AACA;;;;;;;;;;;;;;;;;;;;EAoBA,YAAA;EACA,uBAAA;EACA;AACA;;;EAGA,2BAAA;EACA;AACA;;EAEA,iBAAA;EACA,YAAA;EACA,uBAAA;EACA,wBAAA;EACA;AACA;;;;;;;;;;;;;;;;;EAiBA,iBAAA;EACA,2BAAA;EACA,gBAAA;EACA;AACA;;;EAGA,kBAAA;EACA,aAAA;EACA,uBAAA;EACA;AACA;;;;;;;;;;;;;;;;;;;;EAoBA,gBAAA;EACA,uBAAA;EACA;AACA;;;;;;EAMA,wBAAA;EACA;AACA;gCACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;EACA,gBAAA;EACA,kBAAA;EACA;AACA;gCACA;AACA;EACA,qBAAA;EACA;AACA;EACA,WAAA;EACA,YAAA;EACA;AACA;;;EAGA,4BAAA;EACA,iBAAA;EACA;AACA;;EAEA,cAAA;EACA;AACA;EACA,+BAAA;EACA,yBAAA;EACA;AACA;;EAEA,0BAAA;EACA;AACA;EACA,sBAAA;EACA,2BAAA;EACA,wBAAA;EACA;AACA;EACA,gBAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,eAAA;EACA,kBAAA;EACA;AACA;EACA,WAAA;EACA,0BAAA;EACA,WAAA;EACA;AACA;EACA,gBAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,aAAA;EACA,kCAAA;EACA;AACA;EACA,mBAAA;EACA;AACA;gCACA;AACA;EACA,2BAAA;EACA,mBAAA;EACA,mBAAA;EACA,cAAA;EACA;AACA;;EAEA,+BAAA;EACA,yBAAA;EACA,oBAAA;EACA,WAAA;EACA,kBAAA;EACA,oBAAA;EACA;AACA;EACA,kBAAA;EACA;AACA;EACA,uBAAA;EACA;AACA;;EAEA,sBAAA;EACA;AACA;EACA,qBAAA;EACA;AACA;EACA,yBAAA;EACA,aAAA;EACA,kBAAA;EACA,kBAAA;EACA,wBAAA;EACA;AACA;EACA,+BAAA;EACA;AACA;EACA,2BAAA;EACA;AACA;EACA,2BAAA;EACA;AACA;gCACA;AACA;EACA,mBAAA;EACA,mBAAA;EACA,wBAAA;EACA,YAAA;EACA,oBAAA;EACA,aAAA;EACA,aAAA;EACA,kBAAA;EACA,yBAAA;EACA,qBAAA;EACA;AACA;EACA,+BAAA;EACA;AACA;;EAEA,qBAAA;EACA;AACA;gCACA;AACA;;EAEA,kBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA;AACA;;EAEA,gBAAA;EACA,cAAA;EACA,iBAAA;EACA;AACA;;;;EAIA,uBAAA;EACA;AACA;;EAEA,oBAAA;EACA,aAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,wBAAA;EACA,cAAA;EAGA,wCAAA;EACA;AACA;;EAEA,YAAA;EACA,iBAAA;EACA;AACA;gCACA;AACA;EACA,cAAA;EACA,2BAAA;EACA;AACA;EACA,gBAAA;EACA,cAAA;EACA;AACA;EACA,aAAA;EACA;AACA;EACA,aAAA;EACA,oBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,aAAA;EACA,wBAAA;EACA;AACA;EACA,aAAA;EACA;AACA;EACA,2BAAA;EACA,iBAAA;EACA,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA;AACA;EACA,aAAA;EACA,cAAA;EACA,oBAAA;EACA,UAAA;EACA,oBAAA;EACA;AACA;EACA,2BAAA;EACA;AACA;gCACA;AACA;EACA,uBAAA;EACA,cAAA;EACA,gBAAA;EACA,wBAAA;EACA;AACA;EACA,iBAAA;EACA,kBAAA;EACA;AACA;EACA,aAAA;EACA,oBAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA;EACA,aAAA;EACA,2BAAA;EACA;AACA;;EAEA,2BAAA;EACA;AACA;gCACA;AACA;;EAEA,kCAAA;EACA,kBAAA;EACA,qBAAA;EACA;AACA;;EAEA,oBAAA;EACA,uBAAA;EACA;AACA;gCACA;AACA;;EAEA,gBAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EACA,eAAA;EACA;AACA;;EAEA,2BAAA;EACA,oBAAA;EACA,kCAAA;EACA,oBAAA;EACA,qBAAA;EACA,mBAAA;EACA,qBAAA;EACA;AACA;;;;;;;;;;;;EAYA,kBAAA;EACA;AACA;;EAEA,2BAAA;EACA,oBAAA;EACA,+BAAA;EACA,oBAAA;EACA,qBAAA;EACA,kBAAA;EACA,sBAAA;EACA;AACA;;EAEA,4BAAA;EACA,0BAAA;EACA,oBAAA;EACA,sBAAA;EACA,kBAAA;EACA;AACA;;EAEA,gBAAA;EACA,eAAA;EACA,kBAAA;EACA;AACA;gCACA;AACA;EACA,uBAAA;EAAA,eAAA;EACA,6BAAA;UAAA,qBAAA;EACA,yBAAA;UAAA,iBAAA;EACA;AACA;;;;;;;;;;;;;;;;EAgBA,uBAAA;EACA,wBAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,YAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,YAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,YAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,cAAA;EACA;AACA;EACA,eAAA;EACA;AACA;EACA,aAAA;EACA;AACA;EACA,uBAAA;EAAA,eAAA;EACA,6BAAA;UAAA,qBAAA;EACA,yBAAA;UAAA,iBAAA;EACA;AACA;EACA,uBAAA;EAAA,eAAA;EACA;AACA;EACA,oBAAA;EACA,cAAA;EACA;AACA;gCACA;AACA;EACA,cAAA;EACA;AACA;EACA,aAAA;EACA;AACA;EACA,iBAAA;EACA;AACA;EACA,iBAAA;EACA;AACA;EACA,aAAA;EACA,gBAAA;EACA,aAAA;EACA;AACA;;;EAGA,0BAAA;EACA","file":"reboot.min.css","sourcesContent":["/* normalizing styles\n-----------------------------*/\nbody {\n font-family: 'Source Sans Pro', sans-serif;\n font-size: 14px;\n background-color: #f8f8f8;\n margin: 0;\n}\nmain {\n padding: 30px;\n margin: 0;\n}\nmain,\ndetails,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n vertical-align: baseline;\n}\na {\n color: #478cc8;\n text-decoration: none;\n background: transparent;\n}\na:hover {\n text-decoration: underline;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nimg {\n border: 0;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n border-width: 0 0 1px 0;\n border-color: #c4c4c4;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 14px;\n}\nul,\nol {\n list-style: none;\n}\n/* normalizing default styles\n-----------------------------*/\nb,\nstrong {\n font-weight: 600;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\n/* headers & font sizes\n-----------------------------*/\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-weight: 600;\n margin: 0 0 10px 0;\n}\nh1,\n.h1 {\n font-size: 32px;\n}\nh2,\n.h2 {\n font-size: 28px;\n}\nh3,\n.h3 {\n font-size: 22px;\n}\nh4,\n.h4 {\n font-size: 16px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\n/* font weights\n-----------------------------*/\n.nf-light {\n font-weight: 300;\n}\n.nf-normal {\n font-weight: 400;\n}\n.nf-bold {\n font-weight: 600;\n}\n/* text align options\n-----------------------------*/\n.txt-right {\n text-align: right;\n}\n.txt-left {\n text-align: left;\n}\n.txt-center,\n.txt-centre {\n text-align: center;\n}\n/* buttons\n-----------------------------*/\nbutton,\n.nf-button {\n margin: 5px;\n font-family: inherit;\n font-size: 100%;\n padding: 0.5em 1em;\n color: #333;\n background-color: #fff;\n border: 1px solid #c4c4c4;\n text-decoration: none;\n text-transform: none;\n border-radius: 4px;\n overflow: visible;\n display: inline-block;\n line-height: normal;\n white-space: nowrap;\n vertical-align: baseline;\n text-align: center;\n cursor: pointer;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\nbutton::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\n.nf-btn-hover,\n.nf-button:hover,\n.nf-button:focus,\nbutton:hover,\nbutton:focus,\ngrouped label:hover,\ngrouped label:focus,\nnf-group label:hover,\nnf-group label:focus,\ngrouped input[type=radio]:checked + label,\n.nf-group input[type=radio]:checked + label,\ngrouped input[type=checkbox]:checked + label,\n.nf-group input[type=checkbox]:checked + label {\n background-image: -webkit-linear-gradient(transparent, rgba(0,0,0,0.05) 40%, rgba(0,0,0,0.1));\n background-image: -moz-linear-gradient(top, rgba(0,0,0,0.05) 0%, rgba(0,0,0,0.1));\n background-image: linear-gradient(transparent, rgba(0,0,0,0.05) 40%, rgba(0,0,0,0.1));\n}\n.nf-button-active,\n.nf-button:active,\nbutton:active,\ngrouped label:active,\nnf-group label:active,\ngrouped input[type=radio]:checked + label,\n.nf-group input[type=radio]:checked + label,\ngrouped input[type=checkbox]:checked + label,\n.nf-group input[type=checkbox]:checked + label {\n box-shadow: 0 0 0 1px rgba(0,0,0,0.15) inset, 0 0 6px rgba(0,0,0,0.2) inset;\n}\n.nf-button:focus,\nbutton:focus {\n outline: 0;\n}\n.nf-button[disabled],\nbutton[disabled],\n.is-disabled,\n.is-disabled:hover,\n.is-disabled:focus,\n.is-disabled:active {\n background-image: none;\n opacity: 0.4;\n cursor: default;\n box-shadow: none;\n pointer-events: none;\n}\n.btn-primary,\n.btn-success,\n.btn-error {\n color: #fff !important;\n border: 1px solid rgba(0,0,0,0.2) !important;\n text-shadow: 0 1px 1px rgba(0,0,0,0.2) !important;\n}\n.btn-primary nf-icon,\n.btn-success nf-icon,\n.btn-error nf-icon {\n color: #fff !important;\n}\n.btn-primary {\n background-color: #478cc8 !important;\n}\n.btn-success {\n background: #8dac71 !important;\n}\n.btn-classic {\n background-color: #e6e6e6 !important;\n}\n.btn-error {\n background: #b6272b !important;\n}\n/* grouped buttons\n-----------------------------*/\ngrouped,\n.nf-group {\n display: inline-block;\n margin: 5px;\n vertical-align: middle;\n}\ngrouped label,\n.nf-group label {\n font-family: inherit;\n font-size: 100%;\n padding: 0.5em 1em;\n color: #333;\n background-color: transparent;\n border: 1px solid #c4c4c4;\n text-decoration: none;\n display: inline-block;\n line-height: normal;\n white-space: nowrap;\n vertical-align: baseline;\n text-align: center;\n cursor: pointer;\n -webkit-user-drag: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\ngrouped button,\ngrouped .nf-buton,\ngrouped label,\n.nf-group button,\n.nf-group .nf-buton,\n.nf-group label {\n border-radius: 0;\n margin: 0;\n float: left;\n border-left-width: 0;\n}\ngrouped button:first-child,\ngrouped .nf-buton:first-child,\ngrouped label:first-of-type,\n.nf-group button:first-child,\n.nf-group .nf-buton:first-child,\n.nf-group label:first-of-type {\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n border-left-width: 1px;\n}\ngrouped button:last-child,\ngrouped .nf-buton:last-child,\ngrouped label:last-of-type,\n.nf-group button:last-child,\n.nf-group .nf-buton:last-child,\n.nf-group label:last-child {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n/* radio/checkbox buttons\n-----------------------------*/\ngrouped input[type=radio],\n.nf-group input[type=radio],\ngrouped input[type=checkbox],\n.nf-group input[type=checkbox] {\n display: none;\n}\n/* pills\n-----------------------------*/\npill,\n.nf-pill {\n font-family: inherit;\n font-size: 0.8em;\n line-height: 0.8em;\n padding: 0.3em 1em;\n color: #333;\n background-color: transparent;\n border: 1px solid #c4c4c4;\n border-radius: 6px;\n text-transform: uppercase;\n cursor: default;\n display: inline-block;\n white-space: nowrap;\n vertical-align: baseline;\n text-align: center;\n/* this is probably a bad idea, but I'm just testing it */\n transform: translateY(-0.15em);\n}\npill[ok],\npill.pill-ok,\n.nf-pill.pill-ok,\n.nf-pill[ok] {\n background: #8dac71;\n color: #fff;\n}\npill[failed],\npill.pill-failed,\n.nf-pill.pill-failed,\n.nf-pill[failed] {\n background: #b6272b;\n color: #fff;\n}\npill[marginal],\npill.pill-marginal,\n.nf-pill.pill-marginal,\n.nf-pill[marginal] {\n background: #d2bc5e;\n color: #fff;\n}\npill[primary],\npill.pill-primary,\n.nf-pill.pill-primary,\n.nf-pill[primary] {\n background-color: #478cc8;\n color: #fff;\n}\n/* badges\n-----------------------------*/\nbadge,\n.nf-badge {\n background: #fff;\n color: #333;\n}\nbadge[ok],\nbadge.badge-ok,\n.nf-badge.badge-ok,\n.nf-badge[ok] {\n background: #8dac71;\n color: #fff;\n}\nbadge[marginal],\nbadge.badge-marginal,\n.nf-badge.badge-marginal,\n.nf-badge[marginal] {\n background: #d2bc5e;\n color: #fff;\n}\nbadge[failed],\nbadge.badge-failed,\n.nf-badge.badge-failed,\n.nf-badge[failed] {\n background: #b6272b;\n color: #fff;\n}\nbadge,\n.nf-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n flex-wrap: wrap;\n text-align: center;\n vertical-align: middle;\n}\nbadge,\n.nf-badge {\n width: 120px;\n height: 120px;\n border: 1px solid #c4c4c4;\n border-radius: 6px;\n word-break: break-all;\n cursor: default;\n overflow: hidden;\n}\n/* form\n-----------------------------*/\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\ninput:not([type]),\nselect,\ntextarea {\n margin: 7px;\n vertical-align: top;\n padding: 0.5em 0.6em;\n display: inline-block;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n color: #6a6a6a;\n font: inherit;\n}\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\ninput:not([type]):focus,\nselect:focus,\ntextarea:focus,\ninput.is-focused,\nselect.is-focused,\ntextarea.is-focused {\n outline: 0;\n border-color: #129fea;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 1px auto #129fea;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n margin: 0.5em 0;\n padding: 0;\n display: inline-block;\n box-sizing: border-box;\n}\ninput[type=\"text\"][disabled],\ninput[type=\"password\"][disabled],\ninput[type=\"email\"][disabled],\ninput[type=\"url\"][disabled],\ninput[type=\"date\"][disabled],\ninput[type=\"month\"][disabled],\ninput[type=\"time\"][disabled],\ninput[type=\"datetime\"][disabled],\ninput[type=\"datetime-local\"][disabled],\ninput[type=\"week\"][disabled],\ninput[type=\"number\"][disabled],\ninput[type=\"search\"][disabled],\ninput[type=\"tel\"][disabled],\ninput[type=\"color\"][disabled],\nselect[disabled],\ninput:not([type])[disabled],\ntextarea[disabled] {\n cursor: default;\n background-color: #eaeded;\n color: #cad2d3;\n}\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n background: #eee;\n color: #777;\n border-color: #d9d9d9;\n}\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid,\ninput[type=\"text\"].is-invalid,\ninput[type=\"password\"].is-invalid,\ninput[type=\"email\"].is-invalid,\ninput[type=\"url\"].is-invalid,\ninput[type=\"date\"].is-invalid,\ninput[type=\"month\"].is-invalid,\ninput[type=\"time\"].is-invalid,\ninput[type=\"datetime\"].is-invalid,\ninput[type=\"datetime-local\"].is-invalid,\ninput[type=\"week\"].is-invalid,\ninput[type=\"number\"].is-invalid,\ninput[type=\"search\"].is-invalid,\ninput[type=\"tel\"].is-invalid,\ninput[type=\"color\"].is-invalid,\nselect.is-invalid,\ninput:not([type]).is-invalid,\ntextarea.is-invalid {\n color: #b94a48;\n border-color: #e9322d;\n}\ninput[type=\"file\"]:focus:invalid:focus,\ninput[type=\"radio\"]:focus:invalid:focus,\ninput[type=\"checkbox\"]:focus:invalid:focus,\ninput[type=\"file\"].is-invalid,\ninput[type=\"radio\"].is-invalid,\ninput[type=\"checkbox\"].is-invalid {\n outline-color: #e9322d;\n}\n/* placeholder text\n-----------------------------*/\ninput::-webkit-input-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ninput::-moz-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ninput:-ms-input-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ninput::placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ntextarea::-webkit-input-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ntextarea::-moz-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ntextarea:-ms-input-placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\ntextarea::placeholder {\n color: #c4c4c4;\n font-weight: 300;\n}\n/* normalizing default styles\n-----------------------------*/\ninput {\n line-height: normal;\n}\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nselect {\n text-transform: none;\n border: 1px solid #d9d9d9;\n background-color: #fff;\n}\ntextarea {\n overflow: auto;\n}\nselect[multiple] {\n height: auto;\n}\nlabel {\n margin: 0.5em;\n padding-top: 2px;\n}\nfieldset {\n margin: 0;\n padding: 0.35em 0 0.75em;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0.3em 0;\n margin-bottom: 0.3em;\n color: #333;\n border-bottom: 1px solid #e5e5e5;\n}\noptgroup {\n font-weight: bold;\n}\n/* table\n-----------------------------*/\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n empty-cells: show;\n border: none;\n}\ntd,\nth {\n border-bottom: 1px solid #ccc;\n border-width: 0 0 1px 0;\n font-size: inherit;\n margin: 0;\n overflow: hidden;\n padding: 0.8em 1em;\n}\nth {\n font-weight: 600;\n}\ntd {\n word-break: break-all;\n}\ntd:first-child,\nth:first-child {\n border-left-width: 0;\n}\ntr:last-child td {\n border-bottom: none;\n}\nthead {\n background: transparent;\n color: #333;\n font-weight: 600;\n text-align: left;\n vertical-align: bottom;\n}\ntd {\n background-color: transparent;\n}\n.is-odd td {\n background-color: #f1f1f1;\n}\n.is-striped tr:nth-child(odd) td {\n background-color: #f1f1f1;\n}\n/* dd\n-----------------------------*/\ndt {\n font-weight: bold;\n text-align: right;\n box-sizing: border-box;\n width: 25%;\n margin-right: 10px;\n float: left;\n clear: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\ndd {\n margin-left: calc(25% + 10px);\n}\ndt,\ndd {\n margin-bottom: 10px;\n}\n/* tab generics\n-----------------------------*/\nnav ul,\nul.is-subnav {\n list-style: none;\n padding: 0;\n margin: 0;\n font-weight: 300;\n}\nnav li a,\nul.is-subnav a {\n display: block;\n height: 100%;\n padding: 0 20px;\n}\nnav li a,\nnav ul a:hover,\nul.is-subnav a,\nul.is-subnav a:hover {\n text-decoration: none;\n}\nnav li,\nul.is-subnav li {\n position: relative;\n float: left;\n font-size: 17px;\n text-align: center;\n line-height: 50px;\n box-sizing: border-box;\n height: 100%;\n -webkit-transition: background-color 0.2s ease;\n -moz-transition: background-color 0.2s ease;\n transition: background-color 0.2s ease;\n}\nnav li,\nul.is-subnav li {\n padding: 0;\n cursor: pointer;\n}\n/* nav bar\n-----------------------------*/\nnav {\n height: 50px;\n background-color: #5b5b5b;\n}\nnav ul {\n display: block;\n height: 100%;\n}\nnav li {\n color: #fff;\n}\nnav li.is-selected::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background-color: #fff;\n}\nnav li a {\n color: #fff;\n}\nnav .logo {\n text-transform: uppercase;\n font-size: 23px;\n letter-spacing: 1px;\n padding: 0 20px;\n margin-left: 5px;\n cursor: default;\n}\nnav .logo img {\n width: 35px;\n height: 35px;\n position: relative;\n top: 9px;\n margin-right: -5px;\n}\nnav li:hover:not(.logo) {\n background-color: #a6a6a6;\n}\n/* subnav\n-----------------------------*/\nul.is-subnav {\n display: inline-block;\n height: 50px;\n color: #477fc5;\n vertical-align: bottom;\n}\nul.is-subnav li {\n font-size: 14px;\n font-weight: 500;\n}\nul.is-subnav li.is-selected::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 4px;\n background-color: #477fc5;\n}\nul.is-subnav li,\nul.is-subnav a {\n text-transform: uppercase;\n}\n/* header\n-----------------------------*/\nmain > header,\n.nf-header {\n border-bottom: 1px solid #c4c4c4;\n text-align: left;\n margin-bottom: 30px;\n}\nmain > header h1,\n.nf-header h1 {\n margin-right: 20px;\n display: inline-block;\n}\n/* panel\n-----------------------------*/\npanel,\n.nf-panel {\n display: block;\n background-color: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 3px;\n padding: 20px;\n}\npanel header,\n.nf-panel header {\n background-color: #f1f1f1;\n padding: 10px 20px;\n border-bottom: 1px solid #d9d9d9;\n margin-left: -20px;\n margin-right: -20px;\n margin-top: -20px;\n margin-bottom: 20px;\n}\npanel header h1,\n.nf-panel header h1,\npanel header h2,\n.nf-panel header h2,\npanel header h3,\n.nf-panel header h3,\npanel header h4,\n.nf-panel header h4,\npanel header h5,\n.nf-panel header h5,\npanel header h6,\n.nf-panel header h6 {\n margin-bottom: 0;\n}\npanel footer,\n.nf-panel footer {\n background-color: #f1f1f1;\n padding: 10px 20px;\n border-top: 1px solid #d9d9d9;\n margin-left: -20px;\n margin-right: -20px;\n margin-top: 20px;\n margin-bottom: -20px;\n}\npanel table,\n.nf-panel table {\n border-top: 1px solid #ccc;\n width: calc(100% + 40px);\n margin-left: -20px;\n margin-bottom: -20px;\n margin-top: 30px;\n}\npanel table[is=\"nf-table\"] table,\n.nf-panel table[is=\"nf-table\"] table {\n margin-left: 0;\n margin-top: 0;\n margin-bottom: 0;\n}\n/* grids\n-----------------------------*/\n.nf-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n.nf-1,\n.nf-2,\n.nf-3,\n.nf-4,\n.nf-5,\n.nf-6,\n.nf-7,\n.nf-8,\n.nf-9,\n.nf-10,\n.nf-11,\n.nf-12,\n.nf-13,\n.nf-14,\n.nf-15,\n.nf-16 {\n display: inline-block;\n box-sizing: border-box;\n}\n.nf-1 {\n width: 6.25%;\n}\n.nf-2 {\n width: 12.5%;\n}\n.nf-3 {\n width: 18.75%;\n}\n.nf-4 {\n width: 25%;\n}\n.nf-5 {\n width: 31.25%;\n}\n.nf-6 {\n width: 37.5%;\n}\n.nf-7 {\n width: 43.75%;\n}\n.nf-8 {\n width: 50%;\n}\n.nf-9 {\n width: 56.25%;\n}\n.nf-10 {\n width: 62.5%;\n}\n.nf-11 {\n width: 68.75%;\n}\n.nf-12 {\n width: 75%;\n}\n.nf-13 {\n width: 81.25%;\n}\n.nf-14 {\n width: 87.5%;\n}\n.nf-15 {\n width: 93.75%;\n}\n.nf-16 {\n width: 100%;\n}\n.nf-grid-centered {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n.nf-grid-centered > * {\n display: flex;\n}\n.nf-grid-centered > * > * {\n text-align: center;\n margin: auto;\n}\n/* utilities\n-----------------------------*/\n.nf-right {\n float: right;\n}\n.nf-left {\n float: left;\n}\n.nf-inline {\n display: inline;\n}\n.nf-clickable {\n cursor: pointer;\n}\n.clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n.isHidden,\n.is-hidden,\n[hidden] {\n display: none !important;\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/src/app/services/containermetadata.service.js b/src/app/services/containermetadata.service.js deleted file mode 100644 index 881940a9a..000000000 --- a/src/app/services/containermetadata.service.js +++ /dev/null @@ -1,104 +0,0 @@ -/**! - */ - (function () { - 'use strict'; - - /** - * @name ContainerMetadataService - */ - function ContainerMetadataService($http, $rootScope, $q, containerConfig) { - - /** - * @name idDictionary - * @desc - */ - var idMap = {}; - function idDictionary(key, value){ - if (key.indexOf('docker/') !==-1){ - if (key === value){ - value = value.split('/')[2]; - } - key = key.split('/')[2]; - } - - if (value === undefined){ - return idMap[key]; - } else { - idMap[key] = value; - } - - } - - function clearIdDictionary(){ - idMap = {}; - } - - /** - * @name resolveId - * @desc - */ - function resolveId(instanceKey) { - if (containerConfig.externalAPI){ - //make external api call here to resolve container id - //need to set containerConfig.externalAPI to true in app.config.js - } else { - idDictionary(instanceKey,instanceKey); - } - - } - - /** - * @name setGlobalFilter - * @desc - */ - var globalFilter = ''; - function setGlobalFilter(word){ - globalFilter = word; - } - - /** - * @name getGlobalFilter - * @desc - */ - function getGlobalFilter(){ - return globalFilter; - } - - /** - * @name setCurrentTime - * @desc - */ - var currentTime = 0; - function setCurrentTime(time){ - if (time > currentTime){ - currentTime = time; - } - } - - /** - * @name isTimeCurrent - * @desc - */ - function isTimeCurrent(time){ - var difference = currentTime - time; - return difference < 6000; - } - - ////////// - - return { - idDictionary: idDictionary, - clearIdDictionary: clearIdDictionary, - resolveId: resolveId, - setGlobalFilter: setGlobalFilter, - getGlobalFilter: getGlobalFilter, - setCurrentTime: setCurrentTime, - isTimeCurrent: isTimeCurrent - }; - } - - angular - .module('app.services') - .factory('ContainerMetadataService', ContainerMetadataService); - - })(); diff --git a/src/app/services/d3.service.js b/src/app/services/d3.service.js deleted file mode 100644 index 4239bc97d..000000000 --- a/src/app/services/d3.service.js +++ /dev/null @@ -1,87 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3*/ - - (function () { - 'use strict'; - - /** - * @name D3Service - * @desc - */ - function D3Service() { - - function xAxisTickFormat() { - return function (d) { - return d3.time.format('%X')(new Date(d)); - }; - } - - function yAxisTickFormat() { - return function (d) { - return d3.format('.02f')(d); - }; - } - - function yAxisIntegerTickFormat() { - return function (d) { - return d3.format('f')(d); - }; - } - - function yAxisPercentageTickFormat() { - return function (d) { - return d3.format('%')(d); - }; - } - - function xFunction() { - return function (d) { - return d.x; - }; - } - - function yFunction() { - return function (d) { - return d.y; - }; - } - - function getId() { - return 'chart_' + - Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - - ///////// - - return { - xAxisTickFormat: xAxisTickFormat, - yAxisTickFormat: yAxisTickFormat, - yAxisIntegerTickFormat: yAxisIntegerTickFormat, - yAxisPercentageTickFormat: yAxisPercentageTickFormat, - xFunction: xFunction, - yFunction: yFunction, - getId: getId - }; - } - - angular - .module('app.services') - .factory('D3Service', D3Service); - })(); diff --git a/src/app/services/dashboard.service.js b/src/app/services/dashboard.service.js deleted file mode 100644 index e99929de3..000000000 --- a/src/app/services/dashboard.service.js +++ /dev/null @@ -1,265 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name DashboardService - * @desc - */ - function DashboardService($rootScope, $http, $interval, $log, $location, PMAPIService, MetricListService, flash, vectorConfig, ContainerMetadataService) { - var loopErrors = 0; - var intervalPromise; - - /** - * @name cancelInterval - * @desc - */ - function cancelInterval() { - if (intervalPromise) { - $interval.cancel(intervalPromise); - $log.info('Interval canceled.'); - } - } - - /** - * @name updateMetricsCallback - * @desc - */ - function updateMetricsCallback(success) { - if (!success) { - loopErrors = loopErrors + 1; - } else { - loopErrors = 0; - } - if (loopErrors > 5) { - cancelInterval(intervalPromise); - loopErrors = 0; - flash.to('alert-dashboard-error').error = 'Consistently failed fetching metrics from host (>5). Aborting loop. Please make sure PCP is running correctly.'; - } - } - - /** - * @name intervalFunction - * @desc - */ - function intervalFunction() { - MetricListService.updateMetrics(updateMetricsCallback); - MetricListService.updateDerivedMetrics(); - } - - /** - * @name updateInterval - * @desc - */ - function updateInterval() { - cancelInterval(intervalPromise); - - if ($rootScope.properties.host) { - if ($rootScope.properties.context && - $rootScope.properties.context > 0) { - intervalPromise = $interval(intervalFunction, $rootScope.properties.interval * 1000); - } else { - flash.to('alert-dashboard-error').error = 'Invalid context. Please update host to resume operation.'; - } - $log.info('Interval updated.'); - } - } - - /** - * @name updateHostnameSuccessCallback - * @desc - */ - function updateHostnameSuccessCallback(data) { - $rootScope.properties.hostname = data.values[0].instances[0].value; - $log.info('Hostname updated: ' + $rootScope.properties.hostname); - } - - /** - * @name updateHostnameErrorCallback - * @desc - */ - function updateHostnameErrorCallback() { - $rootScope.properties.hostname = 'Hostname not available.'; - $log.error('Error fetching hostname.'); - } - - /** - * @name updateContextSuccessCallback - * @desc - */ - function updateContextSuccessCallback(data) { - $rootScope.flags.contextAvailable = true; - $rootScope.properties.context = data; - updateInterval(); - } - - /** - * @name updateContextErrorCallback - * @desc - */ - function updateContextErrorCallback() { - $rootScope.flags.contextAvailable = false; - $log.error('Error fetching context.'); - } - - /** - * @name updateContext - * @desc - */ - function updateContext(host) { - $log.info('Context updated.'); - - var hostspec = $rootScope.properties.hostspec, - hostMatch = null; - - if (host && host !== '') { - $rootScope.flags.contextUpdating = true; - $rootScope.flags.contextAvailable = false; - hostMatch = host.match('(.*):([0-9]*)'); - - if (hostMatch !== null) { - $rootScope.properties.host = hostMatch[1]; - $rootScope.properties.port = hostMatch[2]; - } else { - $rootScope.properties.host = host; - } - - PMAPIService.getHostspecContext(hostspec, 600) - .then(function (data) { - $rootScope.flags.contextUpdating = false; - updateContextSuccessCallback(data); - PMAPIService.getMetrics(data, ['pmcd.hostname']) - .then(function (metrics) { - updateHostnameSuccessCallback(metrics); - }, function errorHandler() { - updateHostnameErrorCallback(); - }); - }, function errorHandler() { - flash.to('alert-dashboard-error').error = 'Failed fetching context from host. Try updating the hostname.'; - $rootScope.flags.contextUpdating = false; - updateContextErrorCallback(); - }); - } - } - - /** - * @name updateHost - * @desc - */ - function updateHost(host) { - $log.info('Host updated.'); - - $location.search('host', host); - $location.search('hostspec', $rootScope.properties.hostspec); - - $rootScope.properties.context = -1; - $rootScope.properties.hostname = null; - $rootScope.properties.port = vectorConfig.port; - - MetricListService.clearMetricList(); - MetricListService.clearDerivedMetricList(); - - updateContext(host); - } - - /** - * @name updateWindow - * @desc - */ - function updateWindow() { - $log.log('Window updated.'); - } - - /** - * @name updateGlobalFilter - * @desc - */ - function updateGlobalFilter(word) { - $log.log('Global Filter updated.'); - //$rootScope.flags.filterDone = true; - ContainerMetadataService.setGlobalFilter(word); - } - - /** - * @name initializeProperties - * @desc - */ - function initializeProperties() { - if ($rootScope.properties) { - if (!$rootScope.properties.interval) { - $rootScope.properties.interval = vectorConfig.interval; - } - if (!$rootScope.properties.window) { - $rootScope.properties.window = vectorConfig.window; - } - if (!$rootScope.properties.protocol) { - $rootScope.properties.protocol = vectorConfig.protocol; - } - if (!$rootScope.properties.host) { - $rootScope.properties.host = ''; - } - if (!$rootScope.properties.hostspec) { - $rootScope.properties.hostspec = vectorConfig.hostspec; - } - if (!$rootScope.properties.port) { - $rootScope.properties.port = vectorConfig.port; - } - if (!$rootScope.properties.context || - $rootScope.properties.context < 0) { - updateContext(); - } else { - updateInterval(); - } - } else { - $rootScope.properties = { - protocol: vectorConfig.protocol, - host: '', - hostspec: vectorConfig.hostspec, - port: vectorConfig.port, - context: -1, - hostname: null, - window: vectorConfig.window, - interval: vectorConfig.interval - }; - } - - $rootScope.flags = { - contextAvailable: false, - contextUpdating: false - }; - } - - /////// - - return { - updateContext: updateContext, - cancelInterval: cancelInterval, - updateInterval: updateInterval, - updateHost: updateHost, - updateWindow: updateWindow, - updateGlobalFilter: updateGlobalFilter, - initializeProperties: initializeProperties - }; - } - - angular - .module('app.services') - .factory('DashboardService', DashboardService); - - })(); diff --git a/src/app/services/flamegraph.service.js b/src/app/services/flamegraph.service.js deleted file mode 100644 index 9b1477708..000000000 --- a/src/app/services/flamegraph.service.js +++ /dev/null @@ -1,52 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name FlameGraphService - */ - function FlameGraphService($log, $rootScope, $http, flash) { - - /** - * @name generate - * @desc - */ - function generate() { - $http.get($rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + $rootScope.properties.port + '/pmapi/' + $rootScope.properties.context + '/_fetch?names=generic.systack') - .success(function () { - flash.to('alert-sysstack-success').success = 'generic.systack requested!'; - $log.info('generic.systack requested'); - }).error(function () { - flash.to('alert-sysstack-error').error = 'failed requesting generic.systack!'; - $log.error('failed requesting generic.systack'); - }); - } - - ////////// - - return { - generate: generate - }; - } - - angular - .module('app.services') - .factory('FlameGraphService', FlameGraphService); - - })(); diff --git a/src/app/services/heatmap.service.js b/src/app/services/heatmap.service.js deleted file mode 100644 index 1431a451c..000000000 --- a/src/app/services/heatmap.service.js +++ /dev/null @@ -1,53 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name HeatMapService - * @desc - */ - function HeatMapService($log, $rootScope, $http, flash) { - - /** - * @name generate - * @desc - */ - function generate() { - $http.get($rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + $rootScope.properties.port + '/pmapi/' + $rootScope.properties.context + '/_fetch?names=generic.heatmap') - .success(function () { - flash.to('alert-disklatency-success').success = 'generic.heatmap requested!'; - $log.info('generic.heatmap requested'); - }).error(function () { - flash.to('alert-disklatency-error').error = 'failed requesting generic.heatmap!'; - $log.error('failed requesting generic.heatmap'); - }); - } - - //////// - - return { - generate: generate - }; - } - - angular - .module('app.services') - .factory('HeatMapService', HeatMapService); - - })(); diff --git a/src/app/services/metriclist.service.js b/src/app/services/metriclist.service.js deleted file mode 100644 index 788a71507..000000000 --- a/src/app/services/metriclist.service.js +++ /dev/null @@ -1,266 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - - /** - * @name MetricListService - * @desc - */ - function MetricListService($rootScope, $http, $log, $q, PMAPIService, SimpleMetric, CumulativeMetric, ConvertedMetric, CumulativeConvertedMetric, DerivedMetric, flash) { - var simpleMetrics = [], - derivedMetrics = []; - - /** - * @name getOrCreateMetric - * @desc - */ - function getOrCreateMetric(name) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new SimpleMetric(name); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateCumulativeMetric - * @desc - */ - function getOrCreateCumulativeMetric(name) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new CumulativeMetric(name); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateConvertedMetric - * @desc - */ - function getOrCreateConvertedMetric(name, conversionFunction) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new ConvertedMetric(name, conversionFunction); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateCumulativeConvertedMetric - * @desc - */ - function getOrCreateCumulativeConvertedMetric(name, conversionFunction) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new CumulativeConvertedMetric(name, conversionFunction); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateDerivedMetric - * @desc - */ - function getOrCreateDerivedMetric(name, derivedFunction) { - var metric = _.find(derivedMetrics, function (metric) { - return metric.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new DerivedMetric(name, derivedFunction); - derivedMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name destroyMetric - * @desc - */ - function destroyMetric(name) { - var index, - metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - metric.subscribers--; - - if (metric.subscribers < 1) { - index = simpleMetrics.indexOf(metric); - if (index > -1) { - simpleMetrics.splice(index, 1); - } - } - } - - /** - * @name destroyDerivedMetric - * @desc - */ - function destroyDerivedMetric(name) { - var index, - metric = _.find(derivedMetrics, function (el) { - return el.name === name; - }); - - metric.subscribers--; - - if (metric.subscribers < 1) { - index = derivedMetrics.indexOf(metric); - if (index > -1) { - derivedMetrics.splice(index, 1); - } - } - } - - /** - * @name clearMetricList - * @desc - */ - function clearMetricList() { - angular.forEach(simpleMetrics, function (metric) { - metric.clearData(); - }); - } - - /** - * @name clearDerivedMetricList - * @desc - */ - function clearDerivedMetricList() { - angular.forEach(derivedMetrics, function (metric) { - metric.clearData(); - }); - } - - /** - * @name updateMetrics - * @desc - */ - function updateMetrics(callback) { - var metricArr = [], - url, - host = $rootScope.properties.host, - port = $rootScope.properties.port, - context = $rootScope.properties.context, - protocol = $rootScope.properties.protocol; - - if (context && context > 0 && simpleMetrics.length > 0) { - angular.forEach(simpleMetrics, function (value) { - metricArr.push(value.name); - }); - - url = protocol + '://' + host + ':' + port + '/pmapi/' + context + '/_fetch?names=' + metricArr.join(','); - - PMAPIService.getMetrics(context, metricArr) - .then(function (metrics) { - angular.forEach(metrics.values, function (value) { - var name = value.name; - angular.forEach(value.instances, function (instance) { - var iid = angular.isUndefined(instance.instance) ? 1 : instance.instance; - var iname = metrics.inames[name].inames[iid]; - - var metricInstance = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - if (angular.isDefined(metricInstance) && metricInstance !== null) { - metricInstance.pushValue(metrics.timestamp, iid, iname, instance.value); - } - }); - }); - }).then( - function () { callback(true); }, - function () { - flash.to('alert-dashboard-error').error = 'Failed fetching metrics.'; - // Check if context is wrong and update it if needed - // PMWEBAPI error, code -12376: Attempt to use an illegal context - callback(false); - }); - - $rootScope.$broadcast('updateMetrics'); - } - } - - /** - * @name updateDerivedMetrics - * @desc - */ - function updateDerivedMetrics() { - if (derivedMetrics.length > 0) { - angular.forEach(derivedMetrics, function (metric) { - metric.updateValues(); - }); - $rootScope.$broadcast('updateDerivedMetrics'); - } - } - - - /////////// - - return { - getOrCreateMetric: getOrCreateMetric, - getOrCreateCumulativeMetric: getOrCreateCumulativeMetric, - getOrCreateConvertedMetric: getOrCreateConvertedMetric, - getOrCreateCumulativeConvertedMetric: getOrCreateCumulativeConvertedMetric, - getOrCreateDerivedMetric: getOrCreateDerivedMetric, - destroyMetric: destroyMetric, - destroyDerivedMetric: destroyDerivedMetric, - clearMetricList: clearMetricList, - clearDerivedMetricList: clearDerivedMetricList, - updateMetrics: updateMetrics, - updateDerivedMetrics: updateDerivedMetrics - }; - } - - angular - .module('app.services') - .factory('MetricListService', MetricListService); - - })(); diff --git a/src/app/services/pmapi.service.js b/src/app/services/pmapi.service.js deleted file mode 100644 index 3c8799533..000000000 --- a/src/app/services/pmapi.service.js +++ /dev/null @@ -1,261 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - -(function () { - 'use strict'; - - function PMAPIService($http, $log, $rootScope, $q) { - - function getContext(params) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/context'; - settings.params = {}; - settings.params[params.contextType] = params.contextValue; - settings.params.polltimeout = params.pollTimeout.toString(); - settings.timeout = 5000; - - return $http(settings) - .then(function (response) { - if (response.data.context) { - return response.data.context; - } - - return $q.reject('context is undefined'); - }); - } - - function getHostspecContext(hostspec, pollTimeout) { - var params = {}; - params.contextType = 'hostspec'; - params.contextValue = hostspec; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getHostnameContext(hostname, pollTimeout) { - var params = {}; - params.contextType = 'hostname'; - params.contextValue = hostname; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getLocalContext(pollTimeout) { - var params = {}; - params.contextType = 'local'; - params.contextValue = 'ANYTHING'; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getArchiveContext(archiveFile, pollTimeout) { - var params = {}; - params.contextType = 'archivefile'; - params.contextValue = archiveFile; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getMetricsValues(context, names, pmids) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_fetch'; - settings.params = {}; - - if (angular.isDefined(names) && names !== null) { - settings.params.names = names.join(','); - } - - if (angular.isDefined(pmids) && pmids !== null) { - settings.params.pmids = pmids.join(','); - } - - return $http(settings) - .then(function (response) { - if (angular.isUndefined(response.data.timestamp) || - angular.isUndefined(response.data.timestamp.s) || - angular.isUndefined(response.data.timestamp.us) || - angular.isUndefined(response.data.values)) { - return $q.reject('metric values is empty'); - } - return response; - }); - - } - - function getInstanceDomainsByIndom(context, indom, instances, inames) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_indom'; - settings.params = {indom: indom}; // required - - if (angular.isDefined(instances) && instances !== null) { - settings.params.instance = instances.join(','); - } - - if (angular.isDefined(inames) && inames !== null) { - settings.params.inames = inames.join(','); - } - - settings.cache = true; - - return $http(settings) - .then(function (response) { - if (angular.isDefined(response.data.indom) || - angular.isDefined(response.data.instances)) { - return response; - } - - return $q.reject('instances is undefined'); - }); - } - - function getInstanceDomainsByName(context, name, instances, inames) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_indom'; - settings.params = {name: name}; - - if (angular.isDefined(instances) && instances !== null) { - settings.params.instance = instances.join(','); - } - - if (angular.isDefined(inames) && inames !== null) { - settings.params.inames = inames.join(','); - } - - settings.cache = true; - - return $http(settings) - .then(function (response) { - if (angular.isDefined(response.data.instances)) { - return response; - } - return $q.reject('instances is undefined'); - }); - } - - function convertTimestampToMillis(response) { - // timestamp is in milliseconds - var timestamp = (response.data.timestamp.s * 1000) + - (response.data.timestamp.us / 1000); - var values = response.data.values; - - return { - timestamp: timestamp, - values: values - }; - - } - - function mapMetricNamesToInstanceDomains(responses) { - var instanceDomains = {}; - angular.forEach(responses, function (response) { - var indom = response.data.indom; - var name = response.config.params.name; - var inames = {}; - angular.forEach(response.data.instances, function (inst) { - inames[inst.instance.toString()] = inst.name; - }); - instanceDomains[name.toString()] = { - indom: indom, - name: name, - inames: inames - }; - }); - - return instanceDomains; - } - - function appendInstanceDomains(context, data) { - var deferred = $q.defer(); - var instanceDomainPromises = []; - angular.forEach(data.values, function (value) { - var ids = _.map(value.instances, function (inst) { - if (angular.isDefined(inst.instance) && - inst.instance !== null) { - return inst.instance; - } else { - return -1; - } - }); - instanceDomainPromises.push( - getInstanceDomainsByName(context, value.name, ids)); - }); - - $q.all(instanceDomainPromises) - .then(function (responses) { - var dict = mapMetricNamesToInstanceDomains(responses); - - var result = { - timestamp: data.timestamp, - values: data.values, - inames: dict - }; - - deferred.resolve(result); - }, function (errors) { - deferred.reject(errors); - }, function (updates) { - deferred.update(updates); - }); - - return deferred.promise; - } - - function getMetrics(context, metrics) { - return getMetricsValues(context, metrics) - .then(convertTimestampToMillis) - .then(function(data) { - return appendInstanceDomains(context, data); - }); - } - - /////////// - - return { - getHostspecContext: getHostspecContext, - getHostnameContext: getHostnameContext, - getLocalContext: getLocalContext, - getArchiveContext: getArchiveContext, - getMetricsValues: getMetricsValues, - getMetrics: getMetrics, - getInstanceDomainsByIndom: getInstanceDomainsByIndom, - getInstanceDomainsByName: getInstanceDomainsByName - }; - } - - // PMAPI Service factory - angular - .module('app.services') - .factory('PMAPIService', PMAPIService); - - PMAPIService.$inject = ['$http', '$log', '$rootScope', '$q']; - -})(); diff --git a/src/app/utils/index.js b/src/app/utils/index.js new file mode 100644 index 000000000..22a80ad1b --- /dev/null +++ b/src/app/utils/index.js @@ -0,0 +1,171 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import superagent from 'superagent' +import { parse } from 'query-string' +import config from 'config' + +///////////////////////////////////// +// window.location handling support + +export function pushQueryStringToHistory(targets, chartlist, history) { + console.log(chartlist) + + const data = targets.map(t => ({ + p: t.protocol, + h: t.hostname, + hs: t.hostspec, + ci: t.containerId, + cl: chartlist + .filter(c => matchesTarget(c.context.target, t)) + .map(c => c.chartId) + })) + const blob = JSON.stringify(data) + const encoded = encodeURI(blob) + + // we can kinda do this because the only way you should be able to add charts is when not in embed mode + history.push(`/?q=${encoded}`) +} + +export function getChartsFromLocation({ search, hash }) { + if (!search && !hash) { + return { chartlist: [], targets: [] } + } + + // check for old world urls + // the links in from legacy are via host= and container=, + // ignore the charts specifically (too bad) + if (hash) { + const queryHash = parse(hash) + const hostname = queryHash['/?host'] + ':' + config.defaultPort + const containerId = queryHash.container || '_all' + return { + isLegacy: true, + targets: [{ + protocol: config.defaultProtocol, + hostname, + hostspec: 'localhost', + containerId, + }], + chartlist: [] + } + } + + function uniqueTargetFilter (val, index, array) { + return array.findIndex(v => matchesTarget(v, val)) === index + } + + if (search) { + const query = parse(search) + + const decoded = decodeURI(query['q']) + const params = JSON.parse(decoded) + + const targets = params + .map(c => ({ + protocol: 'p' in c ? c.p : config.defaultProtocol, + hostname: c.h, + hostspec: c.hs, + containerId: c.ci + })) + .filter(uniqueTargetFilter) // should not be needed, but just in case + + const chartlist = params.map(c => + c.cl.map(chartId => ({ + target: { + protocol: 'p' in c ? c.p : config.defaultProtocol, + hostname: c.h, + hostspec: c.hs, + containerId: c.ci + }, + chartId: chartId + })) + ).reduce(flatten, []) + + return { + targets, + chartlist, + } + } +} + +///////////////////////////////////// +// generic object functions + +export function flatten (xs, ys) { + return xs.concat(ys) +} + +export function uniqueFilter (val, index, array) { + return array.indexOf(val) === index +} + +// use as a reducer +export function keyValueArrayToObjectReducer (obj, { key, value }) { + obj[key] = value + return obj +} + +export function firstValueInObject(obj) { + return obj[Object.keys(obj)[0]] +} + +///////////////////////////////////// +// handling targets and contexts +export function matchesTarget (t1, t2) { + return !!(t1 && t2 && t1.hostname === t2.hostname && t1.hostspec === t2.hostspec && t1.containerId === t2.containerId) +} + +export function isContextLoading (context) { + return !(context.contextId + && (Object.keys(context.pmids || {}).length > 0) + && context.hostname + && context.containerList) +} + +///////////////////////////////////// +// pmwebd connectivity +const PMAPI_POLL_TIMEOUT_SECONDS = 5 + +export async function fetchContainerList (protocol, hostname, hostport, hostspec) { + // set up a new context, then fetch container and cgroup details + const pmapi = `${protocol}://${hostname}:${hostport}/pmapi` + + let res = await superagent + .get(`${pmapi}/context`) + .query({ exclusive: 1, hostspec: hostspec, polltimeout: PMAPI_POLL_TIMEOUT_SECONDS }) + const context = res.body.context + + // need to do this second fetch and join to make sure we get genuine containers + const promisedContainerNames = superagent.get(`${pmapi}/${context}/_fetch?names=containers.name`) + const promisedCgroups = superagent.get(`${pmapi}/${context}/_fetch?names=containers.cgroup`) + + res = await promisedContainerNames + const containers = res.body.values.length ? res.body.values[0].instances : [] + res = await promisedCgroups + const cgroups = res.body.values.length ? res.body.values[0].instances : [] + + const containerList = cgroups.map(({ instance, value }) => ({ + instance, + cgroup: value, + containerId: containers.find(cont => cont.instance === instance).value + })) + + return containerList +} + diff --git a/src/app/utils/index.spec.js b/src/app/utils/index.spec.js new file mode 100644 index 000000000..2ba229988 --- /dev/null +++ b/src/app/utils/index.spec.js @@ -0,0 +1,101 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './' +import { expect } from 'chai' +import config from 'config' + +describe('getChartsFromLocation', () => { + describe('with new style search string', () => { + const search = '?q=[{"p":"http","h":"192.168.251.133:44323","hs":"localhost","ci":"_all","cl":["cpu-pswitch"]},{"p":"http","h":"1.2.3.4:7402","hs":"localhost","ci":"_all","cl":[]},{"p":"https","h":"192.168.251.133:44323","hs":"localhost","ci":"hopeful_dijkstra","cl":["container-percont-cpu","container-percont-mem","container-total-cont-mem"]}]' + const result = utils.getChartsFromLocation({ search, hash: null }) + it('finds three targets', () => { + expect(result.targets.length).to.equal(3) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: '_all' }, + { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, + { protocol: 'http', hostname: '1.2.3.4:7402', hostspec: 'localhost', containerId: '_all' }, + ]) + }) + + it('finds four charts in the chartlist', () => { + expect(result.chartlist.length).to.equal(4) + expect(result.chartlist).to.have.deep.members([ + { target: { protocol: 'http', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: '_all' }, chartId: 'cpu-pswitch' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-percont-cpu' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-percont-mem' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-total-cont-mem' }, + ]) + }) + }) + + describe('with new style search string, no protocol specified', () => { + const search = '?q=[{"h":"192.168.251.133:44323","hs":"localhost","ci":"_all","cl":["cpu-pswitch"]},{"h":"1.2.3.4:7402","hs":"localhost","ci":"_all","cl":[]},{"h":"192.168.251.133:44323","hs":"localhost","ci":"hopeful_dijkstra","cl":["container-percont-cpu","container-percont-mem","container-total-cont-mem"]}]' + const result = utils.getChartsFromLocation({ search, hash: null }) + it('finds three targets, all with the default protocol', () => { + expect(result.targets.length).to.equal(3) + result.targets.forEach(i => expect(i.protocol).to.equal(config.defaultProtocol)) + }) + + it('finds four charts in the chartlist, all with targets having the default protocol', () => { + expect(result.chartlist.length).to.equal(4) + result.chartlist.forEach(i => expect(i.target.protocol).to.equal(config.defaultProtocol)) + }) + }) + + describe('with old style hash string', () => { + describe('with a container', () => { + const hash = '#/?host=100.65.15.127&container=09fb4cae-8987-49bc-a208-1115aa0443e1' + const result = utils.getChartsFromLocation({ search: null, hash }) + it('finds a single target with a container', () => { + expect(result.targets.length).to.equal(1) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '100.65.15.127:7402', hostspec: 'localhost', containerId: '09fb4cae-8987-49bc-a208-1115aa0443e1' } + ]) + }) + it('finds a single chart attached to that container', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) + + describe('without a container', () => { + const hash = '#/?host=100.82.47.121' + const result = utils.getChartsFromLocation({ search: null, hash }) + it('finds a single target connected to _all container', () => { + expect(result.targets.length).to.equal(1) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '100.82.47.121:7402', hostspec: 'localhost', containerId: '_all' } + ]) + }) + it('does not find any charts', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) + }) + + describe('with empty string', () => { + const result = utils.getChartsFromLocation({ search: null, hash: null }) + it('finds no targets', () => { + expect(result.targets.length).to.equal(0) + }) + it('finds no charts', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) +}) + diff --git a/src/app/vector.css b/src/app/vector.css deleted file mode 100644 index abd621130..000000000 --- a/src/app/vector.css +++ /dev/null @@ -1,258 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - body { - margin: 15px; - } - - .main-container { - padding-top: 46px; - will-change: transform; - } - - .spacer { - margin-top: 12px; - } - - .navbar-inverse .navbar-brand { - text-transform: uppercase; - font-size: 23px; - letter-spacing: 1px; - font-weight: 300; - } - - .navbar-inverse { - - background: #5b5b5b; - } - - .navbar .container-fluid .navbar-brand { - margin-left: -10px; - } - - .navbar-logo { - max-width:42px; - margin-top: -7px; - } - - .jumbotron { - text-align: center; - background-color: transparent; - } - .jumbotron .btn { - padding: 14px 24px; - font-size: 21px; - } - - #hostnameInput { - margin-left: -1px; - margin-top: 8px; - } - - #hostspecInput { - margin-left: -1px; - margin-top: 8px; - } - - #globalFilterInput { - margin-left: -1px; - margin-top: 8px; - } - - .input-group-lg > #hostnameInput { - margin-top: 0; - } - - .input-group-lg > #hostspecInput { - margin-top: 0; - } - .input-group-lg > #globalFilterInput { - margin-top: 0; - } - - .input-group-lg { - margin-top: 8px; - } - - #hostnameLabel { - margin-top: 18px; - } - - .alert, - .btn { - background-image: none !important; - box-shadow: none; - } - - .input-group-btn { - top: 2px; - } - - .input-group-btn:hover { - z-index: 3; - } - - .contextOptions { - margin-bottom: 50px; - } - - .contextOptions p { - min-height: 40px; - } - - .input-group-lg > .input-group-addon { - height: 40px; - } - - #widgetButton { - margin-top: 7px; - } - - #welcomeScreen #hostnameInput{ - margin-top: 8px; - } - - @-moz-document url-prefix() { - #welcomeScreen #hostnameInput{ - margin-top: 5px; - } - } - - #requiredHelper { - float: right; - z-index: 2; - position: relative; - top: -38px; - left: -11px; - opacity: 0.4; - } - -.panel.widget { - border: 1px solid #c4c4c4; -} - -.widget-container { - will-change: transform; -} - -.widget-header.panel-heading.ui-sortable-handle { - cursor: all-scroll; - background-color: #f1f1f1; - background-image: none !important; -} - -.input-group-lg select { - margin: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -#alert-dashboard-error { - margin-top: 15px; -} - -.form-control-feedback { - margin-top: 6px; - margin-right: 10px; - margin-bottom: 10px; - margin-left: 10px; -} - -.widget-icon { - display: inline-block; - width: 100%; - text-align:center; - margin-top: 78px; - color: #ccc; -} - -.dropdown-submenu{ - position:relative; -} - -.dropdown-submenu > .dropdown-menu -{ - top:0; - left:100%; - margin-top:-6px; - margin-left:-1px; - -webkit-border-radius:0 6px 6px 6px; - -moz-border-radius:0 6px 6px 6px; - border-radius:0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu{ - display:block; -} - -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover > a:after{ - border-left-color:#ffffff; -} - -.dropdown-submenu .pull-left{ - float:none; -} - -.dropdown-submenu.pull-left > .dropdown-menu{ - left:-100%; - margin-left:10px; - -webkit-border-radius:6px 0 6px 6px; - -moz-border-radius:6px 0 6px 6px; - border-radius:6px 0 6px 6px; -} - -@media screen and (max-width: 1280px) { - .widget-container { - width: 33% !important; - } -} - -@media screen and (max-width: 990px) { - .widget-container { - width: 50% !important; - } - #widgetWrapper { - width: 100% !important; - } - #widgetWrapper ul { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - } -} - -@media screen and (max-width: 640px) { - .widget-container { - width: 100% !important; - } -} diff --git a/src/config.js b/src/config.js new file mode 100644 index 000000000..9c089cc9d --- /dev/null +++ b/src/config.js @@ -0,0 +1,53 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +const config = { + basename: '/', + + dataWindows: [ + { text: '2 min', valueSeconds: 2*60 }, + { text: '5 min', valueSeconds: 5*60 }, + { text: '10 min', valueSeconds: 10*60 } + ], + pollIntervals: [ + { text: '1 sec', valueSeconds: 1 }, + { text: '2 sec', valueSeconds: 2 }, + { text: '3 sec', valueSeconds: 3 }, + { text: '5 sec', valueSeconds: 5 } + ], + defaultWindowSeconds: 120, // Default graph time window + defaultIntervalSeconds: 2, // Default update interval + + enableContainerWidgets: true, // Enable container widgets + enableCustomWidgetFeature: true, // Enable the custom widget feature to add ad-hoc widgets + enableBcc: true, // Enable BCC widgets (requires BCC PMDA) + enableFlamegraphs: true, // Enable Flamegraph widgets (requires custom PMDA) + + defaultProtocol: 'http', // PMWEBD protocol + defaultPort: 7402, // PMWEBD port + defaultHostspec: 'localhost', // Default PMCD hostspec + disableHostspecInput: true, // Disable hostspec input + disableContainerSelect: false, // Disable container name drop down select + useCgroupId: false, // Use container cgroup id instead of container name + + // TODO what about container name resolver +} + +if (typeof module !== 'undefined') { + module.exports = config; +} diff --git a/src/index.html b/src/index.html deleted file mode 100644 index dc75b3ced..000000000 --- a/src/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - Vector - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - diff --git a/test/__mocks__/fileMock.js b/test/__mocks__/fileMock.js new file mode 100644 index 000000000..0e56c5b5f --- /dev/null +++ b/test/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub' diff --git a/test/__mocks__/styleMock.js b/test/__mocks__/styleMock.js new file mode 100644 index 000000000..4ba52ba2c --- /dev/null +++ b/test/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/test/datasets.json b/test/datasets.json new file mode 100644 index 000000000..1e7156a2d --- /dev/null +++ b/test/datasets.json @@ -0,0 +1,2614 @@ +[ + { + "timestamp": { + "s": 1531869878, + "us": 882804 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885593597 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 178 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869881, + "us": 103765 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885757228 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 104 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869883, + "us": 354578 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885880347 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869885, + "us": 509563 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885975028 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869887, + "us": 757439 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886101256 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869889, + "us": 969822 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886256630 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869892, + "us": 183967 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886439848 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 136 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869894, + "us": 362094 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886553864 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869896, + "us": 541978 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886669659 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591033300 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869898, + "us": 821179 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886857999 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 57 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065350170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591034240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869901, + "us": 38447 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887044887 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 11 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065392590 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591035440 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869903, + "us": 318814 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887172913 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065427400 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591037210 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869905, + "us": 550189 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887298210 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065451310 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591038300 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869907, + "us": 748198 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887443983 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065489280 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591038950 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869909, + "us": 996762 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887657847 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065519070 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591039450 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869911, + "us": 662717 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887747949 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065537580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591039740 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869912, + "us": 803687 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887899467 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065553170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040080 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869913, + "us": 827935 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887960323 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065565920 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869915, + "us": 12796 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888076785 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 13 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065588290 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040590 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869916, + "us": 75307 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888190734 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 215 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065610540 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041120 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869916, + "us": 257752 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888215591 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065614590 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041200 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869917, + "us": 239458 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888296721 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065630880 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041450 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869917, + "us": 462006 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888312780 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065633600 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041680 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869918, + "us": 416088 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888408565 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 41 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065650580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042020 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869918, + "us": 667927 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888426570 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065654170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042170 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869919, + "us": 580282 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888483343 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 135 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065666320 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042320 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869919, + "us": 873619 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888500815 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065669530 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042370 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869920, + "us": 786474 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888562046 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 51 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065681710 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042590 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869921, + "us": 81547 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888583360 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 97 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065685550 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042620 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869922, + "us": 1109 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888640130 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 40 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065698870 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042930 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869922, + "us": 295117 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888662866 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 57 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065703690 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043000 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869923, + "us": 212100 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 13.67 + }, + { + "instance": 5, + "value": 30.32 + }, + { + "instance": 15, + "value": 36.080002 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888738833 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 15 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065720980 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043350 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869923, + "us": 466975 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 13.67 + }, + { + "instance": 5, + "value": 30.32 + }, + { + "instance": 15, + "value": 36.080002 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888756159 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065725300 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043430 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869924, + "us": 424798 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888848335 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065744090 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043750 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869924, + "us": 981264 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888891354 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 153 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065752710 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044050 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869925, + "us": 652482 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888927559 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065763970 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044140 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869926, + "us": 172977 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888956222 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065772140 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869926, + "us": 812472 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888994417 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065781320 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044400 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869927, + "us": 312409 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889016315 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 44 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065786740 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044480 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869927, + "us": 986464 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889051102 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 78 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065794580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044640 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869928, + "us": 472500 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889076757 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065800560 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044740 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869929, + "us": 156269 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889124157 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065811720 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044890 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869929, + "us": 633691 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889153390 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065818740 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044980 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869930, + "us": 365784 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889212470 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065829880 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591045210 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869930, + "us": 787234 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889252559 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 144 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065837410 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591045400 + } + ] + } + ] + } +] diff --git a/test/pcp-target/Dockerfile b/test/pcp-target/Dockerfile new file mode 100644 index 000000000..6e0c7bd5d --- /dev/null +++ b/test/pcp-target/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:bionic + +# need to fetch latest ca-certificates first +RUN apt-get -y update +RUN apt-get -y upgrade +RUN apt-get install -y ca-certificates gnupg2 linux-headers-$(uname -r) + +# install pcp +COPY etc_apt_sources.list.d_pcp.list /etc/apt/sources.list.d/pcp.list +RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A51D3ADCDEA2C114 +RUN apt-get -y update +RUN apt-get install -y pcp pcp-webapi bpfcc-tools + diff --git a/test/pcp-target/etc_apt_sources.list.d_pcp.list b/test/pcp-target/etc_apt_sources.list.d_pcp.list new file mode 100644 index 000000000..a454b36b7 --- /dev/null +++ b/test/pcp-target/etc_apt_sources.list.d_pcp.list @@ -0,0 +1,2 @@ +deb https://dl.bintray.com/pcp/bionic bionic main + diff --git a/test/rawdata.json b/test/rawdata.json new file mode 100644 index 000000000..5fca5ac2e --- /dev/null +++ b/test/rawdata.json @@ -0,0 +1,293 @@ +[ + { + "timestamp": { "s": 1534976615, "us": 285259 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.1 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0.0099999998 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976617, "us": 275733 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.1 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0.0099999998 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976619, "us": 278537 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976621, "us": 284537 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976623, "us": 275739 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976631, "us": 279162 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130837 }, + { "instance": 2, "value": 256041 }, + { "instance": 3, "value": 107807 }, + { "instance": 4, "value": 110856 }, + { "instance": 5, "value": 60577 }, + { "instance": 6, "value": 294239 }, + { "instance": 7, "value": 29600 }, + { "instance": 8, "value": 6820 }, + { "instance": 9, "value": 3919 }, + { "instance": 10, "value": 2453 }, + { "instance": 11, "value": 3321 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976633, "us": 277205 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130838 }, + { "instance": 2, "value": 256049 }, + { "instance": 3, "value": 107833 }, + { "instance": 4, "value": 110898 }, + { "instance": 5, "value": 60583 }, + { "instance": 6, "value": 294242 }, + { "instance": 7, "value": 29602 }, + { "instance": 8, "value": 6822 }, + { "instance": 9, "value": 3922 }, + { "instance": 10, "value": 2454 }, + { "instance": 11, "value": 3322 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976635, "us": 294204 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130840 }, + { "instance": 2, "value": 256061 }, + { "instance": 3, "value": 107855 }, + { "instance": 4, "value": 110937 }, + { "instance": 5, "value": 60595 }, + { "instance": 6, "value": 294249 }, + { "instance": 7, "value": 29606 }, + { "instance": 8, "value": 6827 }, + { "instance": 9, "value": 3923 }, + { "instance": 10, "value": 2454 }, + { "instance": 11, "value": 3323 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976637, "us": 278937 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130840 }, + { "instance": 2, "value": 256063 }, + { "instance": 3, "value": 107858 }, + { "instance": 4, "value": 110974 }, + { "instance": 5, "value": 60615 }, + { "instance": 6, "value": 294255 }, + { "instance": 7, "value": 29611 }, + { "instance": 8, "value": 6827 }, + { "instance": 9, "value": 3923 }, + { "instance": 10, "value": 2457 }, + { "instance": 11, "value": 3324 }, + { "instance": 12, "value": 2065 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976639, "us": 277099 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130842 }, + { "instance": 2, "value": 256079 }, + { "instance": 3, "value": 107885 }, + { "instance": 4, "value": 110997 }, + { "instance": 5, "value": 60642 }, + { "instance": 6, "value": 294266 }, + { "instance": 7, "value": 29616 }, + { "instance": 8, "value": 6829 }, + { "instance": 9, "value": 3925 }, + { "instance": 10, "value": 2459 }, + { "instance": 11, "value": 3328 }, + { "instance": 12, "value": 2066 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976643, "us": 287355 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365600 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976645, "us": 275819 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365620 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976647, "us": 276417 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365630 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976649, "us": 276794 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365640 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + } +] diff --git a/webpack.common.js b/webpack.common.js new file mode 100644 index 000000000..a1abedba7 --- /dev/null +++ b/webpack.common.js @@ -0,0 +1,96 @@ +'use strict' +const webpack = require('webpack') +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const WebpackAutoInjectVersion = require('webpack-auto-inject-version') + +module.exports = { + entry: { + javascript: './src/app/App.jsx' + }, + output: { + path: path.join(__dirname, '/dist/'), + filename: 'scripts/bundle.js', + publicPath: '' + }, + externals: { + config: 'config' + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + enforce: 'pre', + exclude: [ /node_modules/, /src\/\_app/ ], + use: [ + { loader: 'eslint-loader' } + ] + }, + { + test: /\.(js|jsx)$/, + exclude: [ /node_modules/ ], + use: [ + { loader: 'babel-loader', options: { babelrc: true } } + ] + }, + { + test: /\.html$/, + exclude: [ + path.resolve(__dirname, 'src/index.html'), + ], + use: [ + { loader: "html-loader" } + ] + }, + { + test: /\.css$/, + use: [ + { loader: "style-loader" }, // creates style nodes from JS strings + { loader: "css-loader" }, // translates CSS into CommonJS + ] + }, + { + test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/, + use: 'url-loader?name=fonts/[name].[ext]&limit=10000', + }, + { + test: /\.(png)(\?[\s\S]+)?$/, + use: 'file-loader?name=images/[name].[ext]', + }, + { + test: /\.(ttf|eot|svg|otf)(\?[\s\S]+)?$/, + use: 'file-loader?name=fonts/[name].[ext]', + }, + { + test: /\.scss$/, + use: [ + { loader: "style-loader" }, // creates style nodes from JS strings + { loader: "css-loader" }, // translates CSS into CommonJS + { loader: "sass-loader" } // compiles Sass to CSS + ] + } + ] + }, + plugins: [ + // needs to go first to insert the file in js + new WebpackAutoInjectVersion({ + components: { + AutoIncreaseVersion: false, + InjectAsComment: false, + InjectByTag: true + } + }), + // the html, which will have the bundle.js script tag injected + new HtmlWebpackPlugin({ + template: 'src/app/index.html', + inject: 'body' + }), + // copy static assets + new CopyWebpackPlugin([ + { from: 'src/config.js', to: 'config.js' }, + { from: 'src/favicon.ico', to: 'favicon.ico' }, + { from: 'src/assets/images/vector_owl.png', to: 'assets/images/vector_owl.png' } + ]) + ] +} diff --git a/webpack.dev.js b/webpack.dev.js new file mode 100644 index 000000000..5c39fb487 --- /dev/null +++ b/webpack.dev.js @@ -0,0 +1,7 @@ +const merge = require('webpack-merge') +const common = require('./webpack.common.js') + +module.exports = merge(common, { + mode: 'development', + devtool: 'inline-source-map', +}) diff --git a/webpack.prod.js b/webpack.prod.js new file mode 100644 index 000000000..9a1a72fb5 --- /dev/null +++ b/webpack.prod.js @@ -0,0 +1,7 @@ +const merge = require('webpack-merge') +const common = require('./webpack.common.js') + +module.exports = merge(common, { + mode: 'production', + devtool: 'source-map', +})