From c50bb4c77959ad078d675d3f21981812166216aa Mon Sep 17 00:00:00 2001 From: holao Date: Fri, 1 Dec 2017 04:36:58 -0800 Subject: [PATCH 01/11] save purpose --- myproj/.babelrc | 15 + myproj/.editorconfig | 9 + myproj/.eslintignore | 5 + myproj/.eslintrc.js | 27 + myproj/.gitignore | 17 + myproj/.postcssrc.js | 9 + myproj/README.md | 30 + myproj/build/build.js | 41 + myproj/build/check-versions.js | 49 + myproj/build/logo.png | Bin 0 -> 6849 bytes myproj/build/utils.js | 98 + myproj/build/vue-loader.conf.js | 23 + myproj/build/webpack.base.conf.js | 78 + myproj/build/webpack.dev.conf.js | 78 + myproj/build/webpack.prod.conf.js | 146 + myproj/build/webpack.test.conf.js | 32 + myproj/config/dev.env.js | 7 + myproj/config/index.js | 81 + myproj/config/prod.env.js | 4 + myproj/config/test.env.js | 7 + myproj/index.html | 12 + myproj/package-lock.json | 11880 ++++++++++++++++ myproj/package.json | 83 + myproj/src/App.vue | 23 + myproj/src/assets/imdb-bidirectional-lstm.png | Bin 0 -> 150415 bytes myproj/src/assets/inception-v3.png | Bin 0 -> 197651 bytes myproj/src/assets/logo.png | Bin 0 -> 6849 bytes myproj/src/assets/mnist-acgan.png | Bin 0 -> 49192 bytes myproj/src/assets/mnist-cnn.png | Bin 0 -> 51719 bytes myproj/src/assets/mnist-vae.png | Bin 0 -> 49035 bytes myproj/src/assets/resnet50.png | Bin 0 -> 148764 bytes myproj/src/assets/squeezenet-v1.1.png | Bin 0 -> 114406 bytes myproj/src/components/HelloWorld.vue | 50 + myproj/src/components/Home.vue | 94 + myproj/src/main.js | 15 + myproj/src/router/index.js | 17 + myproj/src/variables.css | 15 + myproj/static/.gitkeep | 0 .../e2e/custom-assertions/elementCount.js | 27 + myproj/test/e2e/nightwatch.conf.js | 46 + myproj/test/e2e/runner.js | 48 + myproj/test/e2e/specs/test.js | 19 + myproj/test/unit/.eslintrc | 7 + myproj/test/unit/jest.conf.js | 30 + myproj/test/unit/setup.js | 3 + myproj/test/unit/specs/HelloWorld.spec.js | 11 + 46 files changed, 13136 insertions(+) create mode 100644 myproj/.babelrc create mode 100644 myproj/.editorconfig create mode 100644 myproj/.eslintignore create mode 100644 myproj/.eslintrc.js create mode 100644 myproj/.gitignore create mode 100644 myproj/.postcssrc.js create mode 100644 myproj/README.md create mode 100644 myproj/build/build.js create mode 100644 myproj/build/check-versions.js create mode 100644 myproj/build/logo.png create mode 100644 myproj/build/utils.js create mode 100644 myproj/build/vue-loader.conf.js create mode 100644 myproj/build/webpack.base.conf.js create mode 100644 myproj/build/webpack.dev.conf.js create mode 100644 myproj/build/webpack.prod.conf.js create mode 100644 myproj/build/webpack.test.conf.js create mode 100644 myproj/config/dev.env.js create mode 100644 myproj/config/index.js create mode 100644 myproj/config/prod.env.js create mode 100644 myproj/config/test.env.js create mode 100644 myproj/index.html create mode 100644 myproj/package-lock.json create mode 100644 myproj/package.json create mode 100644 myproj/src/App.vue create mode 100644 myproj/src/assets/imdb-bidirectional-lstm.png create mode 100644 myproj/src/assets/inception-v3.png create mode 100644 myproj/src/assets/logo.png create mode 100644 myproj/src/assets/mnist-acgan.png create mode 100644 myproj/src/assets/mnist-cnn.png create mode 100644 myproj/src/assets/mnist-vae.png create mode 100644 myproj/src/assets/resnet50.png create mode 100644 myproj/src/assets/squeezenet-v1.1.png create mode 100644 myproj/src/components/HelloWorld.vue create mode 100644 myproj/src/components/Home.vue create mode 100644 myproj/src/main.js create mode 100644 myproj/src/router/index.js create mode 100644 myproj/src/variables.css create mode 100644 myproj/static/.gitkeep create mode 100644 myproj/test/e2e/custom-assertions/elementCount.js create mode 100644 myproj/test/e2e/nightwatch.conf.js create mode 100644 myproj/test/e2e/runner.js create mode 100644 myproj/test/e2e/specs/test.js create mode 100644 myproj/test/unit/.eslintrc create mode 100644 myproj/test/unit/jest.conf.js create mode 100644 myproj/test/unit/setup.js create mode 100644 myproj/test/unit/specs/HelloWorld.spec.js diff --git a/myproj/.babelrc b/myproj/.babelrc new file mode 100644 index 0000000000..3419daeaef --- /dev/null +++ b/myproj/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + ["env", { + "modules": false + }], + "stage-2" + ], + "plugins": ["transform-runtime"], + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"] + } + } +} diff --git a/myproj/.editorconfig b/myproj/.editorconfig new file mode 100644 index 0000000000..9d08a1a828 --- /dev/null +++ b/myproj/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/myproj/.eslintignore b/myproj/.eslintignore new file mode 100644 index 0000000000..e2192c5c28 --- /dev/null +++ b/myproj/.eslintignore @@ -0,0 +1,5 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ diff --git a/myproj/.eslintrc.js b/myproj/.eslintrc.js new file mode 100644 index 0000000000..e0dd62d911 --- /dev/null +++ b/myproj/.eslintrc.js @@ -0,0 +1,27 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + }, + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + extends: 'standard', + // required to lint *.vue files + plugins: [ + 'html' + ], + // add your custom rules here + 'rules': { + // allow paren-less arrow functions + 'arrow-parens': 0, + // allow async-await + 'generator-star-spacing': 0, + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 + } +} diff --git a/myproj/.gitignore b/myproj/.gitignore new file mode 100644 index 0000000000..dfb4167f9a --- /dev/null +++ b/myproj/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test/unit/coverage/ +/test/e2e/reports/ +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/myproj/.postcssrc.js b/myproj/.postcssrc.js new file mode 100644 index 0000000000..249472dab1 --- /dev/null +++ b/myproj/.postcssrc.js @@ -0,0 +1,9 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + // to edit target browsers: use "browserslist" field in package.json + "postcss-import": {}, + "autoprefixer": {} + } +} diff --git a/myproj/README.md b/myproj/README.md new file mode 100644 index 0000000000..09e8da5382 --- /dev/null +++ b/myproj/README.md @@ -0,0 +1,30 @@ +# myproj + +> A Vue.js project + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build + +# build for production and view the bundle analyzer report +npm run build --report + +# run unit tests +npm run unit + +# run e2e tests +npm run e2e + +# run all tests +npm test +``` + +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). diff --git a/myproj/build/build.js b/myproj/build/build.js new file mode 100644 index 0000000000..30f036a180 --- /dev/null +++ b/myproj/build/build.js @@ -0,0 +1,41 @@ +'use strict' +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, function (err, stats) { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, + chunks: false, + chunkModules: false + }) + '\n\n') + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/myproj/build/check-versions.js b/myproj/build/check-versions.js new file mode 100644 index 0000000000..ca407bb16f --- /dev/null +++ b/myproj/build/check-versions.js @@ -0,0 +1,49 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + console.log() + process.exit(1) + } +} diff --git a/myproj/build/logo.png b/myproj/build/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 { + if (severity !== 'error') { + return + } + const error = errors[0] + + const filename = error.file && error.file.split('!').pop() + notifier.notify({ + title: pkg.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/myproj/build/vue-loader.conf.js b/myproj/build/vue-loader.conf.js new file mode 100644 index 0000000000..847f7cf2b9 --- /dev/null +++ b/myproj/build/vue-loader.conf.js @@ -0,0 +1,23 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' +const sourceMapEnabled = isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap + + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + cssSourceMap: sourceMapEnabled, + cacheBusting: config.dev.cacheBusting, + transformToRequire: { + video: 'src', + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/myproj/build/webpack.base.conf.js b/myproj/build/webpack.base.conf.js new file mode 100644 index 0000000000..b69edc013a --- /dev/null +++ b/myproj/build/webpack.base.conf.js @@ -0,0 +1,78 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + } + }, + module: { + rules: [ + ...(config.dev.useEslint? [{ + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter'), + emitWarning: !config.dev.showEslintErrorsInOverlay + } + }] : []), + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + } +} diff --git a/myproj/build/webpack.dev.conf.js b/myproj/build/webpack.dev.conf.js new file mode 100644 index 0000000000..813a7b0ccd --- /dev/null +++ b/myproj/build/webpack.dev.conf.js @@ -0,0 +1,78 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') +const portfinder = require('portfinder') + +const devWebpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) + }, + // cheap-module-eval-source-map is faster for development + devtool: config.dev.devtool, + + // these devServer options should be customized in /config/index.js + devServer: { + clientLogLevel: 'warning', + historyApiFallback: true, + hot: true, + compress: true, + host: process.env.HOST || config.dev.host, + port: process.env.PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + overlay: config.dev.errorOverlay ? { + warnings: false, + errors: true, + } : false, + publicPath: config.dev.assetsPublicPath, + proxy: config.dev.proxyTable, + quiet: true, // necessary for FriendlyErrorsPlugin + watchOptions: { + poll: config.dev.poll, + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + ] +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + // publish the new Port, necessary for e2e tests + process.env.PORT = port + // add port to devServer config + devWebpackConfig.devServer.port = port + + // Add FriendlyErrorsPlugin + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ + compilationSuccessInfo: { + messages: [`Your application is running here: http://${config.dev.host}:${port}`], + }, + onErrors: config.dev.notifyOnErrors + ? utils.createNotifierCallback() + : undefined + })) + + resolve(devWebpackConfig) + } + }) +}) diff --git a/myproj/build/webpack.prod.conf.js b/myproj/build/webpack.prod.conf.js new file mode 100644 index 0000000000..73a5fbc3d3 --- /dev/null +++ b/myproj/build/webpack.prod.conf.js @@ -0,0 +1,146 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') + +const env = process.env.NODE_ENV === 'testing' + ? require('../config/test.env') + : require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true, + usePostCSS: true + }) + }, + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + // UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + }, + sourceMap: config.build.productionSourceMap, + parallel: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css'), + // set the following option to `true` if you want to extract CSS from + // codesplit chunks into this main css file as well. + // This will result in *all* of your app's CSS being loaded upfront. + allChunks: false, + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: config.build.productionSourceMap + ? { safe: true, map: { inline: false } } + : { safe: true } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: process.env.NODE_ENV === 'testing' + ? 'index.html' + : config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vender modules does not change + new webpack.HashedModuleIdsPlugin(), + // enable scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks: function (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + // This instance extracts shared chunks from code splitted chunks and bundles them + // in a separate chunk, similar to the vendor chunk + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }), + + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/myproj/build/webpack.test.conf.js b/myproj/build/webpack.test.conf.js new file mode 100644 index 0000000000..0d658d9ebe --- /dev/null +++ b/myproj/build/webpack.test.conf.js @@ -0,0 +1,32 @@ +'use strict' +// This is the webpack config used for unit tests. + +const utils = require('./utils') +const webpack = require('webpack') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') + +const webpackConfig = merge(baseWebpackConfig, { + // use inline sourcemap for karma-sourcemap-loader + module: { + rules: utils.styleLoaders() + }, + devtool: '#inline-source-map', + resolveLoader: { + alias: { + // necessary to to make lang="scss" work in test when using vue-loader's ?inject option + // see discussion at https://github.com/vuejs/vue-loader/issues/724 + 'scss-loader': 'sass-loader' + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/test.env') + }) + ] +}) + +// no need for app entry during tests +delete webpackConfig.entry + +module.exports = webpackConfig diff --git a/myproj/config/dev.env.js b/myproj/config/dev.env.js new file mode 100644 index 0000000000..1e22973ae7 --- /dev/null +++ b/myproj/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}) diff --git a/myproj/config/index.js b/myproj/config/index.js new file mode 100644 index 0000000000..08d4d4d166 --- /dev/null +++ b/myproj/config/index.js @@ -0,0 +1,81 @@ +'use strict' +// Template version: 1.2.4 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + // CSS Sourcemaps off by default because relative paths are "buggy" + // with this option, according to the CSS-Loader README + // (https://github.com/webpack/css-loader#sourcemaps) + // In our experience, they generally work as expected, + // just be aware of this issue when enabling this option. + cssSourceMap: false, + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + } +} diff --git a/myproj/config/prod.env.js b/myproj/config/prod.env.js new file mode 100644 index 0000000000..a6f997616e --- /dev/null +++ b/myproj/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/myproj/config/test.env.js b/myproj/config/test.env.js new file mode 100644 index 0000000000..c2824a307a --- /dev/null +++ b/myproj/config/test.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const devEnv = require('./dev.env') + +module.exports = merge(devEnv, { + NODE_ENV: '"testing"' +}) diff --git a/myproj/index.html b/myproj/index.html new file mode 100644 index 0000000000..3113802fb7 --- /dev/null +++ b/myproj/index.html @@ -0,0 +1,12 @@ + + + + + + myproj + + +
+ + + diff --git a/myproj/package-lock.json b/myproj/package-lock.json new file mode 100644 index 0000000000..e2056f072d --- /dev/null +++ b/myproj/package-lock.json @@ -0,0 +1,11880 @@ +{ + "name": "myproj", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", + "integrity": "sha1-6yhAdG6dxIvV4GOjbj/UAMXqtak=", + "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.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "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 + }, + "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-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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.10.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.3" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "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.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "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" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "dev": true + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "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": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "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=", + "dev": true + }, + "autoprefixer": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", + "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", + "dev": true, + "requires": { + "browserslist": "2.9.1", + "caniuse-lite": "1.0.30000777", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0" + } + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.2.tgz", + "integrity": "sha1-rOscNzWIJ54nVeoc/TXCI5T9M/g=", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.5", + "babel-preset-jest": "21.2.0" + } + }, + "babel-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "dev": true, + "requires": { + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.9.1", + "test-exclude": "4.1.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", + "dev": true + }, + "babel-plugin-jsx-event-modifiers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz", + "integrity": "sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg==", + "dev": true + }, + "babel-plugin-jsx-v-model": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz", + "integrity": "sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "html-tags": "2.0.0", + "svg-tags": "1.0.0" + } + }, + "babel-plugin-jsx-vue-functional": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-vue-functional/-/babel-plugin-jsx-vue-functional-2.1.0.tgz", + "integrity": "sha1-VjCgyG/hkE0owwRl5r8c9xI1ojk=", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-vue-jsx": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.5.0.tgz", + "integrity": "sha512-5vCg8K7aiiLwrFJ45ZF/b4cIiFpGAoYL5uNZpbgiZFptBc5LkueBCQXTVexrd1IFlpTV7XndqFjtWjcJ54JGUQ==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.1", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "21.2.0", + "babel-plugin-syntax-object-rest-spread": "6.13.0" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-preset-vue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-vue/-/babel-preset-vue-1.2.1.tgz", + "integrity": "sha512-a/Z+6SJ4GXyAoCMfYidDH6OzXnccPNJ5nEaPMjALqCkP9SJkqxz9V0uUS//sGuWszcD8kibdwJRzU+brl8DdFQ==", + "dev": true, + "requires": { + "babel-helper-vue-jsx-merge-props": "2.0.2", + "babel-plugin-jsx-event-modifiers": "2.0.5", + "babel-plugin-jsx-v-model": "2.0.3", + "babel-plugin-jsx-vue-functional": "2.1.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-vue-jsx": "3.5.0" + } + }, + "babel-preset-vue-app": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/babel-preset-vue-app/-/babel-preset-vue-app-1.3.2.tgz", + "integrity": "sha512-PLyyyVdrvgL4szMF7D5SuUhy85aBzy0+s5MO2QhpTwVqfW0qVaPFJi6K3d25CKz1nOV437JgpVvPj1W6tLGJ5g==", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-object-rest-spread": "6.26.0", + "babel-plugin-transform-runtime": "6.23.0", + "babel-preset-env": "1.6.1", + "babel-preset-vue": "1.2.1", + "babel-runtime": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "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=", + "dev": true, + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "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==", + "dev": true + }, + "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 + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.1", + "multicast-dns-service-types": "1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "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 + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "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 + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "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.11.8", + "randombytes": "2.0.5" + } + }, + "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.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.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.6" + } + }, + "browserslist": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", + "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000777", + "electron-to-chromium": "1.3.27" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "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.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "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-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "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.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000777", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000777", + "electron-to-chromium": "1.3.27" + } + } + } + }, + "caniuse-db": { + "version": "1.0.30000777", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000777.tgz", + "integrity": "sha1-LhmtumO918UB32N6hirerX9LwFQ=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000777.tgz", + "integrity": "sha1-McGKSozUl4LrswXI6Kk+azs+TxM=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai-nightwatch": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz", + "integrity": "sha1-HKVt52jTwIaP5/wvTTLC/olOa+k=", + "dev": true, + "requires": { + "assertion-error": "1.0.0", + "deep-eql": "0.1.3" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "chromedriver": { + "version": "2.33.2", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.33.2.tgz", + "integrity": "sha512-etnQeM8Mqiys50ZB4IiuNqeB1WS2/EKFhVXwkPQ1qjzKMMAJUyrLjaRUcoZoHrbjGscnhBrWkRR+p3zcTGMhDg==", + "dev": true, + "requires": { + "del": "3.0.0", + "extract-zip": "1.6.6", + "kew": "0.7.0", + "mkdirp": "0.5.1", + "request": "2.83.0" + } + }, + "ci-info": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", + "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "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.3", + "safe-buffer": "5.1.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-spinners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", + "dev": true + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "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 + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "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 + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "1.0.3", + "color-convert": "1.9.1", + "color-string": "0.3.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "bytes": "3.0.0", + "compressible": "2.0.12", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-whitespace": "0.3.0", + "kind-of": "3.2.2" + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "dev": true, + "requires": { + "ini": "1.3.5", + "proto-list": "1.2.4" + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "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" + } + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "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 + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "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=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-cL/Wl3Y1QmmKThl/mWeGB+HH3YH+25tn8nhqEGsZda4Yn7GqGnDZ+TbeKJ7A6zvrxyNhhuviYAxn/tCyyAqh8Q==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "glob": "7.1.2", + "is-glob": "4.0.0", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "minimatch": "3.0.4" + }, + "dependencies": { + "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-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" + } + }, + "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.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "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=", + "dev": true + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "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.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "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.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5", + "randomfill": "1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", + "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.1.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" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.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.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + }, + "dependencies": { + "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.1.0", + "domelementtype": "1.3.0" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + } + } + }, + "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=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000777", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000777", + "electron-to-chromium": "1.3.27" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "1.2.3", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.37" + } + }, + "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-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true + }, + "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 + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "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 + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "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.11" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "escodegen": "1.9.0", + "esprima": "3.1.3" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "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.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", + "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + } + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "doctrine": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", + "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "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.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.3", + "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.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", + "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "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.1" + } + }, + "editorconfig": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", + "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "commander": "2.12.2", + "lru-cache": "3.2.0", + "semver": "5.4.1", + "sigmund": "1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "dev": true, + "requires": { + "pseudomap": "1.0.2" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.3.tgz", + "integrity": "sha1-24qsR/+Ap9+CtMgsEm/olwhwYm8=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "dev": true + }, + "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.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.1.tgz", + "integrity": "sha1-oyArj7AxFKqbQKDjZp5IsrZaAQo=", + "dev": true, + "requires": { + "stackframe": "1.0.4" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "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.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", + "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.5.7" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.2", + "escope": "3.6.0", + "espree": "3.5.2", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.7.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "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 + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true + }, + "eslint-friendly-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", + "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "coalescy": "1.0.0", + "extend": "3.0.1", + "minimist": "1.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-loader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "dev": true, + "requires": { + "loader-fs-cache": "1.0.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1", + "object-hash": "1.2.0", + "rimraf": "2.6.2" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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.1" + } + }, + "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.1.2" + } + } + } + }, + "eslint-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.2.tgz", + "integrity": "sha512-sSuafathF6ImPrzF2vUKEJY6Llq06d/riMTMzlsruDRDhNsQMYp2viUKo+jx+JRr1QevskeUpQcuptp2gN1XVQ==", + "dev": true, + "requires": { + "htmlparser2": "3.9.2", + "semver": "5.4.1" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "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 + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "eventsource-polyfill": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", + "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", + "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.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "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.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expect": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", + "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "jest-diff": "21.2.1", + "jest-get-type": "21.2.0", + "jest-matcher-utils": "21.2.1", + "jest-message-util": "21.2.1", + "jest-regex-util": "21.2.0" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "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.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.0" + } + }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "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" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-loader": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", + "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "filesize": { + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", + "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "dev": true, + "requires": { + "json5": "0.5.1", + "path-exists": "3.0.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.1.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-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "friendly-errors-webpack-plugin": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.6.1.tgz", + "integrity": "sha1-4yeBxHIvVGoGqbXXp8+ihSA3XXA=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "error-stack-parser": "2.0.1", + "string-length": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xregexp": "2.0.0" + }, + "dependencies": { + "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.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "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-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", + "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==", + "dev": true, + "requires": { + "data-uri-to-buffer": "1.2.0", + "debug": "2.6.9", + "extend": "3.0.1", + "file-uri-to-path": "1.0.0", + "ftp": "0.3.10", + "readable-stream": "2.3.3" + } + }, + "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.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "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 + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "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.5.0", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "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=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "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.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "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.3" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", + "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.12.2", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.2.0" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.7", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + }, + "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.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.6.2", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", + "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "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-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.1" + } + } + } + }, + "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.4.1", + "sshpk": "1.13.1" + } + }, + "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 + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "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=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "import-local": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", + "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", + "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 + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "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.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.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.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "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 + }, + "ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", + "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=", + "dev": true + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "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.11.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-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true, + "requires": { + "ci-info": "1.1.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-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "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-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "1.1.1" + } + }, + "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-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "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=", + "dev": true + }, + "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": "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" + } + }, + "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-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "dev": true, + "requires": { + "async": "2.6.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "jest": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", + "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", + "dev": true, + "requires": { + "jest-cli": "21.2.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", + "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "is-ci": "1.0.10", + "istanbul-api": "1.2.1", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-source-maps": "1.2.2", + "jest-changed-files": "21.2.0", + "jest-config": "21.2.1", + "jest-environment-jsdom": "21.2.1", + "jest-haste-map": "21.2.0", + "jest-message-util": "21.2.1", + "jest-regex-util": "21.2.0", + "jest-resolve-dependencies": "21.2.0", + "jest-runner": "21.2.1", + "jest-runtime": "21.2.1", + "jest-snapshot": "21.2.1", + "jest-util": "21.2.1", + "micromatch": "2.3.11", + "node-notifier": "5.1.2", + "pify": "3.0.0", + "slash": "1.0.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", + "which": "1.3.0", + "worker-farm": "1.5.2", + "yargs": "9.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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" + } + }, + "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" + } + } + } + }, + "jest-changed-files": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", + "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", + "dev": true, + "requires": { + "throat": "4.1.0" + } + }, + "jest-config": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", + "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "glob": "7.1.2", + "jest-environment-jsdom": "21.2.1", + "jest-environment-node": "21.2.1", + "jest-get-type": "21.2.0", + "jest-jasmine2": "21.2.1", + "jest-regex-util": "21.2.0", + "jest-resolve": "21.2.0", + "jest-util": "21.2.1", + "jest-validate": "21.2.1", + "pretty-format": "21.2.1" + } + }, + "jest-diff": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", + "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "diff": "3.4.0", + "jest-get-type": "21.2.0", + "pretty-format": "21.2.1" + } + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "jest-environment-jsdom": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", + "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", + "dev": true, + "requires": { + "jest-mock": "21.2.0", + "jest-util": "21.2.1", + "jsdom": "9.12.0" + } + }, + "jest-environment-node": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", + "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", + "dev": true, + "requires": { + "jest-mock": "21.2.0", + "jest-util": "21.2.1" + } + }, + "jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "dev": true + }, + "jest-haste-map": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", + "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", + "dev": true, + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "21.2.0", + "micromatch": "2.3.11", + "sane": "2.2.0", + "worker-farm": "1.5.2" + } + }, + "jest-jasmine2": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", + "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "expect": "21.2.1", + "graceful-fs": "4.1.11", + "jest-diff": "21.2.1", + "jest-matcher-utils": "21.2.1", + "jest-message-util": "21.2.1", + "jest-snapshot": "21.2.1", + "p-cancelable": "0.3.0" + } + }, + "jest-matcher-utils": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", + "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "jest-get-type": "21.2.0", + "pretty-format": "21.2.1" + } + }, + "jest-message-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", + "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "micromatch": "2.3.11", + "slash": "1.0.0" + } + }, + "jest-mock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", + "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", + "dev": true + }, + "jest-regex-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", + "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", + "dev": true + }, + "jest-resolve": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", + "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "chalk": "2.3.0", + "is-builtin-module": "1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", + "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", + "dev": true, + "requires": { + "jest-regex-util": "21.2.0" + } + }, + "jest-runner": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", + "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", + "dev": true, + "requires": { + "jest-config": "21.2.1", + "jest-docblock": "21.2.0", + "jest-haste-map": "21.2.0", + "jest-jasmine2": "21.2.1", + "jest-message-util": "21.2.1", + "jest-runtime": "21.2.1", + "jest-util": "21.2.1", + "pify": "3.0.0", + "throat": "4.1.0", + "worker-farm": "1.5.2" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "jest-runtime": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", + "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "21.2.0", + "babel-plugin-istanbul": "4.1.5", + "chalk": "2.3.0", + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "jest-config": "21.2.1", + "jest-haste-map": "21.2.0", + "jest-regex-util": "21.2.0", + "jest-resolve": "21.2.0", + "jest-util": "21.2.1", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "9.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer-vue": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-0.3.0.tgz", + "integrity": "sha512-Id1x3XabYu2r6BnmTfGk2tY172BEqR+vAzSvPk4VF8HyVqwebxZQbqiZ/giAtCnRSqi6lzxuyvzQbwQ6bo6Hbg==", + "dev": true, + "requires": { + "pretty": "2.0.0" + } + }, + "jest-snapshot": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", + "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "jest-diff": "21.2.1", + "jest-matcher-utils": "21.2.1", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "21.2.1" + } + }, + "jest-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", + "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.3.0", + "graceful-fs": "4.1.11", + "jest-message-util": "21.2.1", + "jest-mock": "21.2.0", + "jest-validate": "21.2.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "jest-get-type": "21.2.0", + "leven": "2.1.0", + "pretty-format": "21.2.1" + } + }, + "js-base64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", + "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", + "dev": true + }, + "js-beautify": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.4.tgz", + "integrity": "sha512-6YX1g+lIl0/JDxjFFbgj7fz6i0bWFa2Hdc7PfGqFhynaEiYe1NJ3R1nda0VGaRiGU82OllR+EGDoWFpGr3k5Kg==", + "dev": true, + "requires": { + "config-chain": "1.1.11", + "editorconfig": "0.13.3", + "mkdirp": "0.5.1", + "nopt": "3.0.6" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "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": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.9.0", + "html-encoding-sniffer": "1.0.2", + "nwmatcher": "1.4.3", + "parse5": "1.5.1", + "request": "2.83.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.3", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "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.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "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 + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "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" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "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.6" + } + }, + "last-call-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", + "dev": true, + "requires": { + "lodash": "4.17.4", + "webpack-sources": "1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "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" + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.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.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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.1" + } + }, + "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.1.2" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._stack": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz", + "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.clone": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", + "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=", + "dev": true, + "requires": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.defaultsdeep": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz", + "integrity": "sha1-bBpYbmxWR7DmTi15gUG4g2FYvoo=", + "dev": true, + "requires": { + "lodash._baseclone": "4.5.7", + "lodash._stack": "4.1.3", + "lodash.isplainobject": "4.0.6", + "lodash.keysin": "4.2.0", + "lodash.mergewith": "4.6.0", + "lodash.rest": "4.0.5" + }, + "dependencies": { + "lodash._baseclone": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", + "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", + "dev": true + } + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.keysin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz", + "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", + "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "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=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "macaddress": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", + "dev": true + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "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.4" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "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.4", + "inherits": "2.0.3" + }, + "dependencies": { + "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.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "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.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "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.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "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.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "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" + } + }, + "mkpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", + "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", + "dev": true + }, + "mocha-nightwatch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz", + "integrity": "sha1-kby5s73gV912d8eBJeSR5Y1mZHw=", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "glob": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz", + "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==", + "dev": true, + "requires": { + "dns-packet": "1.2.2", + "thunky": "0.1.0" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "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 + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "nightwatch": { + "version": "0.9.16", + "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.16.tgz", + "integrity": "sha1-xKw+xxGw/wR8PcqcZVc2XuI2UZ8=", + "dev": true, + "requires": { + "chai-nightwatch": "0.1.1", + "ejs": "0.8.3", + "lodash.clone": "3.0.3", + "lodash.defaultsdeep": "4.3.2", + "minimatch": "3.0.3", + "mkpath": "1.0.0", + "mocha-nightwatch": "3.2.2", + "optimist": "0.6.1", + "proxy-agent": "2.0.0", + "q": "1.4.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "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.4" + } + }, + "node-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.1.1.tgz", + "integrity": "sha1-CFJGRe5AOd7cPcwd18a5eeBhnkQ=", + "dev": true, + "requires": { + "clone": "2.1.1", + "lodash": "4.17.4" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + } + } + }, + "node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true + }, + "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.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "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.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "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.1" + } + }, + "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" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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 + }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", + "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", + "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=", + "dev": true + }, + "object-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz", + "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg==", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "1.1.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.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==", + "dev": true, + "requires": { + "cssnano": "3.10.0", + "last-call-webpack-plugin": "2.1.2" + } + }, + "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.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "ora": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", + "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-spinners": "1.1.0", + "log-symbols": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "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" + } + }, + "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.1.0" + } + }, + "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.1", + "signal-exit": "3.0.2" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "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-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "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" + } + }, + "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-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "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-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "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-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "pac-proxy-agent": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", + "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1", + "get-uri": "2.0.1", + "http-proxy-agent": "1.0.0", + "https-proxy-agent": "1.0.0", + "pac-resolver": "2.0.0", + "raw-body": "2.3.2", + "socks-proxy-agent": "2.1.1" + } + }, + "pac-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz", + "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=", + "dev": true, + "requires": { + "co": "3.0.6", + "degenerator": "1.0.4", + "ip": "1.0.1", + "netmask": "1.0.6", + "thunkify": "2.1.2" + }, + "dependencies": { + "co": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", + "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=", + "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 + }, + "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.3.2" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "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-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=", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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.4" + } + }, + "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" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "postcss": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "uniqs": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "uniqid": "4.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-import": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", + "integrity": "sha1-qWLi34LTvFptpqOGhBdHIE9B71s=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.5.0" + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-loader": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.9.tgz", + "integrity": "sha512-sgoXPtmgVT3aBAhU47Kig8oPF+mbXl8Unjvtz1Qj1q2D2EvSVJW2mKJNzxv5y/LvA9xWwuvdysvhc7Zn80UWWw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "postcss": "6.0.14", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000777", + "electron-to-chromium": "1.3.27" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "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=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.14" + } + }, + "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=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.14" + } + }, + "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=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.14" + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "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=", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "uniqs": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.0", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "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 + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", + "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "dev": true + }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "0.2.1", + "extend-shallow": "2.0.1", + "js-beautify": "1.7.4" + } + }, + "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.0" + } + }, + "pretty-format": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", + "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "dev": true, + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.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 + } + } + }, + "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": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "proxy-agent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz", + "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1", + "http-proxy-agent": "1.0.0", + "https-proxy-agent": "1.0.0", + "lru-cache": "2.6.5", + "pac-proxy-agent": "1.1.0", + "socks-proxy-agent": "2.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", + "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=", + "dev": true + } + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "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.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "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.1", + "strict-uri-encode": "1.1.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 + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "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.2.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.6" + } + } + } + }, + "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.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "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.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "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.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.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.3.0" + } + }, + "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.3.0" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + } + }, + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "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", + "hawk": "6.0.2", + "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", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "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-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "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 + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "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.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sane": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz", + "integrity": "sha512-OSJxhHO0CgPUw3lUm3GhfREAfza45smvEI9ozuFrxKG10GHVo0ryW9FK5VYlLvxj0SV7HVKHW0voYJIRu27GWg==", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "2.0.0", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.18.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-server": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.7.1.tgz", + "integrity": "sha512-yoJ32HBfAspt1PXpzVUBIaxuWcoLMv2Gmz2ZdrmsM1cfZH9pGHZ5jF4nEtrjLPN9wbcx9z/6q6aWBabJTrzlow==", + "dev": true + }, + "selfsigned": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", + "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "dev": true, + "requires": { + "node-forge": "0.6.33" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "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 + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "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 + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "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 + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.2.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + } + } + }, + "socks-proxy-agent": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", + "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "extend": "3.0.1", + "socks": "1.1.10" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.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==", + "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.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + } + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "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.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true, + "requires": { + "strip-ansi": "3.0.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "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-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "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": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "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 + }, + "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": { + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "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 + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "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-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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.1.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": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.0.tgz", + "integrity": "sha512-L98DlTshoPGnZGF8pr3MoE+CCo6n9joktHNHMPkckeBV8xTVc4CWtC0kGGhQsIvnX2Ug4nXFTAeE7SpTrPX2tg==", + "dev": true, + "requires": { + "commander": "2.12.2", + "source-map": "0.6.1" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqid": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "requires": { + "macaddress": "0.2.8" + } + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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 + }, + "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": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.3.6" + } + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "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" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true + }, + "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.3.0" + } + }, + "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" + } + }, + "vue": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.9.tgz", + "integrity": "sha512-9B9XBpCtj8y5eJFrspIcKxIWt+lG9FMdF8qgyOlUeOIvcS4xSAvcARygbzHA6Pi0KWFj4BvxjtWbuPVWRx/wuA==" + }, + "vue-hot-reload-api": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.2.4.tgz", + "integrity": "sha512-e+ThJMYmZg4D9UnrLcr6LQxGu6YlcxkrmZGPCyIN4malcNhdeGGKxmFuM5y6ICMJJxQywLfT8MM1rYZr4LpeLw==", + "dev": true + }, + "vue-jest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-1.2.0.tgz", + "integrity": "sha512-5uFOKROZIg3meZXbmmh/XnpVdrdqHEAYUFvJbUxcBoLRD9Y21eXmUEP4VTQ9qeGZ4Bb56ExWqisUPVRpVqgRUg==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-preset-vue-app": "1.3.2", + "chalk": "2.3.0", + "convert-source-map": "1.5.1", + "find-babel-config": "1.1.0", + "js-beautify": "1.7.4", + "node-cache": "4.1.1", + "object-assign": "4.1.1", + "source-map": "0.5.7", + "tsconfig": "7.0.0", + "vue-template-es2015-compiler": "1.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "vue-loader": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.5.0.tgz", + "integrity": "sha512-O0+ZU1oyLlDXSAQB7pV/pwVt3wJLfyhXtnGpCVFBGMKGC0Yp9Un7ULFHKejrFEYaMBKY0s6h4iJzjMdSngNA2g==", + "dev": true, + "requires": { + "consolidate": "0.14.5", + "hash-sum": "1.0.2", + "loader-utils": "1.1.0", + "lru-cache": "4.1.1", + "postcss": "6.0.14", + "postcss-load-config": "1.2.0", + "postcss-selector-parser": "2.2.3", + "prettier": "1.8.2", + "resolve": "1.5.0", + "source-map": "0.6.1", + "vue-hot-reload-api": "2.2.4", + "vue-style-loader": "3.0.3", + "vue-template-es2015-compiler": "1.6.0" + } + }, + "vue-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", + "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" + }, + "vue-style-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.0.3.tgz", + "integrity": "sha512-P/ihpaZKU23T1kq3E0y4c+F8sbm1HQO69EFYoLoGMSGVAHroHsGir/WQ9qUavP8dyFYHmXenzHaJ/nqd8vfaxw==", + "dev": true, + "requires": { + "hash-sum": "1.0.2", + "loader-utils": "1.1.0" + } + }, + "vue-template-compiler": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.9.tgz", + "integrity": "sha512-Icev7QPuQ3flpOvxMe09irgXPklBi/VpiveUDs5nRVH5GA8R9asLBlahsA7AuRZQbaty0cGKm6kh/icDLcr93w==", + "dev": true, + "requires": { + "de-indent": "1.0.2", + "he": "1.1.1" + } + }, + "vue-template-es2015-compiler": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", + "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", + "dev": true + }, + "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.11" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "0.2.1", + "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 + } + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" + } + }, + "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": "3.9.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.9.1.tgz", + "integrity": "sha512-jONJ0l8nqgiQVkqs15O9TFWLozbFkCgVodVrBXBK/PIBFeGkaOGo30Ov57iQqYRwAWNDM5vyLPZYmAIpPa5QSw==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.0", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "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": { + "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 + }, + "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" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.1.tgz", + "integrity": "sha512-a+UcvlsXvCmclNgfThT8PVyuJKd029By7CxkYEbNNCfs0Lqj9gagjkdv3S3MBvCIKBaUGYs8l4UpiVI0bFoh2Q==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "chalk": "1.1.3", + "commander": "2.12.2", + "ejs": "2.5.7", + "express": "4.16.2", + "filesize": "3.5.11", + "gzip-size": "3.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "opener": "1.4.3", + "ws": "3.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.5.tgz", + "integrity": "sha512-o0lS6enIxyOPiRJTh8vcgK5TsGNTn7lH1q/pNniAgs46mCE8sQYeqv7Y/oAIh/+u4kiBsFizLJo5EWC+ezz6FQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.1", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.2", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "0.1.1", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.0", + "opn": "5.1.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.1", + "serve-index": "1.9.1", + "sockjs": "0.3.18", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "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" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "requires": { + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "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 + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "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.5.2", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", + "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", + "dev": true, + "requires": { + "errno": "0.1.4", + "xtend": "4.0.1" + } + }, + "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.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "ws": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.2.tgz", + "integrity": "sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.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": { + "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 + }, + "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" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/myproj/package.json b/myproj/package.json new file mode 100644 index 0000000000..6686c0140a --- /dev/null +++ b/myproj/package.json @@ -0,0 +1,83 @@ +{ + "name": "myproj", + "version": "1.0.0", + "description": "A Vue.js project", + "author": "Bruce Lao", + "private": true, + "scripts": { + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev", + "unit": "jest --config test/unit/jest.conf.js --coverage", + "e2e": "node test/e2e/runner.js", + "test": "npm run unit && npm run e2e", + "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", + "build": "node build/build.js" + }, + "dependencies": { + "vue": "^2.5.2", + "vue-router": "^3.0.1" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^7.1.1", + "babel-jest": "^21.0.2", + "babel-loader": "^7.1.1", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^2.0.1", + "chromedriver": "^2.27.2", + "copy-webpack-plugin": "^4.0.1", + "cross-spawn": "^5.0.1", + "css-loader": "^0.28.0", + "eslint": "^3.19.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-html": "^3.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "eventsource-polyfill": "^0.9.6", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "jest": "^21.2.0", + "jest-serializer-vue": "^0.3.0", + "nightwatch": "^0.9.12", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "rimraf": "^2.6.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "url-loader": "^0.5.8", + "vue-jest": "^1.0.2", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.5", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/myproj/src/App.vue b/myproj/src/App.vue new file mode 100644 index 0000000000..029fb96ac1 --- /dev/null +++ b/myproj/src/App.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/myproj/src/assets/imdb-bidirectional-lstm.png b/myproj/src/assets/imdb-bidirectional-lstm.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6155ae74618054834f2fb2fd0d3e36d43b1bd2 GIT binary patch literal 150415 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 z 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%0Augwv%92){#0_FL7#{ezW3JaL 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 Y9^{-G-yr<7hk%#reNE+}d(U704^wW?p#T5? literal 0 HcmV?d00001 diff --git a/myproj/src/assets/logo.png b/myproj/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 L(%r(_CeQvCdB=8e literal 0 HcmV?d00001 diff --git a/myproj/src/assets/mnist-cnn.png b/myproj/src/assets/mnist-cnn.png new file mode 100644 index 0000000000000000000000000000000000000000..ce33fd6c7f158e8b1ac1d3517f417e0d95f16153 GIT binary patch literal 51719 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

vs$LQ1)+l%|97qMw+X$Hb6 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�|Z@|JHEVhaLh0P;NjX30012H3>Gsh+xF?t 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%0AoOH1IEj~3G^JVnV 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 LCFwFL;}8D>zKP{* literal 0 HcmV?d00001 diff --git a/myproj/src/assets/resnet50.png b/myproj/src/assets/resnet50.png new file mode 100644 index 0000000000000000000000000000000000000000..b4116d753ab50dd373772e704cc307cd0ae748b4 GIT binary patch literal 148764 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

+ + + + + + diff --git a/myproj/src/components/Home.vue b/myproj/src/components/Home.vue new file mode 100644 index 0000000000..482da9bdea --- /dev/null +++ b/myproj/src/components/Home.vue @@ -0,0 +1,94 @@ + + + + + \ No newline at end of file diff --git a/myproj/src/main.js b/myproj/src/main.js new file mode 100644 index 0000000000..ec10971436 --- /dev/null +++ b/myproj/src/main.js @@ -0,0 +1,15 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import App from './App' +import router from './router' + +Vue.config.productionTip = false + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + template: '', + components: { App } +}) diff --git a/myproj/src/router/index.js b/myproj/src/router/index.js new file mode 100644 index 0000000000..e551e3b396 --- /dev/null +++ b/myproj/src/router/index.js @@ -0,0 +1,17 @@ +import Vue from 'vue' +import Router from 'vue-router' +import HelloWorld from '../components/HelloWorld' +import {Home} from '../components/Home' + +Vue.use(Router) + +export default new Router({ + routes: [ + { path: '/', component: Home }, + { path: '/HelloWorld', name: 'HelloWorld', component: HelloWorld } + // { path: '/mnist-cnn', component: MnistCnn }, + // { path: '/mnist-vae', component: MnistVae }, + // { path: '/mnist-acgan', component: MnistAcgan }, + // { path: '/resnet50', component: Resnet50 }, + ] +}) diff --git a/myproj/src/variables.css b/myproj/src/variables.css new file mode 100644 index 0000000000..533d09a8b4 --- /dev/null +++ b/myproj/src/variables.css @@ -0,0 +1,15 @@ +:root { + --color-green: #1bbc9b; + --color-green-light: rgba(27, 188, 155, 0.6); + --color-green-lighter: rgba(27, 188, 155, 0.3); + --color-lightgray: #69707a; + --color-darkgray: #393e46; + --color-yellow: #f5d76e; + --color-red: #f22613; + --color-error: #d24d57; + + --font-sans-serif: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', + 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + --font-monospace: 'Share Tech Mono', monospace; + --font-cursive: 'Nothing You Could Do', cursive; +} diff --git a/myproj/static/.gitkeep b/myproj/static/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/myproj/test/e2e/custom-assertions/elementCount.js b/myproj/test/e2e/custom-assertions/elementCount.js new file mode 100644 index 0000000000..364e7a469b --- /dev/null +++ b/myproj/test/e2e/custom-assertions/elementCount.js @@ -0,0 +1,27 @@ +// A custom Nightwatch assertion. +// The assertion name is the filename. +// Example usage: +// +// browser.assert.elementCount(selector, count) +// +// For more information on custom assertions see: +// http://nightwatchjs.org/guide#writing-custom-assertions + +exports.assertion = function (selector, count) { + this.message = 'Testing if element <' + selector + '> has count: ' + count + this.expected = count + this.pass = function (val) { + return val === this.expected + } + this.value = function (res) { + return res.value + } + this.command = function (cb) { + var self = this + return this.api.execute(function (selectorToCount) { + return document.querySelectorAll(selectorToCount).length + }, [selector], function (res) { + cb.call(self, res) + }) + } +} diff --git a/myproj/test/e2e/nightwatch.conf.js b/myproj/test/e2e/nightwatch.conf.js new file mode 100644 index 0000000000..f019c0ac44 --- /dev/null +++ b/myproj/test/e2e/nightwatch.conf.js @@ -0,0 +1,46 @@ +require('babel-register') +var config = require('../../config') + +// http://nightwatchjs.org/gettingstarted#settings-file +module.exports = { + src_folders: ['test/e2e/specs'], + output_folder: 'test/e2e/reports', + custom_assertions_path: ['test/e2e/custom-assertions'], + + selenium: { + start_process: true, + server_path: require('selenium-server').path, + host: '127.0.0.1', + port: 4444, + cli_args: { + 'webdriver.chrome.driver': require('chromedriver').path + } + }, + + test_settings: { + default: { + selenium_port: 4444, + selenium_host: 'localhost', + silent: true, + globals: { + devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) + } + }, + + chrome: { + desiredCapabilities: { + browserName: 'chrome', + javascriptEnabled: true, + acceptSslCerts: true + } + }, + + firefox: { + desiredCapabilities: { + browserName: 'firefox', + javascriptEnabled: true, + acceptSslCerts: true + } + } + } +} diff --git a/myproj/test/e2e/runner.js b/myproj/test/e2e/runner.js new file mode 100644 index 0000000000..3a02f8e96f --- /dev/null +++ b/myproj/test/e2e/runner.js @@ -0,0 +1,48 @@ +// 1. start the dev server using production config +process.env.NODE_ENV = 'testing' + +const webpack = require('webpack') +const DevServer = require('webpack-dev-server') + +const webpackConfig = require('../../build/webpack.prod.conf') +const devConfigPromise = require('../../build/webpack.dev.conf') + +let server + +devConfigPromise.then(devConfig => { + const devServerOptions = devConfig.devServer + const compiler = webpack(webpackConfig) + server = new DevServer(compiler, devServerOptions) + const port = devServerOptions.port + const host = devServerOptions.host + return server.listen(port, host) +}) +.then(() => { + // 2. run the nightwatch test suite against it + // to run in additional browsers: + // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" + // 2. add it to the --env flag below + // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` + // For more information on Nightwatch's config file, see + // http://nightwatchjs.org/guide#settings-file + let opts = process.argv.slice(2) + if (opts.indexOf('--config') === -1) { + opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) + } + if (opts.indexOf('--env') === -1) { + opts = opts.concat(['--env', 'chrome']) + } + + const spawn = require('cross-spawn') + const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) + + runner.on('exit', function (code) { + server.close() + process.exit(code) + }) + + runner.on('error', function (err) { + server.close() + throw err + }) +}) diff --git a/myproj/test/e2e/specs/test.js b/myproj/test/e2e/specs/test.js new file mode 100644 index 0000000000..a7b1bd920f --- /dev/null +++ b/myproj/test/e2e/specs/test.js @@ -0,0 +1,19 @@ +// For authoring Nightwatch tests, see +// http://nightwatchjs.org/guide#usage + +module.exports = { + 'default e2e tests': function (browser) { + // automatically uses dev Server port from /config.index.js + // default: http://localhost:8080 + // see nightwatch.conf.js + const devServer = browser.globals.devServerURL + + browser + .url(devServer) + .waitForElementVisible('#app', 5000) + .assert.elementPresent('.hello') + .assert.containsText('h1', 'Welcome to Your Vue.js App') + .assert.elementCount('img', 1) + .end() + } +} diff --git a/myproj/test/unit/.eslintrc b/myproj/test/unit/.eslintrc new file mode 100644 index 0000000000..4d5d98f3e6 --- /dev/null +++ b/myproj/test/unit/.eslintrc @@ -0,0 +1,7 @@ +{ + "env": { + "jest": true + }, + "globals": { + } +} diff --git a/myproj/test/unit/jest.conf.js b/myproj/test/unit/jest.conf.js new file mode 100644 index 0000000000..4f7da1519d --- /dev/null +++ b/myproj/test/unit/jest.conf.js @@ -0,0 +1,30 @@ +const path = require('path') + +module.exports = { + rootDir: path.resolve(__dirname, '../../'), + moduleFileExtensions: [ + 'js', + 'json', + 'vue' + ], + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + transform: { + '^.+\\.js$': '/node_modules/babel-jest', + '.*\\.(vue)$': '/node_modules/vue-jest' + }, + testPathIgnorePatterns: [ + '/test/e2e' + ], + snapshotSerializers: ['/node_modules/jest-serializer-vue'], + setupFiles: ['/test/unit/setup'], + mapCoverage: true, + coverageDirectory: '/test/unit/coverage', + collectCoverageFrom: [ + 'src/**/*.{js,vue}', + '!src/main.js', + '!src/router/index.js', + '!**/node_modules/**' + ] +} diff --git a/myproj/test/unit/setup.js b/myproj/test/unit/setup.js new file mode 100644 index 0000000000..edbdbae81e --- /dev/null +++ b/myproj/test/unit/setup.js @@ -0,0 +1,3 @@ +import Vue from 'vue' + +Vue.config.productionTip = false diff --git a/myproj/test/unit/specs/HelloWorld.spec.js b/myproj/test/unit/specs/HelloWorld.spec.js new file mode 100644 index 0000000000..d3e6a58e98 --- /dev/null +++ b/myproj/test/unit/specs/HelloWorld.spec.js @@ -0,0 +1,11 @@ +import Vue from 'vue' +import HelloWorld from '@/components/HelloWorld' + +describe('HelloWorld.vue', () => { + it('should render correct contents', () => { + const Constructor = Vue.extend(HelloWorld) + const vm = new Constructor().$mount() + expect(vm.$el.querySelector('.hello h1').textContent) + .toEqual('Welcome to Your Vue.js App') + }) +}) From fe1231926ed6d6e335aba71097048e9606ac901a Mon Sep 17 00:00:00 2001 From: Bruce Lao Date: Sat, 2 Dec 2017 01:01:53 -0800 Subject: [PATCH 02/11] temp save --- .vscode/settings.json | 3 +++ myproj/.eslintrc.js | 5 +++++ myproj/index.html | 2 +- myproj/src/App.vue | 3 ++- myproj/src/components/Home.vue | 17 +++++++++-------- myproj/src/main.js | 6 +++--- myproj/src/router/index.js | 9 ++++++--- 7 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..544b7b4ddd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/myproj/.eslintrc.js b/myproj/.eslintrc.js index e0dd62d911..bdc9487582 100644 --- a/myproj/.eslintrc.js +++ b/myproj/.eslintrc.js @@ -17,6 +17,11 @@ module.exports = { ], // add your custom rules here 'rules': { + + "indent": "off", + + "space-before-blocks": "off", + // allow paren-less arrow functions 'arrow-parens': 0, // allow async-await diff --git a/myproj/index.html b/myproj/index.html index 3113802fb7..aa1bd0a242 100644 --- a/myproj/index.html +++ b/myproj/index.html @@ -6,7 +6,7 @@ myproj -
+
diff --git a/myproj/src/App.vue b/myproj/src/App.vue index 029fb96ac1..35f32805fe 100644 --- a/myproj/src/App.vue +++ b/myproj/src/App.vue @@ -1,6 +1,7 @@ diff --git a/myproj/src/components/Home.vue b/myproj/src/components/Home.vue index 482da9bdea..d3a3d7f810 100644 --- a/myproj/src/components/Home.vue +++ b/myproj/src/components/Home.vue @@ -1,16 +1,17 @@ diff --git a/myproj/src/main.js b/myproj/src/main.js index ec10971436..820f60e4e7 100644 --- a/myproj/src/main.js +++ b/myproj/src/main.js @@ -2,14 +2,14 @@ // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' -import router from './router' +import router2 from './router' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ - el: '#app', - router, + el: '#root', + router2, template: '', components: { App } }) diff --git a/myproj/src/router/index.js b/myproj/src/router/index.js index e551e3b396..4d2601c772 100644 --- a/myproj/src/router/index.js +++ b/myproj/src/router/index.js @@ -1,17 +1,20 @@ import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '../components/HelloWorld' -import {Home} from '../components/Home' +import Home from '../components/Home' Vue.use(Router) -export default new Router({ +const routes2 = new Router({ routes: [ { path: '/', component: Home }, - { path: '/HelloWorld', name: 'HelloWorld', component: HelloWorld } + { path: '/HelloWorld', name: 'HelloWorld', component: HelloWorld }, + { path: '/Home', name: 'Home', component: Home } // { path: '/mnist-cnn', component: MnistCnn }, // { path: '/mnist-vae', component: MnistVae }, // { path: '/mnist-acgan', component: MnistAcgan }, // { path: '/resnet50', component: Resnet50 }, ] }) + +export default {routes2}; From 44026386118e3f9405472b8fded8a2afffe46899 Mon Sep 17 00:00:00 2001 From: Bruce Lao Date: Mon, 4 Dec 2017 04:22:39 -0800 Subject: [PATCH 03/11] temp save (not working) --- .babelrc.js | 25 + lib/Layer.js | 55 + lib/Model.js | 493 ++ lib/Tensor.js | 386 ++ lib/WebGL2.js | 281 + lib/activations/elu.js | 25 + lib/activations/hard_sigmoid.js | 27 + lib/activations/index.js | 87 + lib/activations/linear.js | 10 + lib/activations/programSources.js | 26 + lib/activations/relu.js | 38 + lib/activations/selu.js | 23 + lib/activations/sigmoid.js | 21 + lib/activations/softmax.js | 38 + lib/activations/softplus.js | 21 + lib/activations/softsign.js | 21 + lib/activations/tanh.js | 21 + lib/ask.js | 67 - lib/check-version.js | 31 - lib/eval.js | 16 - lib/filter.js | 20 - lib/generate.js | 158 - lib/git-user.js | 15 - lib/index.js | 45 + lib/layers/InputLayer.js | 83 + lib/layers/advanced_activations/ELU.js | 126 + lib/layers/advanced_activations/LeakyReLU.js | 110 + lib/layers/advanced_activations/PReLU.js | 115 + .../advanced_activations/ThresholdedReLU.js | 126 + lib/layers/advanced_activations/index.js | 39 + lib/layers/convolutional/Conv1D.js | 118 + lib/layers/convolutional/Conv2D.js | 457 ++ lib/layers/convolutional/Conv2DTranspose.js | 471 ++ lib/layers/convolutional/Conv3D.js | 476 ++ lib/layers/convolutional/Cropping1D.js | 143 + lib/layers/convolutional/Cropping2D.js | 144 + lib/layers/convolutional/Cropping3D.js | 144 + lib/layers/convolutional/SeparableConv2D.js | 366 ++ lib/layers/convolutional/UpSampling1D.js | 140 + lib/layers/convolutional/UpSampling2D.js | 149 + lib/layers/convolutional/UpSampling3D.js | 153 + lib/layers/convolutional/ZeroPadding1D.js | 145 + lib/layers/convolutional/ZeroPadding2D.js | 146 + lib/layers/convolutional/ZeroPadding3D.js | 146 + lib/layers/convolutional/index.js | 119 + lib/layers/core/Activation.js | 111 + lib/layers/core/Dense.js | 144 + lib/layers/core/Dropout.js | 29 + lib/layers/core/Flatten.js | 128 + lib/layers/core/Permute.js | 194 + lib/layers/core/RepeatVector.js | 87 + lib/layers/core/Reshape.js | 180 + lib/layers/core/SpatialDropout1D.js | 29 + lib/layers/core/SpatialDropout2D.js | 31 + lib/layers/core/SpatialDropout3D.js | 31 + lib/layers/core/index.js | 87 + lib/layers/embeddings/Embedding.js | 94 + lib/layers/embeddings/index.js | 15 + lib/layers/index.js | 148 + lib/layers/merge/Add.js | 48 + lib/layers/merge/Average.js | 50 + lib/layers/merge/Concatenate.js | 143 + lib/layers/merge/Dot.js | 159 + lib/layers/merge/Maximum.js | 50 + lib/layers/merge/Minimum.js | 50 + lib/layers/merge/Multiply.js | 50 + lib/layers/merge/Subtract.js | 50 + lib/layers/merge/_Merge.js | 144 + lib/layers/merge/index.js | 71 + lib/layers/noise/GaussianDropout.js | 29 + lib/layers/noise/GaussianNoise.js | 29 + lib/layers/noise/index.js | 23 + .../normalization/BatchNormalization.js | 272 + lib/layers/normalization/index.js | 15 + lib/layers/pooling/AveragePooling1D.js | 21 + lib/layers/pooling/AveragePooling2D.js | 21 + lib/layers/pooling/AveragePooling3D.js | 21 + lib/layers/pooling/GlobalAveragePooling1D.js | 21 + lib/layers/pooling/GlobalAveragePooling2D.js | 21 + lib/layers/pooling/GlobalAveragePooling3D.js | 21 + lib/layers/pooling/GlobalMaxPooling1D.js | 21 + lib/layers/pooling/GlobalMaxPooling2D.js | 21 + lib/layers/pooling/GlobalMaxPooling3D.js | 21 + lib/layers/pooling/MaxPooling1D.js | 21 + lib/layers/pooling/MaxPooling2D.js | 21 + lib/layers/pooling/MaxPooling3D.js | 21 + lib/layers/pooling/_GlobalPooling1D.js | 103 + lib/layers/pooling/_GlobalPooling2D.js | 113 + lib/layers/pooling/_GlobalPooling3D.js | 113 + lib/layers/pooling/_Pooling1D.js | 210 + lib/layers/pooling/_Pooling2D.js | 338 ++ lib/layers/pooling/_Pooling3D.js | 359 ++ lib/layers/pooling/index.js | 103 + lib/layers/recurrent/GRU.js | 682 +++ lib/layers/recurrent/LSTM.js | 833 +++ lib/layers/recurrent/SimpleRNN.js | 355 ++ lib/layers/recurrent/index.js | 31 + lib/layers/wrappers/Bidirectional.js | 210 + lib/layers/wrappers/TimeDistributed.js | 409 ++ lib/layers/wrappers/index.js | 23 + lib/local-path.js | 13 - lib/logger.js | 44 - lib/options.js | 89 - lib/proto.js | 352 ++ lib/utils/tensorUtils.js | 89 + lib/utils/testUtils.js | 35 + lib/visualizations/CAM.js | 172 + lib/visualizations/index.js | 15 + lib/warnings.js | 20 - lib/webgl/dynamic/convolutional/conv2d.js | 44 + .../dynamic/convolutional/conv2dTranspose.js | 43 + lib/webgl/dynamic/createGLSLProgram.js | 65 + lib/webgl/dynamic/merge/add.js | 28 + lib/webgl/dynamic/merge/average.js | 28 + lib/webgl/dynamic/merge/concatenate.js | 67 + lib/webgl/dynamic/merge/maximum.js | 29 + lib/webgl/dynamic/merge/minimum.js | 29 + lib/webgl/dynamic/merge/multiply.js | 28 + lib/webgl/dynamic/merge/subtract.js | 24 + lib/webgl/dynamic/visualizations/cam.js | 62 + myproj/.babelrc | 7 +- myproj/.eslintrc.js | 6 + myproj/build/webpack.base.conf.js | 7 + myproj/index.html | 2 +- myproj/package-lock.json | 5258 ++++++----------- myproj/package.json | 74 +- myproj/postcss.config.js | 3 + myproj/src/App.vue | 24 - myproj/src/App2.vue | 54 + myproj/src/assets/logo-V.png | Bin 0 -> 6849 bytes myproj/src/assets/logo.png | Bin 6849 -> 15539 bytes myproj/src/assets/logo.svg | 14 + myproj/src/components/Home.vue | 4 +- myproj/src/components/NavDrawer.vue | 161 + myproj/src/components/RightContent.vue | 0 .../components/{ => models}/HelloWorld.vue | 0 myproj/src/components/models/MnistCnn.vue | 473 ++ myproj/src/data/DemoModels.js | 9 + myproj/src/main.js | 21 +- myproj/src/router/index.js | 13 +- myproj/src/utils/imagenet.js | 1002 ++++ myproj/src/utils/index.js | 196 + myproj/webpack.config.js | 68 + package-lock.json | 3279 +++++++++- package.json | 33 +- src/Layer.js | 73 + src/Model.js | 617 ++ src/Tensor.js | 420 ++ src/WebGL2.js | 329 ++ src/activations/elu.glsl | 12 + src/activations/elu.js | 19 + src/activations/hard_sigmoid.glsl | 14 + src/activations/hard_sigmoid.js | 24 + src/activations/index.js | 12 + src/activations/linear.glsl | 10 + src/activations/linear.js | 8 + src/activations/programSources.js | 21 + src/activations/relu.glsl | 11 + src/activations/relu.js | 25 + src/activations/selu.glsl | 13 + src/activations/selu.js | 19 + src/activations/sigmoid.glsl | 10 + src/activations/sigmoid.js | 17 + src/activations/softmax.glsl | 28 + src/activations/softmax.js | 26 + src/activations/softplus.glsl | 10 + src/activations/softplus.js | 17 + src/activations/softsign.glsl | 12 + src/activations/softsign.js | 17 + src/activations/tanh.glsl | 11 + src/activations/tanh.js | 17 + src/index.js | 11 + src/layers/InputLayer.js | 82 + src/layers/advanced_activations/ELU.glsl | 12 + src/layers/advanced_activations/ELU.js | 107 + .../advanced_activations/LeakyReLU.glsl | 12 + src/layers/advanced_activations/LeakyReLU.js | 100 + src/layers/advanced_activations/PReLU.glsl | 13 + src/layers/advanced_activations/PReLU.js | 111 + .../advanced_activations/ThresholdedReLU.glsl | 12 + .../advanced_activations/ThresholdedReLU.js | 107 + src/layers/advanced_activations/index.js | 6 + src/layers/convolutional/Conv1D.js | 132 + src/layers/convolutional/Conv2D.js | 487 ++ src/layers/convolutional/Conv2DTranspose.js | 509 ++ src/layers/convolutional/Conv3D.js | 545 ++ src/layers/convolutional/Cropping1D.js | 125 + src/layers/convolutional/Cropping2D.js | 166 + src/layers/convolutional/Cropping3D.js | 184 + src/layers/convolutional/SeparableConv2D.js | 360 ++ src/layers/convolutional/UpSampling1D.js | 119 + src/layers/convolutional/UpSampling2D.js | 144 + src/layers/convolutional/UpSampling3D.js | 165 + src/layers/convolutional/ZeroPadding1D.js | 126 + src/layers/convolutional/ZeroPadding2D.js | 167 + src/layers/convolutional/ZeroPadding3D.js | 185 + src/layers/convolutional/index.js | 31 + src/layers/core/Activation.js | 105 + src/layers/core/Dense.js | 122 + src/layers/core/Dropout.js | 34 + src/layers/core/Flatten.fragments.glsl | 20 + src/layers/core/Flatten.glsl | 17 + src/layers/core/Flatten.js | 109 + src/layers/core/Permute.js | 166 + src/layers/core/RepeatVector.glsl | 10 + src/layers/core/RepeatVector.js | 87 + src/layers/core/Reshape.js | 156 + src/layers/core/SpatialDropout1D.js | 34 + src/layers/core/SpatialDropout2D.js | 36 + src/layers/core/SpatialDropout3D.js | 36 + src/layers/core/index.js | 23 + src/layers/embeddings/Embedding.glsl | 17 + src/layers/embeddings/Embedding.js | 92 + src/layers/embeddings/index.js | 3 + src/layers/index.js | 13 + src/layers/merge/Add.js | 50 + src/layers/merge/Average.js | 51 + src/layers/merge/Concatenate.js | 139 + src/layers/merge/Dot.glsl | 47 + src/layers/merge/Dot.js | 133 + src/layers/merge/Maximum.js | 51 + src/layers/merge/Minimum.js | 51 + src/layers/merge/Multiply.js | 51 + src/layers/merge/Subtract.js | 52 + src/layers/merge/_Merge.js | 135 + src/layers/merge/index.js | 10 + src/layers/noise/GaussianDropout.js | 34 + src/layers/noise/GaussianNoise.js | 33 + src/layers/noise/index.js | 4 + .../normalization/BatchNormalization.glsl | 41 + .../normalization/BatchNormalization.js | 224 + src/layers/normalization/index.js | 3 + src/layers/pooling/AveragePooling1D.js | 16 + src/layers/pooling/AveragePooling2D.js | 16 + src/layers/pooling/AveragePooling3D.js | 16 + src/layers/pooling/GlobalAveragePooling1D.js | 16 + src/layers/pooling/GlobalAveragePooling2D.js | 16 + src/layers/pooling/GlobalAveragePooling3D.js | 16 + src/layers/pooling/GlobalMaxPooling1D.js | 16 + src/layers/pooling/GlobalMaxPooling2D.js | 16 + src/layers/pooling/GlobalMaxPooling3D.js | 16 + src/layers/pooling/MaxPooling1D.js | 16 + src/layers/pooling/MaxPooling2D.js | 16 + src/layers/pooling/MaxPooling3D.js | 16 + src/layers/pooling/_GlobalPooling.glsl | 34 + src/layers/pooling/_GlobalPooling1D.js | 100 + src/layers/pooling/_GlobalPooling2D.js | 112 + src/layers/pooling/_GlobalPooling3D.js | 112 + src/layers/pooling/_Pooling.fragments.glsl | 43 + src/layers/pooling/_Pooling.glsl | 39 + src/layers/pooling/_Pooling1D.js | 195 + src/layers/pooling/_Pooling2D.js | 343 ++ src/layers/pooling/_Pooling3D.js | 407 ++ src/layers/pooling/index.js | 27 + src/layers/recurrent/GRU.js | 520 ++ src/layers/recurrent/GRU.update.glsl | 20 + src/layers/recurrent/LSTM.js | 629 ++ src/layers/recurrent/LSTM.update.glsl | 22 + src/layers/recurrent/SimpleRNN.js | 292 + src/layers/recurrent/gateProduct.glsl | 18 + src/layers/recurrent/gateSummation.glsl | 20 + src/layers/recurrent/index.js | 5 + src/layers/recurrent/timestepRead.glsl | 14 + src/layers/recurrent/timestepWrite.glsl | 20 + src/layers/wrappers/Bidirectional.ave.glsl | 18 + src/layers/wrappers/Bidirectional.concat.glsl | 19 + src/layers/wrappers/Bidirectional.js | 190 + src/layers/wrappers/Bidirectional.mul.glsl | 18 + src/layers/wrappers/Bidirectional.sum.glsl | 18 + .../TimeDistributed.copySliceOutput.glsl | 21 + src/layers/wrappers/TimeDistributed.js | 301 + .../TimeDistributed.mapSliceOutput.glsl | 26 + .../wrappers/TimeDistributed.selectSlice.glsl | 14 + src/layers/wrappers/index.js | 4 + src/proto.js | 676 +++ src/utils/tensorUtils.js | 89 + src/utils/testUtils.js | 29 + src/visualizations/CAM.js | 154 + src/visualizations/index.js | 3 + src/webgl/copyTexture.glsl | 10 + src/webgl/dynamic/convolutional/conv2d.js | 51 + .../dynamic/convolutional/conv2dTranspose.js | 50 + src/webgl/dynamic/createGLSLProgram.js | 43 + src/webgl/dynamic/merge/add.js | 28 + src/webgl/dynamic/merge/average.js | 28 + src/webgl/dynamic/merge/concatenate.js | 63 + src/webgl/dynamic/merge/maximum.js | 29 + src/webgl/dynamic/merge/minimum.js | 29 + src/webgl/dynamic/merge/multiply.js | 28 + src/webgl/dynamic/merge/subtract.js | 24 + src/webgl/dynamic/visualizations/cam.js | 70 + src/webgl/mapInput.fragments.glsl | 30 + src/webgl/mapInput.glsl | 26 + src/webgl/matMul.glsl | 30 + src/webgl/vertexShader.glsl | 11 + webpack.config.js | 15 + 296 files changed, 33679 insertions(+), 4104 deletions(-) create mode 100644 .babelrc.js create mode 100644 lib/Layer.js create mode 100644 lib/Model.js create mode 100644 lib/Tensor.js create mode 100644 lib/WebGL2.js create mode 100644 lib/activations/elu.js create mode 100644 lib/activations/hard_sigmoid.js create mode 100644 lib/activations/index.js create mode 100644 lib/activations/linear.js create mode 100644 lib/activations/programSources.js create mode 100644 lib/activations/relu.js create mode 100644 lib/activations/selu.js create mode 100644 lib/activations/sigmoid.js create mode 100644 lib/activations/softmax.js create mode 100644 lib/activations/softplus.js create mode 100644 lib/activations/softsign.js create mode 100644 lib/activations/tanh.js delete mode 100644 lib/ask.js delete mode 100644 lib/check-version.js delete mode 100644 lib/eval.js delete mode 100644 lib/filter.js delete mode 100644 lib/generate.js delete mode 100644 lib/git-user.js create mode 100644 lib/index.js create mode 100644 lib/layers/InputLayer.js create mode 100644 lib/layers/advanced_activations/ELU.js create mode 100644 lib/layers/advanced_activations/LeakyReLU.js create mode 100644 lib/layers/advanced_activations/PReLU.js create mode 100644 lib/layers/advanced_activations/ThresholdedReLU.js create mode 100644 lib/layers/advanced_activations/index.js create mode 100644 lib/layers/convolutional/Conv1D.js create mode 100644 lib/layers/convolutional/Conv2D.js create mode 100644 lib/layers/convolutional/Conv2DTranspose.js create mode 100644 lib/layers/convolutional/Conv3D.js create mode 100644 lib/layers/convolutional/Cropping1D.js create mode 100644 lib/layers/convolutional/Cropping2D.js create mode 100644 lib/layers/convolutional/Cropping3D.js create mode 100644 lib/layers/convolutional/SeparableConv2D.js create mode 100644 lib/layers/convolutional/UpSampling1D.js create mode 100644 lib/layers/convolutional/UpSampling2D.js create mode 100644 lib/layers/convolutional/UpSampling3D.js create mode 100644 lib/layers/convolutional/ZeroPadding1D.js create mode 100644 lib/layers/convolutional/ZeroPadding2D.js create mode 100644 lib/layers/convolutional/ZeroPadding3D.js create mode 100644 lib/layers/convolutional/index.js create mode 100644 lib/layers/core/Activation.js create mode 100644 lib/layers/core/Dense.js create mode 100644 lib/layers/core/Dropout.js create mode 100644 lib/layers/core/Flatten.js create mode 100644 lib/layers/core/Permute.js create mode 100644 lib/layers/core/RepeatVector.js create mode 100644 lib/layers/core/Reshape.js create mode 100644 lib/layers/core/SpatialDropout1D.js create mode 100644 lib/layers/core/SpatialDropout2D.js create mode 100644 lib/layers/core/SpatialDropout3D.js create mode 100644 lib/layers/core/index.js create mode 100644 lib/layers/embeddings/Embedding.js create mode 100644 lib/layers/embeddings/index.js create mode 100644 lib/layers/index.js create mode 100644 lib/layers/merge/Add.js create mode 100644 lib/layers/merge/Average.js create mode 100644 lib/layers/merge/Concatenate.js create mode 100644 lib/layers/merge/Dot.js create mode 100644 lib/layers/merge/Maximum.js create mode 100644 lib/layers/merge/Minimum.js create mode 100644 lib/layers/merge/Multiply.js create mode 100644 lib/layers/merge/Subtract.js create mode 100644 lib/layers/merge/_Merge.js create mode 100644 lib/layers/merge/index.js create mode 100644 lib/layers/noise/GaussianDropout.js create mode 100644 lib/layers/noise/GaussianNoise.js create mode 100644 lib/layers/noise/index.js create mode 100644 lib/layers/normalization/BatchNormalization.js create mode 100644 lib/layers/normalization/index.js create mode 100644 lib/layers/pooling/AveragePooling1D.js create mode 100644 lib/layers/pooling/AveragePooling2D.js create mode 100644 lib/layers/pooling/AveragePooling3D.js create mode 100644 lib/layers/pooling/GlobalAveragePooling1D.js create mode 100644 lib/layers/pooling/GlobalAveragePooling2D.js create mode 100644 lib/layers/pooling/GlobalAveragePooling3D.js create mode 100644 lib/layers/pooling/GlobalMaxPooling1D.js create mode 100644 lib/layers/pooling/GlobalMaxPooling2D.js create mode 100644 lib/layers/pooling/GlobalMaxPooling3D.js create mode 100644 lib/layers/pooling/MaxPooling1D.js create mode 100644 lib/layers/pooling/MaxPooling2D.js create mode 100644 lib/layers/pooling/MaxPooling3D.js create mode 100644 lib/layers/pooling/_GlobalPooling1D.js create mode 100644 lib/layers/pooling/_GlobalPooling2D.js create mode 100644 lib/layers/pooling/_GlobalPooling3D.js create mode 100644 lib/layers/pooling/_Pooling1D.js create mode 100644 lib/layers/pooling/_Pooling2D.js create mode 100644 lib/layers/pooling/_Pooling3D.js create mode 100644 lib/layers/pooling/index.js create mode 100644 lib/layers/recurrent/GRU.js create mode 100644 lib/layers/recurrent/LSTM.js create mode 100644 lib/layers/recurrent/SimpleRNN.js create mode 100644 lib/layers/recurrent/index.js create mode 100644 lib/layers/wrappers/Bidirectional.js create mode 100644 lib/layers/wrappers/TimeDistributed.js create mode 100644 lib/layers/wrappers/index.js delete mode 100644 lib/local-path.js delete mode 100644 lib/logger.js delete mode 100644 lib/options.js create mode 100644 lib/proto.js create mode 100644 lib/utils/tensorUtils.js create mode 100644 lib/utils/testUtils.js create mode 100644 lib/visualizations/CAM.js create mode 100644 lib/visualizations/index.js delete mode 100644 lib/warnings.js create mode 100644 lib/webgl/dynamic/convolutional/conv2d.js create mode 100644 lib/webgl/dynamic/convolutional/conv2dTranspose.js create mode 100644 lib/webgl/dynamic/createGLSLProgram.js create mode 100644 lib/webgl/dynamic/merge/add.js create mode 100644 lib/webgl/dynamic/merge/average.js create mode 100644 lib/webgl/dynamic/merge/concatenate.js create mode 100644 lib/webgl/dynamic/merge/maximum.js create mode 100644 lib/webgl/dynamic/merge/minimum.js create mode 100644 lib/webgl/dynamic/merge/multiply.js create mode 100644 lib/webgl/dynamic/merge/subtract.js create mode 100644 lib/webgl/dynamic/visualizations/cam.js create mode 100644 myproj/postcss.config.js delete mode 100644 myproj/src/App.vue create mode 100644 myproj/src/App2.vue create mode 100644 myproj/src/assets/logo-V.png create mode 100644 myproj/src/assets/logo.svg create mode 100644 myproj/src/components/NavDrawer.vue create mode 100644 myproj/src/components/RightContent.vue rename myproj/src/components/{ => models}/HelloWorld.vue (100%) create mode 100644 myproj/src/components/models/MnistCnn.vue create mode 100644 myproj/src/data/DemoModels.js create mode 100644 myproj/src/utils/imagenet.js create mode 100644 myproj/src/utils/index.js create mode 100644 myproj/webpack.config.js create mode 100644 src/Layer.js create mode 100644 src/Model.js create mode 100644 src/Tensor.js create mode 100644 src/WebGL2.js create mode 100644 src/activations/elu.glsl create mode 100644 src/activations/elu.js create mode 100644 src/activations/hard_sigmoid.glsl create mode 100644 src/activations/hard_sigmoid.js create mode 100644 src/activations/index.js create mode 100644 src/activations/linear.glsl create mode 100644 src/activations/linear.js create mode 100644 src/activations/programSources.js create mode 100644 src/activations/relu.glsl create mode 100644 src/activations/relu.js create mode 100644 src/activations/selu.glsl create mode 100644 src/activations/selu.js create mode 100644 src/activations/sigmoid.glsl create mode 100644 src/activations/sigmoid.js create mode 100644 src/activations/softmax.glsl create mode 100644 src/activations/softmax.js create mode 100644 src/activations/softplus.glsl create mode 100644 src/activations/softplus.js create mode 100644 src/activations/softsign.glsl create mode 100644 src/activations/softsign.js create mode 100644 src/activations/tanh.glsl create mode 100644 src/activations/tanh.js create mode 100644 src/index.js create mode 100644 src/layers/InputLayer.js create mode 100644 src/layers/advanced_activations/ELU.glsl create mode 100644 src/layers/advanced_activations/ELU.js create mode 100644 src/layers/advanced_activations/LeakyReLU.glsl create mode 100644 src/layers/advanced_activations/LeakyReLU.js create mode 100644 src/layers/advanced_activations/PReLU.glsl create mode 100644 src/layers/advanced_activations/PReLU.js create mode 100644 src/layers/advanced_activations/ThresholdedReLU.glsl create mode 100644 src/layers/advanced_activations/ThresholdedReLU.js create mode 100644 src/layers/advanced_activations/index.js create mode 100644 src/layers/convolutional/Conv1D.js create mode 100644 src/layers/convolutional/Conv2D.js create mode 100644 src/layers/convolutional/Conv2DTranspose.js create mode 100644 src/layers/convolutional/Conv3D.js create mode 100644 src/layers/convolutional/Cropping1D.js create mode 100644 src/layers/convolutional/Cropping2D.js create mode 100644 src/layers/convolutional/Cropping3D.js create mode 100644 src/layers/convolutional/SeparableConv2D.js create mode 100644 src/layers/convolutional/UpSampling1D.js create mode 100644 src/layers/convolutional/UpSampling2D.js create mode 100644 src/layers/convolutional/UpSampling3D.js create mode 100644 src/layers/convolutional/ZeroPadding1D.js create mode 100644 src/layers/convolutional/ZeroPadding2D.js create mode 100644 src/layers/convolutional/ZeroPadding3D.js create mode 100644 src/layers/convolutional/index.js create mode 100644 src/layers/core/Activation.js create mode 100644 src/layers/core/Dense.js create mode 100644 src/layers/core/Dropout.js create mode 100644 src/layers/core/Flatten.fragments.glsl create mode 100644 src/layers/core/Flatten.glsl create mode 100644 src/layers/core/Flatten.js create mode 100644 src/layers/core/Permute.js create mode 100644 src/layers/core/RepeatVector.glsl create mode 100644 src/layers/core/RepeatVector.js create mode 100644 src/layers/core/Reshape.js create mode 100644 src/layers/core/SpatialDropout1D.js create mode 100644 src/layers/core/SpatialDropout2D.js create mode 100644 src/layers/core/SpatialDropout3D.js create mode 100644 src/layers/core/index.js create mode 100644 src/layers/embeddings/Embedding.glsl create mode 100644 src/layers/embeddings/Embedding.js create mode 100644 src/layers/embeddings/index.js create mode 100644 src/layers/index.js create mode 100644 src/layers/merge/Add.js create mode 100644 src/layers/merge/Average.js create mode 100644 src/layers/merge/Concatenate.js create mode 100644 src/layers/merge/Dot.glsl create mode 100644 src/layers/merge/Dot.js create mode 100644 src/layers/merge/Maximum.js create mode 100644 src/layers/merge/Minimum.js create mode 100644 src/layers/merge/Multiply.js create mode 100644 src/layers/merge/Subtract.js create mode 100644 src/layers/merge/_Merge.js create mode 100644 src/layers/merge/index.js create mode 100644 src/layers/noise/GaussianDropout.js create mode 100644 src/layers/noise/GaussianNoise.js create mode 100644 src/layers/noise/index.js create mode 100644 src/layers/normalization/BatchNormalization.glsl create mode 100644 src/layers/normalization/BatchNormalization.js create mode 100644 src/layers/normalization/index.js create mode 100644 src/layers/pooling/AveragePooling1D.js create mode 100644 src/layers/pooling/AveragePooling2D.js create mode 100644 src/layers/pooling/AveragePooling3D.js create mode 100644 src/layers/pooling/GlobalAveragePooling1D.js create mode 100644 src/layers/pooling/GlobalAveragePooling2D.js create mode 100644 src/layers/pooling/GlobalAveragePooling3D.js create mode 100644 src/layers/pooling/GlobalMaxPooling1D.js create mode 100644 src/layers/pooling/GlobalMaxPooling2D.js create mode 100644 src/layers/pooling/GlobalMaxPooling3D.js create mode 100644 src/layers/pooling/MaxPooling1D.js create mode 100644 src/layers/pooling/MaxPooling2D.js create mode 100644 src/layers/pooling/MaxPooling3D.js create mode 100644 src/layers/pooling/_GlobalPooling.glsl create mode 100644 src/layers/pooling/_GlobalPooling1D.js create mode 100644 src/layers/pooling/_GlobalPooling2D.js create mode 100644 src/layers/pooling/_GlobalPooling3D.js create mode 100644 src/layers/pooling/_Pooling.fragments.glsl create mode 100644 src/layers/pooling/_Pooling.glsl create mode 100644 src/layers/pooling/_Pooling1D.js create mode 100644 src/layers/pooling/_Pooling2D.js create mode 100644 src/layers/pooling/_Pooling3D.js create mode 100644 src/layers/pooling/index.js create mode 100644 src/layers/recurrent/GRU.js create mode 100644 src/layers/recurrent/GRU.update.glsl create mode 100644 src/layers/recurrent/LSTM.js create mode 100644 src/layers/recurrent/LSTM.update.glsl create mode 100644 src/layers/recurrent/SimpleRNN.js create mode 100644 src/layers/recurrent/gateProduct.glsl create mode 100644 src/layers/recurrent/gateSummation.glsl create mode 100644 src/layers/recurrent/index.js create mode 100644 src/layers/recurrent/timestepRead.glsl create mode 100644 src/layers/recurrent/timestepWrite.glsl create mode 100644 src/layers/wrappers/Bidirectional.ave.glsl create mode 100644 src/layers/wrappers/Bidirectional.concat.glsl create mode 100644 src/layers/wrappers/Bidirectional.js create mode 100644 src/layers/wrappers/Bidirectional.mul.glsl create mode 100644 src/layers/wrappers/Bidirectional.sum.glsl create mode 100644 src/layers/wrappers/TimeDistributed.copySliceOutput.glsl create mode 100644 src/layers/wrappers/TimeDistributed.js create mode 100644 src/layers/wrappers/TimeDistributed.mapSliceOutput.glsl create mode 100644 src/layers/wrappers/TimeDistributed.selectSlice.glsl create mode 100644 src/layers/wrappers/index.js create mode 100644 src/proto.js create mode 100644 src/utils/tensorUtils.js create mode 100644 src/utils/testUtils.js create mode 100644 src/visualizations/CAM.js create mode 100644 src/visualizations/index.js create mode 100644 src/webgl/copyTexture.glsl create mode 100644 src/webgl/dynamic/convolutional/conv2d.js create mode 100644 src/webgl/dynamic/convolutional/conv2dTranspose.js create mode 100644 src/webgl/dynamic/createGLSLProgram.js create mode 100644 src/webgl/dynamic/merge/add.js create mode 100644 src/webgl/dynamic/merge/average.js create mode 100644 src/webgl/dynamic/merge/concatenate.js create mode 100644 src/webgl/dynamic/merge/maximum.js create mode 100644 src/webgl/dynamic/merge/minimum.js create mode 100644 src/webgl/dynamic/merge/multiply.js create mode 100644 src/webgl/dynamic/merge/subtract.js create mode 100644 src/webgl/dynamic/visualizations/cam.js create mode 100644 src/webgl/mapInput.fragments.glsl create mode 100644 src/webgl/mapInput.glsl create mode 100644 src/webgl/matMul.glsl create mode 100644 src/webgl/vertexShader.glsl create mode 100644 webpack.config.js diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 0000000000..c488d0ab5a --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,25 @@ +const envOpts = {} + +if (process.env.BABEL_ENV === 'node') { + envOpts.targets = { node: 9 } + envOpts.modules = 'commonjs' +} + +if (process.env.BABEL_ENV === 'browser') { + envOpts.targets = { browsers: ['>0.5%'] } + envOpts.modules = false + envOpts.useBuiltIns = 'entry' +} + +const config = { + comments: false, + presets: [['@babel/env', envOpts]], + plugins: [ + ['babel-plugin-inline-import', { extensions: ['.glsl'] }], + 'lodash', + '@babel/proposal-class-properties', + ['@babel/proposal-object-rest-spread', { useBuiltIns: true }] + ] +} + +module.exports = config diff --git a/lib/Layer.js b/lib/Layer.js new file mode 100644 index 0000000000..e218b0e2b3 --- /dev/null +++ b/lib/Layer.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _WebGL = require("./WebGL2"); + +class Layer { + constructor(attrs = {}) { + this.layerClass = 'Layer'; + this.name = attrs.name; + this.gpu = _WebGL.webgl2.isSupported && attrs.gpu; + this.params = []; + this.weights = {}; + this.inbound = []; + this.outbound = []; + } + + throwError(message) { + throw new Error(`[${this.layerClass} layer: ${this.name || ''}] ${message}`); + } + + toggleGPU(mode) { + const newMode = typeof mode === 'undefined' ? !this.gpu : mode; + + if (_WebGL.webgl2.isSupported && newMode) { + this.gpu = true; + } else { + this.gpu = false; + } + } + + setWeights(weightsArr, createGLTexture = true) { + this.params.forEach((p, i) => { + this.weights[p] = weightsArr[i]; + + if (this.gpu && createGLTexture) { + this.weights[p].createGLTexture({ + type: '2d', + format: 'float' + }); + } + }); + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = Layer; \ No newline at end of file diff --git a/lib/Model.js b/lib/Model.js new file mode 100644 index 0000000000..584f591920 --- /dev/null +++ b/lib/Model.js @@ -0,0 +1,493 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _keys2 = _interopRequireDefault(require("lodash/keys")); + +var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); + +var _map2 = _interopRequireDefault(require("lodash/map")); + +var _every2 = _interopRequireDefault(require("lodash/every")); + +var _find2 = _interopRequireDefault(require("lodash/find")); + +var _bluebird = _interopRequireDefault(require("bluebird")); + +var _axios = _interopRequireDefault(require("axios")); + +var _performanceNow = _interopRequireDefault(require("performance-now")); + +var layers = _interopRequireWildcard(require("./layers")); + +var visMethods = _interopRequireWildcard(require("./visualizations")); + +var _Tensor = _interopRequireDefault(require("./Tensor")); + +var _WebGL = require("./WebGL2"); + +var _proto = _interopRequireDefault(require("./proto")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const axiosSource = _axios.default.CancelToken.source(); + +class Model { + constructor(config = {}) { + const { + filepath = null, + headers = {}, + filesystem = false, + gpu = false, + transferLayerOutputs = false, + pauseAfterLayerCalls = false, + visualizations = [] + } = config; + + if (!filepath) { + throw new Error('[Model] path to protobuf-serialized model definition file is missing.'); + } + + this.filepath = filepath; + this.headers = headers; + this.filesystem = typeof window !== 'undefined' ? false : filesystem; + this.dataRequestProgress = 0; + this.id = null; + this.name = null; + this.kerasVersion = null; + this.backend = null; + this.modelConfig = {}; + this.modelWeights = []; + this.gpu = typeof window !== 'undefined' && _WebGL.webgl2.isSupported ? gpu : false; + this.transferLayerOutputs = transferLayerOutputs; + this.pauseAfterLayerCalls = pauseAfterLayerCalls; + this.modelLayersMap = new Map(); + this.inputTensorsMap = new Map(); + this.inputLayerNames = []; + this.outputLayerNames = []; + this.finishedLayerNames = []; + this.isRunning = false; + this.predictStats = {}; + this.visMap = new Map(); + visualizations.forEach(v => { + if (v in visMethods) { + const visInstance = new visMethods[v]({ + modelLayersMap: this.modelLayersMap, + gpu: this.gpu + }); + this.visMap.set(v, visInstance); + } + }); + this._ready = this._initialize(); + } + + checkGPUSupport() { + return _WebGL.webgl2.isSupported; + } + + ready() { + return this._ready; + } + + _interrupt() { + axiosSource.cancel(); + } + + async _initialize() { + try { + const req = this.filesystem ? this._dataRequestFS() : this._dataRequestHTTP(this.headers); + await req; + } catch (err) { + console.log(err); + + this._interrupt(); + } + + this._buildDAG(); + + this.inputLayerNames.forEach(name => { + const inputLayer = this.modelLayersMap.get(name); + inputLayer.call(this.inputTensorsMap.get(name)); + inputLayer.hasOutput = true; + inputLayer.visited = true; + }); + await this._traverseDAG(this.inputLayerNames); + this.finishedLayerNames = []; + this.modelLayersMap.forEach(layer => { + layer.hasOutput = false; + layer.visited = false; + }); + this.visMap.forEach(visInstance => { + visInstance.initialize(); + }); + return true; + } + + async _dataRequestHTTP(headers = {}) { + try { + const res = await _axios.default.get(this.filepath, { + responseType: 'arraybuffer', + headers, + onDownloadProgress: e => { + if (e.lengthComputable) { + const percentComplete = Math.round(100 * e.loaded / e.total); + this.dataRequestProgress = percentComplete; + } + }, + cancelToken: axiosSource.token + }); + this.decodeProtobuf(new Uint8Array(res.data)); + } catch (err) { + if (_axios.default.isCancel(err)) { + console.log('[Model] Data request canceled', err.message); + } else { + throw err; + } + } + + this.dataRequestProgress = 100; + } + + async _dataRequestFS() { + const readFile = _bluebird.default.promisify(require('fs').readFile); + + try { + const file = await readFile(this.filepath); + this.decodeProtobuf(file); + } catch (err) { + throw err; + } + + this.dataRequestProgress = 100; + } + + decodeProtobuf(buffer) { + const err = _proto.default.Model.verify(buffer); + + if (err) { + throw new Error(`[Model] Invalid model - check protobuf serialization: {err}`); + } + + const model = _proto.default.Model.decode(buffer); + + this.id = model.id; + this.name = model.name; + this.kerasVersion = model.kerasVersion; + this.backend = model.backend; + this.modelConfig = JSON.parse(model.modelConfig); + this.modelWeights = model.modelWeights; + } + + getLoadingProgress() { + return this.dataRequestProgress; + } + + toggleGPU(mode) { + if (typeof mode === 'undefined') { + this.gpu = !this.gpu; + } else { + this.gpu = mode; + } + + this.modelLayersMap.forEach(layer => { + layer.toggleGPU(this.gpu); + }); + this.visMap.forEach(visInstance => { + visInstance.gpu = this.gpu; + }); + this.resetInputTensors(); + } + + resetInputTensors() { + this.inputLayerNames.forEach(name => { + const inputLayer = this.modelLayersMap.get(name); + this.inputTensorsMap.set(name, new _Tensor.default([], inputLayer.shape)); + }); + } + + _buildDAG() { + const modelClass = this.modelConfig.class_name; + let modelConfig = []; + + if (modelClass === 'Sequential') { + modelConfig = this.modelConfig.config; + } else if (modelClass === 'Model') { + modelConfig = this.modelConfig.config.layers; + } + + if (!(Array.isArray(modelConfig) && modelConfig.length)) { + throw new Error('[Model] Model configuration does not contain any layers.'); + } + + modelConfig.forEach((layerDef, index) => { + const layerClass = layerDef.class_name; + const layerConfig = layerDef.config; + + if (modelClass === 'Model' && layerClass === 'Sequential') { + layerConfig.forEach((branchLayerDef, branchIndex) => { + const branchLayerClass = branchLayerDef.class_name; + const branchLayerConfig = branchLayerDef.config; + const branchInboundLayerNames = branchIndex === 0 ? layerDef.inbound_nodes[0].map(node => node[0]) : [layerConfig[branchIndex - 1].config.name]; + + this._createLayer(branchLayerClass, branchLayerConfig, branchInboundLayerNames); + }); + } else if (!(layerClass in layers)) { + throw new Error(`[Model] Layer ${layerClass} specified in model configuration is not implemented!`); + } else { + if (modelClass === 'Sequential' && index === 0) { + const inputName = 'input'; + const inputShape = layerConfig.batch_input_shape.slice(1); + const layer = new layers.InputLayer({ + name: inputName, + shape: inputShape, + gpu: this.gpu + }); + this.modelLayersMap.set(inputName, layer); + this.inputTensorsMap.set(inputName, new _Tensor.default([], inputShape)); + this.inputLayerNames.push(inputName); + } else if (modelClass === 'Model' && layerClass === 'InputLayer') { + const inputShape = layerConfig.batch_input_shape.slice(1); + this.inputTensorsMap.set(layerConfig.name, new _Tensor.default([], inputShape)); + this.inputLayerNames.push(layerConfig.name); + } + + let inboundLayerNames = []; + + if (modelClass === 'Sequential') { + if (index === 0) { + inboundLayerNames = ['input']; + } else { + inboundLayerNames = [modelConfig[index - 1].config.name]; + } + } else if (modelClass === 'Model') { + const inboundNodes = layerDef.inbound_nodes; + + if (inboundNodes && inboundNodes.length) { + inboundLayerNames = inboundNodes[0].map(node => node[0]); + } + } + + this._createLayer(layerClass, layerConfig, inboundLayerNames); + } + }); + this.modelLayersMap.forEach(layer => { + if (layer.outbound.length === 0) { + this.outputLayerNames.push(layer.name); + } + }); + this.inputLayerNames.sort(); + this.outputLayerNames.sort(); + } + + _createLayer(layerClass, layerConfig, inboundLayerNames) { + const layer = new layers[layerClass](Object.assign({}, layerConfig, { + gpu: this.gpu + })); + let weightNames = []; + + if (layerClass === 'Bidirectional') { + const forwardWeightNames = layer.forwardLayer.params.map(param => `${layerConfig.name}/forward_${layerConfig.layer.config.name}/${param}`); + const backwardWeightNames = layer.backwardLayer.params.map(param => `${layerConfig.name}/backward_${layerConfig.layer.config.name}/${param}`); + weightNames = forwardWeightNames.concat(backwardWeightNames); + } else if (layerClass === 'TimeDistributed') { + weightNames = layer.layer.params.map(param => `${layerConfig.name}/${param}`); + } else { + weightNames = layer.params.map(param => `${layerConfig.name}/${param}`); + } + + if (weightNames && weightNames.length) { + const weights = weightNames.map(weightName => { + const weightDef = (0, _find2.default)(this.modelWeights, w => { + const weightRE = new RegExp(`^${weightName}`); + return weightRE.test(w.weightName); + }); + + if (!weightDef) { + throw new Error(`[Model] error loading weights.`); + } + + const { + data, + shape, + type + } = weightDef; + const buf = new ArrayBuffer(data.byteLength); + const arr = new Uint8Array(buf); + arr.set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)); + + if (type === 'uint8') { + const { + quantizeMin, + quantizeMax + } = weightDef; + const unquantized = new Float32Array(arr); + + for (let i = 0, len = unquantized.length; i < len; i++) { + unquantized[i] *= (quantizeMax - quantizeMin) / 255; + unquantized[i] += quantizeMin; + } + + return new _Tensor.default(unquantized, shape); + } else { + return new _Tensor.default(new Float32Array(buf), shape); + } + }); + layer.setWeights(weights); + } + + this.modelLayersMap.set(layerConfig.name, layer); + inboundLayerNames.forEach(layerName => { + this.modelLayersMap.get(layerConfig.name).inbound.push(layerName); + this.modelLayersMap.get(layerName).outbound.push(layerConfig.name); + }); + } + + async _traverseDAG(nodes) { + if (nodes.length === 0) { + return true; + } else if (nodes.length === 1) { + const node = nodes[0]; + const currentLayer = this.modelLayersMap.get(node); + + if (currentLayer.layerClass === 'InputLayer') { + this.finishedLayerNames.push(this.modelLayersMap.get(node).name); + } else { + const currentLayer = this.modelLayersMap.get(node); + + if (currentLayer.visited) { + return false; + } + + const inboundLayers = currentLayer.inbound.map(n => this.modelLayersMap.get(n)); + + if (!(0, _every2.default)((0, _map2.default)(inboundLayers, 'hasOutput'))) { + return false; + } + + if (currentLayer.isMergeLayer) { + currentLayer.call((0, _map2.default)(inboundLayers, 'output')); + } else { + currentLayer.call(inboundLayers[0].output); + } + + currentLayer.hasOutput = true; + currentLayer.visited = true; + this.finishedLayerNames.push(currentLayer.name); + + if (this.pauseAfterLayerCalls) { + await _bluebird.default.delay(0); + } + } + + await this._traverseDAG(currentLayer.outbound); + } else { + await _bluebird.default.all(nodes.map(node => this._traverseDAG([node]))); + } + } + + _maybeTransferIntermediateOutputs() { + if (this.gpu && this.transferLayerOutputs) { + this.modelLayersMap.forEach(layer => { + if (layer.output && layer.output.glTexture) { + _WebGL.webgl2.bindOutputTexture(layer.output.glTexture, layer.output.glTextureShape); + + layer.output.transferFromGLTexture(); + + if (layer.output.is2DReshaped) { + layer.output.reshapeFrom2D(); + } + } + }); + } + } + + loadData(inputData) { + this.inputLayerNames.forEach(name => { + const inputLayer = this.modelLayersMap.get(name); + this.inputTensorsMap.get(name).replaceTensorData(inputData[name]); + inputLayer.call(this.inputTensorsMap.get(name)); + inputLayer.hasOutput = true; + inputLayer.visited = true; + }); + } + + async predict(inputData) { + this.isRunning = true; + + if (!(0, _isEqual2.default)((0, _keys2.default)(inputData).sort(), this.inputLayerNames)) { + this.isRunning = false; + throw new Error('[Model] predict() must take an object where the keys are the named inputs of the model: ' + JSON.stringify(this.inputLayerNames)); + } + + if (!(0, _every2.default)(this.inputLayerNames, name => inputData[name] instanceof Float32Array)) { + this.isRunning = false; + throw new Error('[Model] predict() must take an object where the values are the flattened data as Float32Array.'); + } + + this.finishedLayerNames = []; + this.modelLayersMap.forEach(layer => { + layer.hasOutput = false; + layer.visited = false; + }); + let start = (0, _performanceNow.default)(); + this.loadData(inputData); + this.predictStats.loadData = (0, _performanceNow.default)() - start; + start = (0, _performanceNow.default)(); + await this._traverseDAG(this.inputLayerNames); + this.predictStats.forwardPass = (0, _performanceNow.default)() - start; + + this._maybeTransferIntermediateOutputs(); + + const modelClass = this.modelConfig.class_name; + const outputData = {}; + + if (modelClass === 'Sequential') { + const outputLayer = this.modelLayersMap.get(this.outputLayerNames[0]); + outputData['output'] = outputLayer.output.tensor.data; + } else if (modelClass === 'Model') { + this.outputLayerNames.forEach(layerName => { + const outputLayer = this.modelLayersMap.get(layerName); + outputData[layerName] = outputLayer.output.tensor.data; + }); + } + + start = (0, _performanceNow.default)(); + this.visMap.forEach(visInstance => { + visInstance.update(); + }); + this.predictStats.visualizations = (0, _performanceNow.default)() - start; + this.isRunning = false; + return outputData; + } + + layerCall(layerName, input) { + if (!this.modelLayersMap.has(layerName)) return; + let x; + + if (input instanceof _Tensor.default) { + x = input; + } else { + x = new _Tensor.default(input.data, input.shape); + } + + const layer = this.modelLayersMap.get(layerName); + return layer.call(x); + } + + cleanup() { + _WebGL.webgl2.clearRefs(); + + this.modelLayersMap.clear(); + this.inputTensorsMap.clear(); + this.visMap.clear(); + delete this.modelWeights; + } + +} + +exports.default = Model; \ No newline at end of file diff --git a/lib/Tensor.js b/lib/Tensor.js new file mode 100644 index 0000000000..b63dc12163 --- /dev/null +++ b/lib/Tensor.js @@ -0,0 +1,386 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _WebGL = require("./WebGL2"); + +var tensorUtils = _interopRequireWildcard(require("./utils/tensorUtils")); + +var _ndarray = _interopRequireDefault(require("ndarray")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarraySqueeze = _interopRequireDefault(require("ndarray-squeeze")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +class Tensor { + constructor(data, shape, options = {}) { + this.arrayType = options.type || Float32Array; + + if (data && data.length && (data instanceof this.arrayType || data instanceof Array)) { + tensorUtils.checkShape(data, shape); + + if (data instanceof this.arrayType) { + this.tensor = (0, _ndarray.default)(data, shape); + } else if (data instanceof Array) { + this.tensor = (0, _ndarray.default)(new this.arrayType(data), shape); + } + } else if (!data.length && shape.length) { + this.tensor = (0, _ndarray.default)(new this.arrayType(shape.reduce((a, b) => a * b, 1)), shape); + } else { + this.tensor = (0, _ndarray.default)(new this.arrayType([]), []); + } + } + + createGLTexture({ + type = '2d', + format = 'float', + supportsTextureFragments = false + }) { + let shape = []; + + if (this.tensor.shape.length === 1) { + shape = [1, this.tensor.shape[0]]; + this.is1D = true; + } else if (this.tensor.shape.length === 2) { + shape = this.tensor.shape; + } else if (this.tensor.shape.length === 3 && (type === '2d_array' || type === '3d')) { + shape = this.tensor.shape; + } else { + throw new Error('[Tensor] cannot create WebGL2 texture.'); + } + + this.glTextureShape = shape; + this.glTextureType = type; + this.glTextureFormat = format; + + if (type === '2d') { + if (this.glTextureShape[0] > _WebGL.MAX_TEXTURE_SIZE && supportsTextureFragments) { + this._create2DRowFragmentedGLTexture(); + } else { + this._create2DGLTexture(); + } + } else if (type === '2d_array' || type === '3d') { + this._create3DGLTexture(); + } else { + throw new Error(`[Tensor] invalid type ${type}.`); + } + } + + _create2DGLTexture() { + const gl = _WebGL.webgl2.context; + + const textureOptions = _WebGL.webgl2.getWebGLTextureOptions(this.glTextureType, this.glTextureFormat); + + const { + textureTarget, + textureInternalFormat, + textureFormat, + textureType + } = textureOptions; + this.glTexture = gl.createTexture(); + + _WebGL.webgl2.storeRef('texture', this.glTexture); + + gl.bindTexture(textureTarget, this.glTexture); + const shape = this.glTextureShape; + const data = this.tensor.data; + gl.texImage2D(textureTarget, 0, textureInternalFormat, shape[1], shape[0], 0, textureFormat, textureType, data); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + } + + _create2DRowFragmentedGLTexture() { + const gl = _WebGL.webgl2.context; + + const textureOptions = _WebGL.webgl2.getWebGLTextureOptions(this.glTextureType, this.glTextureFormat); + + const { + textureTarget, + textureInternalFormat, + textureFormat, + textureType + } = textureOptions; + this.glTextureFragments = []; + this.glTextureFragmentShape = [_WebGL.MAX_TEXTURE_SIZE, this.glTextureShape[1]]; + const shape = this.glTextureFragmentShape; + const numFragments = Math.ceil(this.glTextureShape[0] / _WebGL.MAX_TEXTURE_SIZE); + let offset = 0; + + for (let k = 0; k < numFragments; k++) { + const glTexture = gl.createTexture(); + + _WebGL.webgl2.storeRef('texture', glTexture); + + gl.bindTexture(textureTarget, glTexture); + let data; + + if (k === numFragments - 1) { + data = new this.arrayType(shape[0] * shape[1]); + data.set(this.tensor.data.slice(offset, offset + shape[0] * shape[1]), 0); + } else { + data = this.tensor.data.slice(offset, offset + shape[0] * shape[1]); + } + + gl.texImage2D(textureTarget, 0, textureInternalFormat, shape[1], shape[0], 0, textureFormat, textureType, data); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + this.glTextureFragments.push(glTexture); + offset += shape[0] * shape[1]; + } + } + + _create3DGLTexture() { + const gl = _WebGL.webgl2.context; + + const textureOptions = _WebGL.webgl2.getWebGLTextureOptions(this.glTextureType, this.glTextureFormat); + + const { + textureTarget, + textureInternalFormat, + textureFormat, + textureType + } = textureOptions; + this.glTexture = gl.createTexture(); + + _WebGL.webgl2.storeRef('texture', this.glTexture); + + gl.bindTexture(textureTarget, this.glTexture); + const shape = this.glTextureShape; + const data = tensorUtils.data3DLayoutForGL(this.arrayType, this.tensor, this.glTextureShape); + gl.texImage3D(textureTarget, 0, textureInternalFormat, shape[1], shape[0], shape[2], 0, textureFormat, textureType, data); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + } + + convert2DRowFragmentedGLTextureToColStack() { + if (!this.glTextureFragments || !this.glTextureFragmentShape) { + throw new Error('[Tensor] no glTextureFragments available.'); + } + + const gl = _WebGL.webgl2.context; + + const textureOptions = _WebGL.webgl2.getWebGLTextureOptions(this.glTextureType, this.glTextureFormat); + + const { + textureTarget, + textureInternalFormat, + textureFormat, + textureType + } = textureOptions; + + if (!this.glTextureFragmentsAsColStack) { + this.glTextureFragmentsAsColStack = gl.createTexture(); + + _WebGL.webgl2.storeRef('texture', this.glTextureFragmentsAsColStack); + + gl.bindTexture(textureTarget, this.glTextureFragmentsAsColStack); + const numFragments = this.glTextureFragments.length; + this.glTextureFragmentsAsColStackShape = [this.glTextureFragmentShape[0], this.glTextureFragmentShape[1] * numFragments]; + const shape = this.glTextureFragmentsAsColStackShape; + const data = new this.arrayType(shape.reduce((a, b) => a * b, 1)); + gl.texImage2D(textureTarget, 0, textureInternalFormat, shape[1], shape[0], 0, textureFormat, textureType, data); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + } else { + gl.bindTexture(textureTarget, this.glTextureFragmentsAsColStack); + } + + const fbo = gl.createFramebuffer(); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo); + this.glTextureFragments.forEach((texture, k) => { + gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.copyTexSubImage2D(textureTarget, 0, k * this.glTextureFragmentShape[1], 0, 0, 0, this.glTextureFragmentShape[1], this.glTextureFragmentShape[0]); + }); + gl.deleteFramebuffer(fbo); + } + + removeGLTextureFragmentsAsColStack() { + if (this.glTextureFragmentsAsColStack) { + const gl = _WebGL.webgl2.context; + gl.deleteTexture(this.glTextureFragmentsAsColStack); + delete this.glTextureFragmentsAsColStack; + delete this.glTextureFragmentsAsColStackShape; + } + } + + deleteGLTexture() { + const gl = _WebGL.webgl2.context; + + if (this.glTexture) { + gl.deleteTexture(this.glTexture); + delete this.glTexture; + } + + if (this.glTextureFragments) { + this.glTextureFragments.forEach(texture => { + gl.deleteTexture(texture); + }); + delete this.glTextureFragments; + } + } + + replaceTensorData(data) { + if (data && data.length && data instanceof this.arrayType) { + this.tensor.data.set(data); + } else if (data && data.length && data instanceof Array) { + this.tensor.data.set(new this.arrayType(data)); + } else { + throw new Error('[Tensor] invalid input for replaceTensorData method.'); + } + + if (this.glTexture) { + const gl = _WebGL.webgl2.context; + + const textureOptions = _WebGL.webgl2.getWebGLTextureOptions(this.glTextureType, this.glTextureFormat); + + const { + textureTarget, + textureFormat, + textureType + } = textureOptions; + gl.bindTexture(textureTarget, this.glTexture); + const shape = this.glTextureShape; + + if (this.glTextureType === '2d') { + const data = this.tensor.data; + gl.texSubImage2D(textureTarget, 0, 0, 0, shape[1], shape[0], textureFormat, textureType, data, 0); + } else if (this.glTextureType === '2d_array' || this.glTextureType === '3d') { + const data = tensorUtils.data3DLayoutForGL(this.arrayType, this.tensor, shape); + gl.texSubImage3D(textureTarget, 0, 0, 0, 0, shape[1], shape[0], shape[2], textureFormat, textureType, data, 0); + } + } + } + + transferFromGLTexture() { + if (this.glTextureFragments) { + this.tensor = (0, _ndarray.default)(new this.arrayType(this.glTextureShape[0] * this.glTextureShape[1]), this.glTextureShape); + let offset = 0; + + for (let k = 0; k < this.glTextureFragments.length; k++) { + _WebGL.webgl2.bindOutputTexture(this.glTextureFragments[k], this.glTextureFragmentShape); + + const fragmentData = _WebGL.webgl2.readData(this.glTextureFragmentShape); + + if (k === this.glTextureFragments.length - 1) { + const truncate = this.tensor.data.length - offset; + this.tensor.data.set(fragmentData.subarray(0, truncate), offset); + } else { + this.tensor.data.set(fragmentData, offset); + } + + offset += fragmentData.length; + } + } else { + _WebGL.webgl2.bindOutputTexture(this.glTexture, this.glTextureShape); + + this.tensor = (0, _ndarray.default)(new this.arrayType([]), this.glTextureShape); + this.tensor.data = _WebGL.webgl2.readData(this.glTextureShape); + } + + if (this.is1D && this.glTextureShape[0] === 1) { + this.tensor = (0, _ndarraySqueeze.default)(this.tensor, [0]); + } + } + + reshapeTo2D() { + const axis = this.tensor.shape.length - 1; + const axisSize = this.tensor.shape[axis]; + const otherAxes = this.tensor.shape.slice(0, axis); + const otherAxesSize = otherAxes.reduce((a, b) => a * b, 1); + const reshaped = (0, _ndarray.default)(new this.arrayType(otherAxesSize * axisSize), [otherAxesSize, axisSize]); + const otherAxesData = (0, _ndarray.default)(new this.arrayType(otherAxesSize), otherAxes); + const otherAxesDataRaveled = (0, _ndarray.default)(new this.arrayType(otherAxesSize), [otherAxesSize]); + const axisSlices = Array(this.tensor.shape.length).fill(null); + + for (let n = 0; n < axisSize; n++) { + axisSlices[axis] = n; + + _ndarrayOps.default.assign(otherAxesData, this.tensor.pick(...axisSlices)); + + otherAxesDataRaveled.data = otherAxesData.data; + + _ndarrayOps.default.assign(reshaped.pick(null, n), otherAxesDataRaveled); + } + + this.originalShape = this.tensor.shape; + this.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.tensor.shape, false, axis); + this.tensor = reshaped; + this.is2DReshaped = true; + } + + reshapeFrom2D(axis = -1) { + if (!this.is2DReshaped) { + throw new Error('[Tensor] not in reshaped 2D representation.'); + } + + if (!this.originalShape) { + throw new Error('[Tensor] does not contain originalShape.'); + } + + if (axis < 0) { + axis = this.originalShape.length + axis; + } + + const channelDataSize = this.tensor.shape[0]; + const channels = this.tensor.shape[1]; + const reshaped = (0, _ndarray.default)(new this.arrayType(this.originalShape.reduce((a, b) => a * b, 1)), this.originalShape); + const channelDataRaveled = (0, _ndarray.default)(new this.arrayType(channelDataSize), [channelDataSize]); + const unraveledChannelShape = [...this.originalShape.slice(0, axis), ...this.originalShape.slice(axis + 1)]; + const unraveledChannel = (0, _ndarray.default)(new this.arrayType(unraveledChannelShape.reduce((a, b) => a * b, 1)), unraveledChannelShape); + const axisSlices = Array(this.originalShape.length).fill(null); + + for (let n = 0; n < channels; n++) { + _ndarrayOps.default.assign(channelDataRaveled, this.tensor.pick(null, n)); + + unraveledChannel.data = channelDataRaveled.data; + axisSlices[axis] = n; + + _ndarrayOps.default.assign(reshaped.pick(...axisSlices), unraveledChannel); + } + + this.tensor = reshaped; + } + + reshapeTo2DSquare() { + const squareDim = Math.ceil(Math.sqrt(this.tensor.size)); + const reshaped = (0, _ndarray.default)(new this.arrayType(squareDim ** 2), [squareDim, squareDim]); + reshaped.data.set(this.tensor.data); + this.originalShape = this.tensor.shape; + this.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.tensor.shape, true); + this.tensor = reshaped; + this.is2DSquareReshaped = true; + } + + reshapeFrom2DSquare() { + if (!this.is2DSquareReshaped) { + throw new Error('[Tensor] not in reshaped 2D square representation.'); + } + + if (!this.originalShape) { + throw new Error('[Tensor] does not contain originalShape.'); + } + + const size = this.originalShape.reduce((a, b) => a * b, 1); + const reshaped = (0, _ndarray.default)(new this.arrayType(size), this.originalShape); + reshaped.data.set(this.tensor.data.subarray(0, size)); + this.tensor = reshaped; + } + +} + +exports.default = Tensor; \ No newline at end of file diff --git a/lib/WebGL2.js b/lib/WebGL2.js new file mode 100644 index 0000000000..99f0f4897c --- /dev/null +++ b/lib/WebGL2.js @@ -0,0 +1,281 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MAX_TEXTURE_IMAGE_UNITS = exports.MAX_TEXTURE_SIZE = exports.webgl2 = void 0; +const vertexShaderSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec3 position;\r\nin vec2 texcoord;\r\nout vec2 outTex;\r\n\r\nvoid main () {\r\n gl_Position = vec4(position, 1.0);\r\n\toutTex = texcoord;\r\n}\r\n"; + +class WebGL2 { + constructor() { + this.isSupported = false; + this.vertexShader = null; + + if (typeof window !== 'undefined') { + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext('webgl2'); + const gl = this.context; + + if (gl) { + this.isSupported = true; + gl.getExtension('EXT_color_buffer_float'); + this.MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE); + this.MAX_TEXTURE_IMAGE_UNITS = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + this.init(); + } else { + console.log('Unable to initialize WebGL2 -- your browser may not support it.'); + } + } + + this._refs = { + textures: [], + buffers: [] + }; + } + + init() { + this.createCommonVertexShader(); + } + + createCommonVertexShader() { + const gl = this.context; + const vertexShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertexShader, vertexShaderSource); + gl.compileShader(vertexShader); + const success = gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS); + + if (!success) { + console.error(gl.getShaderInfoLog(vertexShader)); + gl.deleteShader(vertexShader); + this.isSupported = false; + } + + this.vertexShader = vertexShader; + } + + compileProgram(source) { + const gl = this.context; + const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, source); + gl.compileShader(fragmentShader); + let success = gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS); + + if (!success) { + console.error(gl.getShaderInfoLog(fragmentShader)); + gl.deleteShader(fragmentShader); + this.isSupported = false; + } + + const program = gl.createProgram(); + gl.attachShader(program, this.vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + success = gl.getProgramParameter(program, gl.LINK_STATUS); + + if (!success) { + console.error(gl.getProgramInfoLog(program)); + this.isSupported = false; + } + + this.setupVertices(program); + return program; + } + + setupVertices(program) { + const gl = this.context; + const position = gl.getAttribLocation(program, 'position'); + const positionVertexObj = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, positionVertexObj); + this.storeRef('buffer', positionVertexObj); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0]), gl.STATIC_DRAW); + gl.vertexAttribPointer(position, 3, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(position); + const texcoord = gl.getAttribLocation(program, 'texcoord'); + const texcoordVertexObj = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, texcoordVertexObj); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0]), gl.STATIC_DRAW); + gl.vertexAttribPointer(texcoord, 2, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(texcoord); + this.storeRef('buffer', texcoordVertexObj); + const indicesVertexObj = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indicesVertexObj); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW); + this.storeRef('buffer', indicesVertexObj); + } + + selectProgram(program) { + const gl = this.context; + gl.useProgram(program); + } + + bindUniforms(program, uniforms) { + const gl = this.context; + uniforms.forEach(({ + value, + type, + name + }) => { + const loc = gl.getUniformLocation(program, name); + + if (type === 'float') { + gl.uniform1f(loc, value); + } else if (type === 'int' || type === 'bool') { + gl.uniform1i(loc, value); + } + }); + } + + bindInputTextures(program, inputs, k) { + const gl = this.context; + inputs.forEach(({ + input, + name + }, i) => { + gl.activeTexture(gl.TEXTURE0 + i); + + if (input.glTextureFragments) { + if (input.glTextureFragmentsAsColStack) { + const { + textureTarget + } = this.getWebGLTextureOptions(input.glTextureType, input.glTextureFormat); + gl.bindTexture(textureTarget, input.glTextureFragmentsAsColStack); + } else { + const { + textureTarget + } = this.getWebGLTextureOptions(input.glTextureType, input.glTextureFormat); + gl.bindTexture(textureTarget, input.glTextureFragments[k]); + } + } else { + const { + textureTarget + } = this.getWebGLTextureOptions(input.glTextureType, input.glTextureFormat); + gl.bindTexture(textureTarget, input.glTexture); + } + + gl.uniform1i(gl.getUniformLocation(program, name), i); + }); + } + + bindOutputTexture(outputTexture, shape) { + const gl = this.context; + gl.viewport(0, 0, shape[1], shape[0]); + this.framebuffer = this.framebuffer || gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0); + } + + runProgram({ + program, + output, + inputs, + uniforms, + supportsTextureFragments = false + }) { + if (!program) throw new Error('[WebGL2] missing program'); + if (!output) throw new Error('[WebGL2] missing output'); + if (!inputs) throw new Error('[WebGL2] missing inputs'); + const gl = this.context; + this.selectProgram(program); + + if (uniforms && Array.isArray(uniforms)) { + this.bindUniforms(program, uniforms); + } + + if (output.glTextureFragments) { + if (!supportsTextureFragments) { + throw new Error('[WebGL2] program does not support texture fragments'); + } + + const inputsWithFragments = inputs.filter(obj => obj.input.glTextureFragments && !obj.input.glTextureFragmentsAsColStack); + const numFragments = output.glTextureFragments.length; + + if (inputsWithFragments.some(obj => obj.input.glTextureFragments.length !== numFragments)) { + throw new Error('[WebGL2] number of texture fragments in inputs and output do not match'); + } + + for (let k = 0; k < numFragments; k++) { + this.bindOutputTexture(output.glTextureFragments[k], output.glTextureFragmentShape); + this.bindInputTextures(program, inputs, k); + gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0); + } + } else { + this.bindOutputTexture(output.glTexture, output.glTextureShape); + this.bindInputTextures(program, inputs); + gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0); + } + } + + readData(shape) { + const gl = this.context; + const buf = new ArrayBuffer(shape[0] * shape[1] * 4 * 4); + const view = new Float32Array(buf); + gl.readPixels(0, 0, shape[1], shape[0], gl.RGBA, gl.FLOAT, view); + const out = []; + + for (let i = 0; i < view.length; i += 4) { + out.push(view[i]); + } + + return new Float32Array(out); + } + + getWebGLTextureOptions(type, format) { + const gl = this.context; + const targetMap = { + '2d': gl.TEXTURE_2D, + '2d_array': gl.TEXTURE_2D_ARRAY, + '3d': gl.TEXTURE_3D + }; + const internalFormatMap = { + float: gl.R32F, + int: gl.R32I + }; + const formatMap = { + float: gl.RED, + int: gl.RED_INTEGER + }; + const typeMap = { + float: gl.FLOAT, + int: gl.INT + }; + const textureTarget = targetMap[type]; + const textureInternalFormat = internalFormatMap[format]; + const textureFormat = formatMap[format]; + const textureType = typeMap[format]; + return { + textureTarget, + textureInternalFormat, + textureFormat, + textureType + }; + } + + storeRef(type, obj) { + if (type === 'texture') { + this._refs.textures.push(obj); + } else if (type === 'buffer') { + this._refs.buffers.push(obj); + } + } + + clearRefs() { + const gl = this.context; + + this._refs.textures.forEach(texture => gl.deleteTexture(texture)); + + this._refs.buffers.forEach(buffer => gl.deleteBuffer(buffer)); + + this._refs = { + textures: [], + buffers: [] + }; + } + +} + +const webgl2 = new WebGL2(); +exports.webgl2 = webgl2; +const MAX_TEXTURE_SIZE = webgl2.MAX_TEXTURE_SIZE; +exports.MAX_TEXTURE_SIZE = MAX_TEXTURE_SIZE; +const MAX_TEXTURE_IMAGE_UNITS = webgl2.MAX_TEXTURE_IMAGE_UNITS; +exports.MAX_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS; \ No newline at end of file diff --git a/lib/activations/elu.js b/lib/activations/elu.js new file mode 100644 index 0000000000..477bdb4653 --- /dev/null +++ b/lib/activations/elu.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = elu; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _elu = (0, _cwise.default)({ + args: ['array', 'scalar'], + body: function (_x, alpha) { + _x = Math.max(_x, 0) + alpha * (Math.exp(Math.min(_x, 0)) - 1); + } +}); + +function elu(x, opts = {}) { + const { + alpha = 1.0 + } = opts; + + _elu(x.tensor, alpha); +} \ No newline at end of file diff --git a/lib/activations/hard_sigmoid.js b/lib/activations/hard_sigmoid.js new file mode 100644 index 0000000000..fbb2fb915f --- /dev/null +++ b/lib/activations/hard_sigmoid.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = hard_sigmoid; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _hard_sigmoid = (0, _cwise.default)({ + args: ['array'], + body: function (_x) { + _x = _x * 0.2 + 0.5; + + if (_x <= 0) { + _x = 0; + } else if (_x >= 1) { + _x = 1; + } + } +}); + +function hard_sigmoid(x) { + _hard_sigmoid(x.tensor); +} \ No newline at end of file diff --git a/lib/activations/index.js b/lib/activations/index.js new file mode 100644 index 0000000000..01201b9568 --- /dev/null +++ b/lib/activations/index.js @@ -0,0 +1,87 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "softmax", { + enumerable: true, + get: function () { + return _softmax.default; + } +}); +Object.defineProperty(exports, "elu", { + enumerable: true, + get: function () { + return _elu.default; + } +}); +Object.defineProperty(exports, "selu", { + enumerable: true, + get: function () { + return _selu.default; + } +}); +Object.defineProperty(exports, "softplus", { + enumerable: true, + get: function () { + return _softplus.default; + } +}); +Object.defineProperty(exports, "softsign", { + enumerable: true, + get: function () { + return _softsign.default; + } +}); +Object.defineProperty(exports, "relu", { + enumerable: true, + get: function () { + return _relu.default; + } +}); +Object.defineProperty(exports, "tanh", { + enumerable: true, + get: function () { + return _tanh.default; + } +}); +Object.defineProperty(exports, "sigmoid", { + enumerable: true, + get: function () { + return _sigmoid.default; + } +}); +Object.defineProperty(exports, "hard_sigmoid", { + enumerable: true, + get: function () { + return _hard_sigmoid.default; + } +}); +Object.defineProperty(exports, "linear", { + enumerable: true, + get: function () { + return _linear.default; + } +}); + +var _softmax = _interopRequireDefault(require("./softmax")); + +var _elu = _interopRequireDefault(require("./elu")); + +var _selu = _interopRequireDefault(require("./selu")); + +var _softplus = _interopRequireDefault(require("./softplus")); + +var _softsign = _interopRequireDefault(require("./softsign")); + +var _relu = _interopRequireDefault(require("./relu")); + +var _tanh = _interopRequireDefault(require("./tanh")); + +var _sigmoid = _interopRequireDefault(require("./sigmoid")); + +var _hard_sigmoid = _interopRequireDefault(require("./hard_sigmoid")); + +var _linear = _interopRequireDefault(require("./linear")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/activations/linear.js b/lib/activations/linear.js new file mode 100644 index 0000000000..59fdcc4268 --- /dev/null +++ b/lib/activations/linear.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = linear; + +function linear(x) { + return x; +} \ No newline at end of file diff --git a/lib/activations/programSources.js b/lib/activations/programSources.js new file mode 100644 index 0000000000..928a98fec9 --- /dev/null +++ b/lib/activations/programSources.js @@ -0,0 +1,26 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.linear = exports.hard_sigmoid = exports.sigmoid = exports.tanh = exports.relu = exports.softsign = exports.softplus = exports.selu = exports.elu = exports.softmax = void 0; +const softmaxProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float maxval = 0.0;\r\n for (int i = 0; i < int(size[0]); ++i) {\r\n float val = texelFetch(x, ivec2(i, out_y), 0).r;\r\n if (i == 0 || val > maxval) {\r\n maxval = val;\r\n }\r\n }\r\n\r\n float sum = 0.0;\r\n for (int i = 0; i < int(size[0]); ++i) {\r\n float val = texelFetch(x, ivec2(i, out_y), 0).r;\r\n sum += exp(val - maxval);\r\n }\r\n\r\n outColor = exp(texture(x, vec2(outTex.x, outTex.y)) - maxval) / sum;\r\n}\r\n"; +exports.softmax = softmaxProgramSource; +const eluProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n float alpha = 1.0;\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = max(v, 0.0) + alpha * (exp(min(v, 0.0)) - 1.0);\r\n}\r\n"; +exports.elu = eluProgramSource; +const seluProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n float alpha = 1.6732632423543772848170429916717;\r\n float scale = 1.0507009873554804934193349852946;\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = scale * (max(v, 0.0) + alpha * (exp(min(v, 0.0)) - 1.0));\r\n}\r\n"; +exports.selu = seluProgramSource; +const softplusProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n outColor = log(1.0 + exp(texture(x, vec2(outTex.x, outTex.y))));\r\n}\r\n"; +exports.softplus = softplusProgramSource; +const softsignProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n v /= 1.0 + abs(v);\r\n outColor = v;\r\n}\r\n"; +exports.softsign = softsignProgramSource; +const reluProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = max(v, 0.0);\r\n}\r\n"; +exports.relu = reluProgramSource; +const tanhProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = tanh(v);\r\n}\r\n"; +exports.tanh = tanhProgramSource; +const sigmoidProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n outColor = 1.0 / (1.0 + exp(-1.0 * texture(x, vec2(outTex.x, outTex.y))));\r\n}\r\n"; +exports.sigmoid = sigmoidProgramSource; +const hardSigmoidProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n v = v * 0.2 + 0.5;\r\n v = max(v, 0.0);\r\n v = min(v, 1.0);\r\n outColor = v;\r\n}\r\n"; +exports.hard_sigmoid = hardSigmoidProgramSource; +const linearProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n outColor = texture(x, vec2(outTex.x, outTex.y));\r\n}\r\n"; +exports.linear = linearProgramSource; \ No newline at end of file diff --git a/lib/activations/relu.js b/lib/activations/relu.js new file mode 100644 index 0000000000..8dc861607a --- /dev/null +++ b/lib/activations/relu.js @@ -0,0 +1,38 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = relu; + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _Tensor = _interopRequireDefault(require("../Tensor")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function relu(x, opts = {}) { + const { + alpha = 0, + maxValue = null + } = opts; + let neg; + + if (alpha !== 0) { + neg = new _Tensor.default([], x.tensor.shape); + + _ndarrayOps.default.mins(neg.tensor, x.tensor, 0); + + _ndarrayOps.default.mulseq(neg.tensor, alpha); + } + + _ndarrayOps.default.maxseq(x.tensor, 0); + + if (maxValue) { + _ndarrayOps.default.minseq(x.tensor, maxValue); + } + + if (neg) { + _ndarrayOps.default.addeq(x.tensor, neg.tensor); + } +} \ No newline at end of file diff --git a/lib/activations/selu.js b/lib/activations/selu.js new file mode 100644 index 0000000000..56ec53c7cd --- /dev/null +++ b/lib/activations/selu.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = selu; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _selu = (0, _cwise.default)({ + args: ['array', 'scalar'], + body: function (_x) { + const alpha = 1.6732632423543772848170429916717; + const scale = 1.0507009873554804934193349852946; + _x = scale * (Math.max(_x, 0) + alpha * (Math.exp(Math.min(_x, 0)) - 1)); + } +}); + +function selu(x) { + _selu(x.tensor); +} \ No newline at end of file diff --git a/lib/activations/sigmoid.js b/lib/activations/sigmoid.js new file mode 100644 index 0000000000..c5c124653e --- /dev/null +++ b/lib/activations/sigmoid.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = sigmoid; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _sigmoid = (0, _cwise.default)({ + args: ['array'], + body: function (_x) { + _x = 1 / (1 + Math.exp(-_x)); + } +}); + +function sigmoid(x) { + _sigmoid(x.tensor); +} \ No newline at end of file diff --git a/lib/activations/softmax.js b/lib/activations/softmax.js new file mode 100644 index 0000000000..98547ada23 --- /dev/null +++ b/lib/activations/softmax.js @@ -0,0 +1,38 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = softmax; + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function softmax(x) { + if (x.tensor.shape.length === 1) { + const maxval = _ndarrayOps.default.sup(x.tensor); + + _ndarrayOps.default.subseq(x.tensor, maxval); + + _ndarrayOps.default.expeq(x.tensor); + + const sum = _ndarrayOps.default.sum(x.tensor); + + _ndarrayOps.default.divseq(x.tensor, sum); + } else if (x.tensor.shape.length === 2) { + for (let i = 0; i < x.tensor.shape[0]; i++) { + const maxval = _ndarrayOps.default.sup(x.tensor.pick(i, null)); + + _ndarrayOps.default.subseq(x.tensor.pick(i, null), maxval); + + _ndarrayOps.default.expeq(x.tensor.pick(i, null)); + + const sum = _ndarrayOps.default.sum(x.tensor.pick(i, null)); + + _ndarrayOps.default.divseq(x.tensor.pick(i, null), sum); + } + } else { + throw new Error(`[activations.softmax] tensor shape ${x.tensor.shape} not supported.`); + } +} \ No newline at end of file diff --git a/lib/activations/softplus.js b/lib/activations/softplus.js new file mode 100644 index 0000000000..6affd45ff2 --- /dev/null +++ b/lib/activations/softplus.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = softplus; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _softplus = (0, _cwise.default)({ + args: ['array'], + body: function (_x) { + _x = Math.log(Math.exp(_x) + 1); + } +}); + +function softplus(x) { + _softplus(x.tensor); +} \ No newline at end of file diff --git a/lib/activations/softsign.js b/lib/activations/softsign.js new file mode 100644 index 0000000000..a4e81e4f83 --- /dev/null +++ b/lib/activations/softsign.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = softsign; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _softsign = (0, _cwise.default)({ + args: ['array'], + body: function (_x) { + _x /= 1 + Math.abs(_x); + } +}); + +function softsign(x) { + _softsign(x.tensor); +} \ No newline at end of file diff --git a/lib/activations/tanh.js b/lib/activations/tanh.js new file mode 100644 index 0000000000..98f90ed086 --- /dev/null +++ b/lib/activations/tanh.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = tanh; + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const _tanh = (0, _cwise.default)({ + args: ['array'], + body: function (_x) { + _x = Math.tanh(_x); + } +}); + +function tanh(x) { + _tanh(x.tensor); +} \ No newline at end of file diff --git a/lib/ask.js b/lib/ask.js deleted file mode 100644 index 9c3be69901..0000000000 --- a/lib/ask.js +++ /dev/null @@ -1,67 +0,0 @@ -const async = require('async') -const inquirer = require('inquirer') -const evaluate = require('./eval') - -// Support types from prompt-for which was used before -const promptMapping = { - string: 'input', - boolean: 'confirm' -} - -/** - * Ask questions, return results. - * - * @param {Object} prompts - * @param {Object} data - * @param {Function} done - */ - -module.exports = function ask (prompts, data, done) { - async.eachSeries(Object.keys(prompts), (key, next) => { - prompt(data, key, prompts[key], next) - }, done) -} - -/** - * Inquirer prompt wrapper. - * - * @param {Object} data - * @param {String} key - * @param {Object} prompt - * @param {Function} done - */ - -function prompt (data, key, prompt, done) { - // skip prompts whose when condition is not met - if (prompt.when && !evaluate(prompt.when, data)) { - return done() - } - - let promptDefault = prompt.default - if (typeof prompt.default === 'function') { - promptDefault = function () { - return prompt.default.bind(this)(data) - } - } - - inquirer.prompt([{ - type: promptMapping[prompt.type] || prompt.type, - name: key, - message: prompt.message || prompt.label || key, - default: promptDefault, - choices: prompt.choices || [], - validate: prompt.validate || (() => true) - }]).then(answers => { - if (Array.isArray(answers[key])) { - data[key] = {} - answers[key].forEach(multiChoiceAnswer => { - data[key][multiChoiceAnswer] = true - }) - } else if (typeof answers[key] === 'string') { - data[key] = answers[key].replace(/"/g, '\\"') - } else { - data[key] = answers[key] - } - done() - }).catch(done) -} diff --git a/lib/check-version.js b/lib/check-version.js deleted file mode 100644 index 98f20ac834..0000000000 --- a/lib/check-version.js +++ /dev/null @@ -1,31 +0,0 @@ -const request = require('request') -const semver = require('semver') -const chalk = require('chalk') -const packageConfig = require('../package.json') - -module.exports = done => { - // Ensure minimum supported node version is used - if (!semver.satisfies(process.version, packageConfig.engines.node)) { - return console.log(chalk.red( - ' You must upgrade node to >=' + packageConfig.engines.node + '.x to use vue-cli' - )) - } - - request({ - url: 'https://registry.npmjs.org/vue-cli', - timeout: 1000 - }, (err, res, body) => { - if (!err && res.statusCode === 200) { - const latestVersion = JSON.parse(body)['dist-tags'].latest - const localVersion = packageConfig.version - if (semver.lt(localVersion, latestVersion)) { - console.log(chalk.yellow(' A newer version of vue-cli is available.')) - console.log() - console.log(' latest: ' + chalk.green(latestVersion)) - console.log(' installed: ' + chalk.red(localVersion)) - console.log() - } - } - done() - }) -} diff --git a/lib/eval.js b/lib/eval.js deleted file mode 100644 index 1e5787ca01..0000000000 --- a/lib/eval.js +++ /dev/null @@ -1,16 +0,0 @@ -const chalk = require('chalk') - -/** - * Evaluate an expression in meta.json in the context of - * prompt answers data. - */ - -module.exports = function evaluate (exp, data) { - /* eslint-disable no-new-func */ - const fn = new Function('data', 'with (data) { return ' + exp + '}') - try { - return fn(data) - } catch (e) { - console.error(chalk.red('Error when evaluating filter condition: ' + exp)) - } -} diff --git a/lib/filter.js b/lib/filter.js deleted file mode 100644 index 5cbadb0063..0000000000 --- a/lib/filter.js +++ /dev/null @@ -1,20 +0,0 @@ -const match = require('minimatch') -const evaluate = require('./eval') - -module.exports = (files, filters, data, done) => { - if (!filters) { - return done() - } - const fileNames = Object.keys(files) - Object.keys(filters).forEach(glob => { - fileNames.forEach(file => { - if (match(file, glob, { dot: true })) { - const condition = filters[glob] - if (!evaluate(condition, data)) { - delete files[file] - } - } - }) - }) - done() -} diff --git a/lib/generate.js b/lib/generate.js deleted file mode 100644 index 8493f96f74..0000000000 --- a/lib/generate.js +++ /dev/null @@ -1,158 +0,0 @@ -const chalk = require('chalk') -const Metalsmith = require('metalsmith') -const Handlebars = require('handlebars') -const async = require('async') -const render = require('consolidate').handlebars.render -const path = require('path') -const multimatch = require('multimatch') -const getOptions = require('./options') -const ask = require('./ask') -const filter = require('./filter') -const logger = require('./logger') - -// register handlebars helper -Handlebars.registerHelper('if_eq', function (a, b, opts) { - return a === b - ? opts.fn(this) - : opts.inverse(this) -}) - -Handlebars.registerHelper('unless_eq', function (a, b, opts) { - return a === b - ? opts.inverse(this) - : opts.fn(this) -}) - -/** - * Generate a template given a `src` and `dest`. - * - * @param {String} name - * @param {String} src - * @param {String} dest - * @param {Function} done - */ - -module.exports = function generate (name, src, dest, done) { - const opts = getOptions(name, src) - const metalsmith = Metalsmith(path.join(src, 'template')) - const data = Object.assign(metalsmith.metadata(), { - destDirName: name, - inPlace: dest === process.cwd(), - noEscape: true - }) - opts.helpers && Object.keys(opts.helpers).map(key => { - Handlebars.registerHelper(key, opts.helpers[key]) - }) - - const helpers = { chalk, logger } - - if (opts.metalsmith && typeof opts.metalsmith.before === 'function') { - opts.metalsmith.before(metalsmith, opts, helpers) - } - - metalsmith.use(askQuestions(opts.prompts)) - .use(filterFiles(opts.filters)) - .use(renderTemplateFiles(opts.skipInterpolation)) - - if (typeof opts.metalsmith === 'function') { - opts.metalsmith(metalsmith, opts, helpers) - } else if (opts.metalsmith && typeof opts.metalsmith.after === 'function') { - opts.metalsmith.after(metalsmith, opts, helpers) - } - - metalsmith.clean(false) - .source('.') // start from template root instead of `./src` which is Metalsmith's default for `source` - .destination(dest) - .build((err, files) => { - done(err) - if (typeof opts.complete === 'function') { - const helpers = { chalk, logger, files } - opts.complete(data, helpers) - } else { - logMessage(opts.completeMessage, data) - } - }) - - return data -} - -/** - * Create a middleware for asking questions. - * - * @param {Object} prompts - * @return {Function} - */ - -function askQuestions (prompts) { - return (files, metalsmith, done) => { - ask(prompts, metalsmith.metadata(), done) - } -} - -/** - * Create a middleware for filtering files. - * - * @param {Object} filters - * @return {Function} - */ - -function filterFiles (filters) { - return (files, metalsmith, done) => { - filter(files, filters, metalsmith.metadata(), done) - } -} - -/** - * Template in place plugin. - * - * @param {Object} files - * @param {Metalsmith} metalsmith - * @param {Function} done - */ - -function renderTemplateFiles (skipInterpolation) { - skipInterpolation = typeof skipInterpolation === 'string' - ? [skipInterpolation] - : skipInterpolation - return (files, metalsmith, done) => { - const keys = Object.keys(files) - const metalsmithMetadata = metalsmith.metadata() - async.each(keys, (file, next) => { - // skipping files with skipInterpolation option - if (skipInterpolation && multimatch([file], skipInterpolation, { dot: true }).length) { - return next() - } - const str = files[file].contents.toString() - // do not attempt to render files that do not have mustaches - if (!/{{([^{}]+)}}/g.test(str)) { - return next() - } - render(str, metalsmithMetadata, (err, res) => { - if (err) { - err.message = `[${file}] ${err.message}` - return next(err) - } - files[file].contents = new Buffer(res) - next() - }) - }, done) - } -} - -/** - * Display template complete message. - * - * @param {String} message - * @param {Object} data - */ - -function logMessage (message, data) { - if (!message) return - render(message, data, (err, res) => { - if (err) { - console.error('\n Error when rendering template complete message: ' + err.message.trim()) - } else { - console.log('\n' + res.split(/\r?\n/g).map(line => ' ' + line).join('\n')) - } - }) -} diff --git a/lib/git-user.js b/lib/git-user.js deleted file mode 100644 index 4583b0f9f0..0000000000 --- a/lib/git-user.js +++ /dev/null @@ -1,15 +0,0 @@ -const exec = require('child_process').execSync - -module.exports = () => { - let name - let email - - try { - name = exec('git config --get user.name') - email = exec('git config --get user.email') - } catch (e) {} - - name = name && JSON.stringify(name.toString().trim()).slice(1, -1) - email = email && (' <' + email.toString().trim() + '>') - return (name || '') + (email || '') -} diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000000..1908517b5f --- /dev/null +++ b/lib/index.js @@ -0,0 +1,45 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Model", { + enumerable: true, + get: function () { + return _Model.default; + } +}); +Object.defineProperty(exports, "Tensor", { + enumerable: true, + get: function () { + return _Tensor.default; + } +}); +exports.testUtils = exports.layers = exports.activations = exports.GPU_SUPPORT = void 0; + +require("@babel/polyfill"); + +var _Model = _interopRequireDefault(require("./Model")); + +var _Tensor = _interopRequireDefault(require("./Tensor")); + +var _WebGL = require("./WebGL2"); + +var activations = _interopRequireWildcard(require("./activations")); + +exports.activations = activations; + +var layers = _interopRequireWildcard(require("./layers")); + +exports.layers = layers; + +var testUtils = _interopRequireWildcard(require("./utils/testUtils")); + +exports.testUtils = testUtils; + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const GPU_SUPPORT = _WebGL.webgl2.isSupported; +exports.GPU_SUPPORT = GPU_SUPPORT; \ No newline at end of file diff --git a/lib/layers/InputLayer.js b/lib/layers/InputLayer.js new file mode 100644 index 0000000000..765af7a558 --- /dev/null +++ b/lib/layers/InputLayer.js @@ -0,0 +1,83 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); + +var _Layer = _interopRequireDefault(require("../Layer")); + +var _Tensor = _interopRequireDefault(require("../Tensor")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class InputLayer extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'InputLayer'; + const { + shape = [] + } = attrs; + this.shape = attrs.batch_input_shape && attrs.batch_input_shape.length ? attrs.batch_input_shape.slice(1) : shape; + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + + if (!(0, _isEqual2.default)(this.inputShape, this.shape)) { + this.throwError(`input tensor shape ${x.tensor.shape} does not match specified shape ${this.shape}.`); + } + + this.output = new _Tensor.default(x.tensor.data, x.tensor.shape); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + this.inputShape = x.tensor.shape; + } else { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + this.inputShape = x.tensor.shape; + } + } + + if (!(0, _isEqual2.default)(this.inputShape, this.shape)) { + this.throwError(`input tensor shape ${x.tensor.shape} does not match specified shape ${this.shape}.`); + } + + if (!x.glTexture) { + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } else if (x.tensor.shape.length > 2) { + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + } + + this.output = x; + } + +} + +exports.default = InputLayer; \ No newline at end of file diff --git a/lib/layers/advanced_activations/ELU.js b/lib/layers/advanced_activations/ELU.js new file mode 100644 index 0000000000..9ab1acb687 --- /dev/null +++ b/lib/layers/advanced_activations/ELU.js @@ -0,0 +1,126 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform float alpha;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = max(v, 0.0) + alpha * (exp(min(v, 0.0)) - 1.0);\r\n}\r\n"; + +class ELU extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + + _initialiseProps.call(this); + + this.layerClass = 'ELU'; + const { + alpha = 1.0 + } = attrs; + this.alpha = alpha; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = x; + + this._compute(this.output.tensor, this.alpha); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.alpha, + type: 'float', + name: 'alpha' + }], + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = ELU; + +var _initialiseProps = function () { + Object.defineProperty(this, "_compute", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'scalar'], + body: function (_x, alpha) { + _x = Math.max(_x, 0) + alpha * (Math.exp(Math.min(_x, 0)) - 1); + } + }) + }); +}; \ No newline at end of file diff --git a/lib/layers/advanced_activations/LeakyReLU.js b/lib/layers/advanced_activations/LeakyReLU.js new file mode 100644 index 0000000000..7c5a9bf761 --- /dev/null +++ b/lib/layers/advanced_activations/LeakyReLU.js @@ -0,0 +1,110 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _activations = require("../../activations"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform float alpha;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = max(v, 0.0) + alpha * min(v, 0.0);\r\n}\r\n"; + +class LeakyReLU extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'LeakyReLU'; + const { + alpha = 0.3 + } = attrs; + this.alpha = alpha; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = x; + (0, _activations.relu)(this.output, { + alpha: this.alpha + }); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.alpha, + type: 'float', + name: 'alpha' + }], + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = LeakyReLU; \ No newline at end of file diff --git a/lib/layers/advanced_activations/PReLU.js b/lib/layers/advanced_activations/PReLU.js new file mode 100644 index 0000000000..7ad0ba94bb --- /dev/null +++ b/lib/layers/advanced_activations/PReLU.js @@ -0,0 +1,115 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform sampler2D alpha;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n vec4 a = texture(alpha, vec2(outTex.x, outTex.y));\r\n outColor = max(v, 0.0) + a * min(v, 0.0);\r\n}\r\n"; + +class PReLU extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + Object.defineProperty(this, "_compute", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array'], + body: function (_x, alpha) { + _x = Math.max(_x, 0) + alpha * Math.min(_x, 0); + } + }) + }); + this.layerClass = 'PReLU'; + this.params = ['alpha']; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = x; + + this._compute(this.output.tensor, this.weights['alpha'].tensor); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.weights['alpha'], + name: 'alpha' + }], + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = PReLU; \ No newline at end of file diff --git a/lib/layers/advanced_activations/ThresholdedReLU.js b/lib/layers/advanced_activations/ThresholdedReLU.js new file mode 100644 index 0000000000..a909c56d3c --- /dev/null +++ b/lib/layers/advanced_activations/ThresholdedReLU.js @@ -0,0 +1,126 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _cwise = _interopRequireDefault(require("cwise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform float theta;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n vec4 v = texture(x, vec2(outTex.x, outTex.y));\r\n outColor = v * float(greaterThan(v, vec4(theta)));\r\n}\r\n"; + +class ThresholdedReLU extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + + _initialiseProps.call(this); + + this.layerClass = 'ThresholdedReLU'; + const { + theta = 1 + } = attrs; + this.theta = theta; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = x; + + this._compute(this.output.tensor, this.theta); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.theta, + type: 'float', + name: 'theta' + }], + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = ThresholdedReLU; + +var _initialiseProps = function () { + Object.defineProperty(this, "_compute", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'scalar'], + body: function (_x, theta) { + _x = _x * Number(_x > theta); + } + }) + }); +}; \ No newline at end of file diff --git a/lib/layers/advanced_activations/index.js b/lib/layers/advanced_activations/index.js new file mode 100644 index 0000000000..2acd8b6d96 --- /dev/null +++ b/lib/layers/advanced_activations/index.js @@ -0,0 +1,39 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "LeakyReLU", { + enumerable: true, + get: function () { + return _LeakyReLU.default; + } +}); +Object.defineProperty(exports, "PReLU", { + enumerable: true, + get: function () { + return _PReLU.default; + } +}); +Object.defineProperty(exports, "ELU", { + enumerable: true, + get: function () { + return _ELU.default; + } +}); +Object.defineProperty(exports, "ThresholdedReLU", { + enumerable: true, + get: function () { + return _ThresholdedReLU.default; + } +}); + +var _LeakyReLU = _interopRequireDefault(require("./LeakyReLU")); + +var _PReLU = _interopRequireDefault(require("./PReLU")); + +var _ELU = _interopRequireDefault(require("./ELU")); + +var _ThresholdedReLU = _interopRequireDefault(require("./ThresholdedReLU")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/convolutional/Conv1D.js b/lib/layers/convolutional/Conv1D.js new file mode 100644 index 0000000000..3636d59a49 --- /dev/null +++ b/lib/layers/convolutional/Conv1D.js @@ -0,0 +1,118 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _Conv2D = _interopRequireDefault(require("./Conv2D")); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarraySqueeze = _interopRequireDefault(require("ndarray-squeeze")); + +var _ndarrayUnsqueeze = _interopRequireDefault(require("ndarray-unsqueeze")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Conv1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Conv1D'; + const { + filters = 1, + kernel_size = 1, + strides = 1, + padding = 'valid', + dilation_rate = 1, + activation = 'linear', + use_bias = true + } = attrs; + + if (padding !== 'valid' && padding !== 'same') { + this.throwError('Invalid padding.'); + } + + if (dilation_rate !== 1 && strides !== 1) { + this.throwError('Incompatible combination of dilation_rate with strides.'); + } + + this.use_bias = use_bias; + this.params = this.use_bias ? ['kernel', 'bias'] : ['kernel']; + const conv2dAttrs = { + filters, + kernel_size: [kernel_size, 1], + strides: [strides, 1], + padding, + data_format: 'channels_first', + dilation_rate, + activation, + use_bias + }; + this._conv2dAttrs = conv2dAttrs; + this._conv2d = new _Conv2D.default(Object.assign(conv2dAttrs, { + gpu: attrs.gpu + })); + } + + setWeights(weightsArr) { + weightsArr[0].tensor = (0, _ndarrayUnsqueeze.default)(weightsArr[0].tensor).transpose(2, 1, 0, 3); + + this._conv2d.setWeights(weightsArr); + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const input = new _Tensor.default(x.tensor.data, x.tensor.shape); + input.tensor = (0, _ndarrayUnsqueeze.default)(input.tensor).transpose(0, 2, 1); + + const conv2dOutput = this._conv2d.call(input); + + this.outputShape = [0, 2].map(i => this._conv2d.outputShape[i]); + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor, (0, _ndarraySqueeze.default)(conv2dOutput.tensor).transpose(1, 0, 2)); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const inputShape = x.tensor.shape; + const input = new _Tensor.default([], inputShape); + Object.assign(input, x); + input.glTextureShape = inputShape; + input.is2DReshaped = true; + input.originalShape = [inputShape[0], 1, inputShape[1]]; + input.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(input.originalShape, false, -1); + this.output = this._conv2d.call(input); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Conv1D; \ No newline at end of file diff --git a/lib/layers/convolutional/Conv2D.js b/lib/layers/convolutional/Conv2D.js new file mode 100644 index 0000000000..f61e049c98 --- /dev/null +++ b/lib/layers/convolutional/Conv2D.js @@ -0,0 +1,457 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var activations = _interopRequireWildcard(require("../../activations")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; +const mapInputFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 inputSize = textureSize(x, 0);\r\n ivec2 outputSize = textureSize(indexMap, 0);\r\n int out_x = int(float(outputSize[0]) * outTex.x);\r\n int out_y = int(float(outputSize[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n int fragmentIndex = int(floor(float(rowIndex) / float(inputSize[1])));\r\n rowIndex = int(mod(float(rowIndex), float(inputSize[1])));\r\n colIndex = fragmentIndex * inputCols + colIndex;\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; + +class Conv2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Conv2D'; + const { + filters = 1, + kernel_size = [3, 3], + strides = [1, 1], + padding = 'valid', + data_format = 'channels_last', + dilation_rate = [1, 1], + activation = 'linear', + use_bias = true + } = attrs; + + if (Array.isArray(kernel_size)) { + this.kernelShape = [filters, ...kernel_size]; + } else { + this.kernelShape = [filters, kernel_size, kernel_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else { + this.strides = [strides, strides]; + } + + if (padding === 'valid' || padding === 'same') { + this.padding = padding; + } else { + this.throwError('Invalid padding.'); + } + + if (data_format === 'channels_last' || data_format === 'channels_first') { + this.dataFormat = data_format; + } else { + this.throwError('Only channels_last and channels_first data formats are allowed.'); + } + + if (Array.isArray(dilation_rate)) { + this.dilationRate = dilation_rate; + } else { + this.dilationRate = [dilation_rate, dilation_rate]; + } + + if ((this.dilationRate[0] !== 1 || this.dilationRate[1] !== 1) && (this.strides[0] !== 1 || this.strides[1] !== 1)) { + this.throwError(`Incompatible combination of dilation_rate with strides.`); + } + + this.activation = activation; + this.activationFunc = activations[activation]; + this.useBias = use_bias; + this.params = this.useBias ? ['kernel', 'bias'] : ['kernel']; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + this.mapInputFragmentsProgram = _WebGL.webgl2.compileProgram(mapInputFragmentsProgramSource); + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + setWeights(weightsArr) { + if (this.dataFormat === 'channels_first') { + weightsArr[0].tensor = weightsArr[0].tensor.transpose(2, 3, 1, 0); + } + + super.setWeights(weightsArr, false); + + this._w2row(); + + if (this.gpu) { + this.weights['kernel'] = this.wRowsMat; + this.weights['kernel'].createGLTexture({ + type: '2d', + format: 'float' + }); + + if (this.useBias) { + this.weights['bias'].createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _calcOutputShape(inputShape) { + if (this.outputShape && this.inputPadding) { + return; + } + + const inputRows = inputShape[0]; + const inputCols = inputShape[1]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const nbRowDilated = nbRow + (nbRow - 1) * (this.dilationRate[0] - 1); + const nbColDilated = nbCol + (nbCol - 1) * (this.dilationRate[1] - 1); + const outputRows = this.padding === 'same' ? Math.floor((inputRows + this.strides[0] - 1) / this.strides[0]) : Math.floor((inputRows - nbRowDilated + this.strides[0]) / this.strides[0]); + const outputCols = this.padding === 'same' ? Math.floor((inputCols + this.strides[1] - 1) / this.strides[1]) : Math.floor((inputCols - nbColDilated + this.strides[1]) / this.strides[1]); + const outputChannels = nbFilter; + const paddingRow = this.padding === 'same' ? Math.max(0, Math.floor((outputRows - 1) * this.strides[0] + nbRowDilated - inputRows)) : 0; + const paddingCol = this.padding === 'same' ? Math.max(0, Math.floor((outputCols - 1) * this.strides[1] + nbColDilated - inputCols)) : 0; + const paddingRowBefore = Math.floor(paddingRow / 2); + const paddingRowAfter = paddingRow - paddingRowBefore; + const paddingColBefore = Math.floor(paddingCol / 2); + const paddingColAfter = paddingCol - paddingColBefore; + this.outputShape = [outputRows, outputCols, outputChannels]; + this.inputPadding = [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter]; + } + + _padInput(x, padValue = 0) { + if (this.padding === 'same') { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.inputPadding; + const newRows = inputRows + paddingRowBefore + paddingRowAfter; + const newCols = inputCols + paddingColBefore + paddingColAfter; + + const _x = new _Tensor.default([], [newRows, newCols, inputChannels]); + + if (padValue !== 0) { + _ndarrayOps.default.assigns(_x.tensor, padValue); + } + + _ndarrayOps.default.assign(_x.tensor.hi(inputRows + paddingRowBefore, inputCols + paddingColBefore, inputChannels).lo(paddingRowBefore, paddingColBefore, 0), x.tensor); + + return _x; + } + + return x; + } + + _im2col(x) { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + const nbRow = this.kernelShape[1]; + const nbCol = this.kernelShape[2]; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + const nbPatches = outputRows * outputCols; + const patchLen = nbRow * nbCol * inputChannels; + const nbRowDilated = nbRow + (nbRow - 1) * (this.dilationRate[0] - 1); + const nbColDilated = nbCol + (nbCol - 1) * (this.dilationRate[1] - 1); + + if (!this.imColsMat) { + this.imColsMat = new _Tensor.default([], [nbPatches, patchLen]); + } + + if (nbRowDilated === 1 && nbColDilated === 1 && this.strides[0] === 1 && this.strides[1] === 1) { + this.imColsMat.replaceTensorData(x.tensor.data); + return this.imColsMat; + } + + const patch = new _Tensor.default([], [nbRow, nbCol, inputChannels]); + let offset = 0; + + for (let i = 0, limit = inputRows - nbRowDilated; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputCols - nbColDilated; j <= limit; j += this.strides[1]) { + _ndarrayOps.default.assign(patch.tensor, x.tensor.hi(i + nbRowDilated, j + nbColDilated, inputChannels).lo(i, j, 0).step(this.dilationRate[0], this.dilationRate[1], 1)); + + this.imColsMat.tensor.data.set(patch.tensor.data, offset); + offset += patchLen; + } + } + + return this.imColsMat; + } + + _w2row() { + const inputChannels = this.weights['kernel'].tensor.shape[2]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const patchLen = nbRow * nbCol * inputChannels; + this.wRowsMat = new _Tensor.default([], [patchLen, nbFilter]); + const patch = new _Tensor.default([], [nbRow, nbCol, inputChannels]); + const patchRaveled = new _Tensor.default([], [patchLen]); + + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assign(patch.tensor, this.weights['kernel'].tensor.pick(null, null, null, n)); + + patchRaveled.replaceTensorData(patch.tensor.data); + + _ndarrayOps.default.assign(this.wRowsMat.tensor.pick(null, n), patchRaveled.tensor); + } + + return this.wRowsMat; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + x = this._padInput(x); + + this._im2col(x); + + const nbFilter = this.kernelShape[0]; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + const nbPatches = outputRows * outputCols; + const matMul = new _Tensor.default([], [nbPatches, nbFilter]); + + if (this.useBias) { + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assigns(matMul.tensor.pick(null, n), this.weights['bias'].tensor.get(n)); + } + } + + (0, _ndarrayGemm.default)(matMul.tensor, this.imColsMat.tensor, this.wRowsMat.tensor, 1, 1); + this.output = new _Tensor.default([], this.outputShape); + let outputChannelRaveled = new _Tensor.default([], [outputRows * outputCols]); + let outputChannel = new _Tensor.default([], [outputRows, outputCols]); + + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assign(outputChannelRaveled.tensor, matMul.tensor.pick(null, n)); + + outputChannel.replaceTensorData(outputChannelRaveled.tensor.data); + + _ndarrayOps.default.assign(this.output.tensor.pick(null, null, n), outputChannel.tensor); + } + + this.activationFunc(this.output); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + let [inputRows, inputCols, inputChannels] = this.inputShape; + let indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + + if (this.padding === 'same') { + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.inputPadding; + inputRows = inputRows + paddingRowBefore + paddingRowAfter; + inputCols = inputCols + paddingColBefore + paddingColAfter; + const padValue = -1; + indices = this._padInput(indices, padValue); + } + + const nbRow = this.kernelShape[1]; + const nbCol = this.kernelShape[2]; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + const nbPatches = outputRows * outputCols; + const patchLen = nbRow * nbCol * inputChannels; + const nbRowDilated = nbRow + (nbRow - 1) * (this.dilationRate[0] - 1); + const nbColDilated = nbCol + (nbCol - 1) * (this.dilationRate[1] - 1); + this.indexMap = new _Tensor.default([], [nbPatches, patchLen], { + type: Int32Array + }); + const indicesPatch = new _Tensor.default([], [nbRow, nbCol, inputChannels]); + let offset = 0; + + for (let i = 0, limit = inputRows - nbRowDilated; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputCols - nbColDilated; j <= limit; j += this.strides[1]) { + _ndarrayOps.default.assign(indicesPatch.tensor, indices.tensor.hi(i + nbRowDilated, j + nbColDilated, inputChannels).lo(i, j, 0).step(this.dilationRate[0], this.dilationRate[1], 1)); + + this.indexMap.tensor.data.set(indicesPatch.tensor.data, offset); + offset += patchLen; + } + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + let outputTextureShape; + + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + + this._calcOutputShape(this.inputShape); + + this._createIndexMap(x.indicesForReshaped); + + outputTextureShape = [this.indexMap.glTextureShape[0], this.weights['kernel'].glTextureShape[1]]; + } else { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + x = this._padInput(x); + + this._im2col(x); + + this.imColsMat.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + outputTextureShape = [this.imColsMat.glTextureShape[0], this.weights['kernel'].glTextureShape[1]]; + } + + if (this.activation !== 'linear' && !this.outputPreactiv) { + this.outputPreactiv = new _Tensor.default([], outputTextureShape); + this.outputPreactiv.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.outputPreactiv.is2DReshaped = true; + this.outputPreactiv.originalShape = this.outputShape; + this.outputPreactiv.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (!this.output) { + this.output = new _Tensor.default([], outputTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this.outputShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (x.is2DReshaped || x.is2DSquareReshaped) { + const hasFragments = Boolean(x.glTextureFragments); + + if (hasFragments) { + x.convert2DRowFragmentedGLTextureToColStack(); + } + + if (!this.convProgram) { + const convProgramSource = (0, _createGLSLProgram.default)('conv2d', this.output.glTextureFragmentShape ? this.output.glTextureFragmentShape : this.output.glTextureShape, x.glTextureFragmentShape ? x.glTextureFragmentShape : x.glTextureShape, this.indexMap.glTextureFragmentShape ? this.indexMap.glTextureFragmentShape : this.indexMap.glTextureShape, this.useBias, hasFragments); + this.convProgram = _WebGL.webgl2.compileProgram(convProgramSource); + } + + _WebGL.webgl2.runProgram({ + program: this.convProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }, { + input: this.weights['kernel'], + name: 'kernel' + }, ...(this.useBias ? [{ + input: this.weights['bias'], + name: 'bias' + }] : [])], + supportsTextureFragments: true + }); + + if (hasFragments) { + x.removeGLTextureFragmentsAsColStack(); + } + } else { + const matMulInputs = [{ + input: this.imColsMat, + name: 'A' + }, { + input: this.weights['kernel'], + name: 'B' + }]; + + if (this.useBias) { + matMulInputs.push({ + input: this.weights['bias'], + name: 'C' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: matMulInputs, + uniforms: [{ + value: this.useBias ? 1 : 0, + type: 'bool', + name: 'addC' + }], + supportsTextureFragments: true + }); + } + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.output, + inputs: [{ + input: this.outputPreactiv, + name: 'x' + }], + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + } + +} + +exports.default = Conv2D; \ No newline at end of file diff --git a/lib/layers/convolutional/Conv2DTranspose.js b/lib/layers/convolutional/Conv2DTranspose.js new file mode 100644 index 0000000000..4a91d95b1c --- /dev/null +++ b/lib/layers/convolutional/Conv2DTranspose.js @@ -0,0 +1,471 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var activations = _interopRequireWildcard(require("../../activations")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _cwise = _interopRequireDefault(require("cwise")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; +const assignToRowIndicesMap = (0, _cwise.default)({ + args: [{ + blockIndices: -1 + }, 'scalar', 'scalar'], + body: function (x, rowIndex, size) { + for (let i = 0; i < size; i++) { + if (x[i] === -1) { + x[i] = rowIndex; + break; + } + } + } +}); +const assignToColIndicesMap = (0, _cwise.default)({ + args: [{ + blockIndices: -1 + }, 'array', 'scalar'], + body: function (x, colIndex, size) { + for (let i = 0; i < size; i++) { + if (x[i] === -1) { + x[i] = colIndex; + break; + } + } + } +}); + +class Conv2DTranspose extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Conv2DTranspose'; + const { + filters = 1, + kernel_size = [3, 3], + strides = [1, 1], + padding = 'valid', + data_format = 'channels_last', + activation = 'linear', + use_bias = true + } = attrs; + + if (Array.isArray(kernel_size)) { + this.kernelShape = [filters, ...kernel_size]; + } else { + this.kernelShape = [filters, kernel_size, kernel_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else { + this.strides = [strides, strides]; + } + + if (padding === 'valid' || padding === 'same') { + this.padding = padding; + } else { + this.throwError('Invalid padding.'); + } + + if (data_format === 'channels_last' || data_format === 'channels_first') { + this.dataFormat = data_format; + } else { + this.throwError('Only channels_last and channels_first data formats are allowed.'); + } + + this.activation = activation; + this.activationFunc = activations[activation]; + this.useBias = use_bias; + this.params = this.useBias ? ['kernel', 'bias'] : ['kernel']; + + if (this.gpu) { + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + setWeights(weightsArr) { + if (this.dataFormat === 'channels_first') { + weightsArr[0].tensor = weightsArr[0].tensor.transpose(2, 3, 1, 0); + } + + super.setWeights(weightsArr, false); + + this._w2row(); + + if (this.gpu) { + this.weights['kernel'] = this.wRowsMat; + this.weights['kernel'].createGLTexture({ + type: '2d', + format: 'float' + }); + + if (this.useBias) { + this.weights['bias'].createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _calcOutputShape(inputShape) { + if (this.outputShape && this.outputPadding) { + return; + } + + const inputRows = inputShape[0]; + const inputCols = inputShape[1]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const outputRows = this.padding === 'same' ? inputRows * this.strides[0] : inputRows * this.strides[0] + Math.max(nbRow - this.strides[0], 0); + const outputCols = this.padding === 'same' ? inputCols * this.strides[1] : inputCols * this.strides[1] + Math.max(nbCol - this.strides[1], 0); + const outputChannels = nbFilter; + const paddingRow = this.padding === 'same' ? Math.max(0, Math.floor((inputRows - 1) * this.strides[0] + nbRow - outputRows)) : 0; + const paddingCol = this.padding === 'same' ? Math.max(0, Math.floor((inputCols - 1) * this.strides[1] + nbCol - outputCols)) : 0; + const paddingRowBefore = Math.floor(paddingRow / 2); + const paddingRowAfter = paddingRow - paddingRowBefore; + const paddingColBefore = Math.floor(paddingCol / 2); + const paddingColAfter = paddingCol - paddingColBefore; + this.outputShape = [outputRows, outputCols, outputChannels]; + this.outputPadding = [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter]; + } + + _im2col(x) { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + + if (!this.imColsMat) { + this.imColsMat = new _Tensor.default([], [inputRows * inputCols, inputChannels]); + } + + const channelRaveled = new _Tensor.default([], [inputRows * inputCols]); + const channel = new _Tensor.default([], [inputRows, inputCols]); + + for (let c = 0; c < inputChannels; c++) { + _ndarrayOps.default.assign(channel.tensor, x.tensor.pick(null, null, c)); + + channelRaveled.replaceTensorData(channel.tensor.data); + + _ndarrayOps.default.assign(this.imColsMat.tensor.pick(null, c), channelRaveled.tensor); + } + + return this.imColsMat; + } + + _w2row() { + const [nbRow, nbCol, nbFilter, inputChannels] = this.weights['kernel'].tensor.shape; + this.wRowsMat = new _Tensor.default([], [inputChannels, nbRow * nbCol * nbFilter]); + const channelRaveled = new _Tensor.default([], [nbRow * nbCol * nbFilter]); + const channel = new _Tensor.default([], [nbRow, nbCol, nbFilter]); + + for (let c = 0; c < inputChannels; c++) { + _ndarrayOps.default.assign(channel.tensor, this.weights['kernel'].tensor.pick(null, null, null, c)); + + channelRaveled.replaceTensorData(channel.tensor.data); + + _ndarrayOps.default.assign(this.wRowsMat.tensor.pick(c, null), channelRaveled.tensor); + } + + return this.wRowsMat; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + this._im2col(x); + + const inputRows = x.tensor.shape[0]; + const inputCols = x.tensor.shape[1]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const matMul = new _Tensor.default([], [inputRows * inputCols, nbRow * nbCol * nbFilter]); + (0, _ndarrayGemm.default)(matMul.tensor, this.imColsMat.tensor, this.wRowsMat.tensor, 1, 1); + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.outputPadding; + this.output = new _Tensor.default([], this.outputShape); + let outputPadded = new _Tensor.default([], [this.outputShape[0] + paddingRowBefore + paddingRowAfter, this.outputShape[1] + paddingColBefore + paddingColAfter, this.outputShape[2]]); + const patchShape = [nbRow, nbCol, nbFilter]; + let patch = new _Tensor.default([], patchShape); + let patchRaveled = new _Tensor.default([], [nbRow * nbCol * nbFilter]); + let index = 0; + + for (let i = 0; i < inputRows; i++) { + for (let j = 0; j < inputCols; j++) { + _ndarrayOps.default.assign(patchRaveled.tensor, matMul.tensor.pick(index, null)); + + patch.replaceTensorData(patchRaveled.tensor.data); + const iOutPos = i * this.strides[0]; + const jOutPos = j * this.strides[1]; + + _ndarrayOps.default.addeq(outputPadded.tensor.hi(iOutPos + nbRow, jOutPos + nbCol, this.outputShape[2]).lo(iOutPos, jOutPos, 0), patch.tensor); + + index += 1; + } + } + + _ndarrayOps.default.assign(this.output.tensor, outputPadded.tensor.hi(this.outputShape[0] + paddingRowBefore, this.outputShape[1] + paddingColBefore, this.outputShape[2]).lo(paddingRowBefore, paddingColBefore, 0)); + + if (this.useBias) { + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.addseq(this.output.tensor.pick(null, null, n), this.weights['bias'].tensor.get(n)); + } + } + + this.activationFunc(this.output); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const inputRows = this.inputShape[0]; + const inputCols = this.inputShape[1]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.outputPadding; + const effectiveKernelSize = (nbRow - this.strides[0] + 1) * (nbCol - this.strides[1] + 1); + const indicesMapShape = [this.outputShape[0], this.outputShape[1], effectiveKernelSize]; + const indicesMapShapePadded = [this.outputShape[0] + paddingRowBefore + paddingRowAfter, this.outputShape[1] + paddingColBefore + paddingColAfter, effectiveKernelSize]; + const outputRowIndicesMap = new _Tensor.default([], indicesMapShape, { + type: Int32Array + }); + const outputColIndicesMap = new _Tensor.default([], indicesMapShape, { + type: Int32Array + }); + const outputRowIndicesMapPadded = new _Tensor.default([], indicesMapShapePadded, { + type: Int32Array + }); + const outputColIndicesMapPadded = new _Tensor.default([], indicesMapShapePadded, { + type: Int32Array + }); + + _ndarrayOps.default.assigns(outputRowIndicesMap.tensor, -1); + + _ndarrayOps.default.assigns(outputColIndicesMap.tensor, -1); + + _ndarrayOps.default.assigns(outputRowIndicesMapPadded.tensor, -1); + + _ndarrayOps.default.assigns(outputColIndicesMapPadded.tensor, -1); + + const matMulColIndicesPatch = new _Tensor.default([], [nbRow, nbCol, nbFilter], { + type: Int32Array + }); + + for (let i = 0; i < nbRow * nbCol * nbFilter; i++) { + matMulColIndicesPatch.tensor.data[i] = i; + } + + for (let i = 0; i < inputRows; i++) { + for (let j = 0; j < inputCols; j++) { + const matMulRowIndex = i * inputCols + j; + const iOutPos = i * this.strides[0]; + const jOutPos = j * this.strides[1]; + assignToRowIndicesMap(outputRowIndicesMapPadded.tensor.hi(iOutPos + nbRow, jOutPos + nbCol, effectiveKernelSize).lo(iOutPos, jOutPos, 0), matMulRowIndex, effectiveKernelSize); + assignToColIndicesMap(outputColIndicesMapPadded.tensor.hi(iOutPos + nbRow, jOutPos + nbCol, effectiveKernelSize).lo(iOutPos, jOutPos, 0), matMulColIndicesPatch.tensor.pick(null, null, 0), effectiveKernelSize); + } + } + + _ndarrayOps.default.assign(outputRowIndicesMap.tensor, outputRowIndicesMapPadded.tensor.hi(this.outputShape[0] + paddingRowBefore, this.outputShape[1] + paddingColBefore, effectiveKernelSize).lo(paddingRowBefore, paddingColBefore, 0)); + + _ndarrayOps.default.assign(outputColIndicesMap.tensor, outputColIndicesMapPadded.tensor.hi(this.outputShape[0] + paddingRowBefore, this.outputShape[1] + paddingColBefore, effectiveKernelSize).lo(paddingRowBefore, paddingColBefore, 0)); + + const tiledIndicesMapShape = [this.outputShape[0] * this.outputShape[1], effectiveKernelSize]; + this.indexMap = new _Tensor.default([], tiledIndicesMapShape, { + type: Int32Array + }); + const channelData = new _Tensor.default([], [effectiveKernelSize], { + type: Int32Array + }); + + for (let i = 0; i < this.outputShape[0]; i++) { + for (let j = 0; j < this.outputShape[1]; j++) { + for (let k = 0; k < effectiveKernelSize; k++) { + const rowIndex = outputRowIndicesMap.tensor.get(i, j, k); + const colIndex = outputColIndicesMap.tensor.get(i, j, k); + + if (rowIndex !== -1 && colIndex !== -1) { + channelData.tensor.set(k, rowIndex * this.weights['kernel'].glTextureShape[1] + colIndex); + } else { + channelData.tensor.set(k, -1); + } + } + + _ndarrayOps.default.assign(this.indexMap.tensor.pick(i * this.outputShape[1] + j, null), channelData.tensor); + } + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + + this._calcOutputShape(this.inputShape); + } else { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + this._im2col(x); + + this.imColsMat.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + const input = x.is2DReshaped || x.is2DSquareReshaped ? x : this.imColsMat; + + if (!this.matMulResult) { + const outputTextureShape = [input.glTextureShape[0], this.weights['kernel'].glTextureShape[1]]; + this.matMulResult = new _Tensor.default([], outputTextureShape); + this.matMulResult.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (this.activation !== 'linear' && !this.outputPreactiv) { + const outputTextureShape = [this.outputShape[0] * this.outputShape[1], this.outputShape[2]]; + this.outputPreactiv = new _Tensor.default([], outputTextureShape); + this.outputPreactiv.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.outputPreactiv.is2DReshaped = true; + this.outputPreactiv.originalShape = this.outputShape; + this.outputPreactiv.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (!this.output) { + const outputTextureShape = [this.outputShape[0] * this.outputShape[1], this.outputShape[2]]; + this.output = new _Tensor.default([], outputTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this.outputShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.matMulResult, + inputs: [{ + input: input, + name: 'A' + }, { + input: this.weights['kernel'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }], + supportsTextureFragments: true + }); + + this._createIndexMap(); + + const hasFragments = Boolean(this.matMulResult.glTextureFragments); + + if (hasFragments) { + this.matMulResult.convert2DRowFragmentedGLTextureToColStack(); + } + + if (!this.convTransposeProgram) { + const convTransposeProgramSource = (0, _createGLSLProgram.default)('conv2dTranspose', this.output.glTextureFragmentShape ? this.output.glTextureFragmentShape : this.output.glTextureShape, this.matMulResult.glTextureFragmentShape ? this.matMulResult.glTextureFragmentShape : this.matMulResult.glTextureShape, this.indexMap.glTextureFragmentShape ? this.indexMap.glTextureFragmentShape : this.indexMap.glTextureShape, this.useBias, hasFragments); + this.convTransposeProgram = _WebGL.webgl2.compileProgram(convTransposeProgramSource); + } + + _WebGL.webgl2.runProgram({ + program: this.convTransposeProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: [{ + input: this.matMulResult, + name: 'matMulResult' + }, { + input: this.indexMap, + name: 'indexMap' + }, ...(this.useBias ? [{ + input: this.weights['bias'], + name: 'bias' + }] : [])], + supportsTextureFragments: true + }); + + if (hasFragments) { + this.matMulResult.removeGLTextureFragmentsAsColStack(); + } + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.output, + inputs: [{ + input: this.outputPreactiv, + name: 'x' + }], + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + } + +} + +exports.default = Conv2DTranspose; \ No newline at end of file diff --git a/lib/layers/convolutional/Conv3D.js b/lib/layers/convolutional/Conv3D.js new file mode 100644 index 0000000000..50c83a0686 --- /dev/null +++ b/lib/layers/convolutional/Conv3D.js @@ -0,0 +1,476 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var activations = _interopRequireWildcard(require("../../activations")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; +const mapInputFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 inputSize = textureSize(x, 0);\r\n ivec2 outputSize = textureSize(indexMap, 0);\r\n int out_x = int(float(outputSize[0]) * outTex.x);\r\n int out_y = int(float(outputSize[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n int fragmentIndex = int(floor(float(rowIndex) / float(inputSize[1])));\r\n rowIndex = int(mod(float(rowIndex), float(inputSize[1])));\r\n colIndex = fragmentIndex * inputCols + colIndex;\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; + +class Conv3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Conv3D'; + const { + filters = 1, + kernel_size = [1, 1, 1], + strides = [1, 1, 1], + padding = 'valid', + data_format = 'channels_last', + dilation_rate = [1, 1, 1], + activation = 'linear', + use_bias = true + } = attrs; + + if (Array.isArray(kernel_size)) { + this.kernelShape = [filters, ...kernel_size]; + } else { + this.kernelShape = [filters, kernel_size, kernel_size, kernel_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else { + this.strides = [strides, strides, strides]; + } + + if (padding === 'valid' || padding === 'same') { + this.padding = padding; + } else { + this.throwError('Invalid padding.'); + } + + if (data_format === 'channels_last' || data_format === 'channels_first') { + this.dataFormat = data_format; + } else { + this.throwError('Only channels_last and channels_first data formats are allowed.'); + } + + if (Array.isArray(dilation_rate)) { + this.dilationRate = dilation_rate; + } else { + this.dilationRate = [dilation_rate, dilation_rate, dilation_rate]; + } + + if ((this.dilationRate[0] !== 1 || this.dilationRate[1] !== 1 || this.dilationRate[2] !== 1) && (this.strides[0] !== 1 || this.strides[1] !== 1 || this.strides[2] !== 1)) { + this.throwError('Incompatible combination of dilation_rate with strides.'); + } + + this.activation = activation; + this.activationFunc = activations[activation]; + this.useBias = use_bias; + this.params = this.useBias ? ['kernel', 'bias'] : ['kernel']; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + this.mapInputFragmentsProgram = _WebGL.webgl2.compileProgram(mapInputFragmentsProgramSource); + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + setWeights(weightsArr) { + if (this.dataFormat === 'channels_first') { + weightsArr[0].tensor = weightsArr[0].tensor.transpose(2, 3, 4, 1, 0); + } + + super.setWeights(weightsArr, false); + + this._w2row(); + + if (this.gpu) { + this.weights['kernel'] = this.wRowsMat; + this.weights['kernel'].createGLTexture({ + type: '2d', + format: 'float' + }); + + if (this.useBias) { + this.weights['bias'].createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _calcOutputShape(inputShape) { + if (this.outputShape && this.inputPadding) { + return; + } + + const inputDim1 = inputShape[0]; + const inputDim2 = inputShape[1]; + const inputDim3 = inputShape[2]; + const [nbFilter, kernelDim1, kernelDim2, kernelDim3] = this.kernelShape; + const kernelDim1Dilated = kernelDim1 + (kernelDim1 - 1) * (this.dilationRate[0] - 1); + const kernelDim2Dilated = kernelDim2 + (kernelDim2 - 1) * (this.dilationRate[1] - 1); + const kernelDim3Dilated = kernelDim3 + (kernelDim3 - 1) * (this.dilationRate[2] - 1); + const outputDim1 = this.padding === 'same' ? Math.floor((inputDim1 + this.strides[0] - 1) / this.strides[0]) : Math.floor((inputDim1 - kernelDim1Dilated + this.strides[0]) / this.strides[0]); + const outputDim2 = this.padding === 'same' ? Math.floor((inputDim2 + this.strides[1] - 1) / this.strides[1]) : Math.floor((inputDim2 - kernelDim2Dilated + this.strides[1]) / this.strides[1]); + const outputDim3 = this.padding === 'same' ? Math.floor((inputDim3 + this.strides[2] - 1) / this.strides[2]) : Math.floor((inputDim3 - kernelDim3Dilated + this.strides[2]) / this.strides[2]); + const outputChannels = nbFilter; + const paddingDim1 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim1 - 1) * this.strides[0] + kernelDim1Dilated - inputDim1)) : 0; + const paddingDim2 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim2 - 1) * this.strides[1] + kernelDim2Dilated - inputDim2)) : 0; + const paddingDim3 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim3 - 1) * this.strides[2] + kernelDim3Dilated - inputDim3)) : 0; + const paddingDim1Before = Math.floor(paddingDim1 / 2); + const paddingDim1After = paddingDim1 - paddingDim1Before; + const paddingDim2Before = Math.floor(paddingDim2 / 2); + const paddingDim2After = paddingDim2 - paddingDim2Before; + const paddingDim3Before = Math.floor(paddingDim3 / 2); + const paddingDim3After = paddingDim3 - paddingDim3Before; + this.outputShape = [outputDim1, outputDim2, outputDim3, outputChannels]; + this.inputPadding = [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After]; + } + + _padInput(x, padValue = 0) { + if (this.padding === 'same') { + const [inputDim1, inputDim2, inputDim3, inputChannels] = x.tensor.shape; + const [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After] = this.inputPadding; + const newDim1 = inputDim1 + paddingDim1Before + paddingDim1After; + const newDim2 = inputDim2 + paddingDim2Before + paddingDim2After; + const newDim3 = inputDim3 + paddingDim3Before + paddingDim3After; + + const _x = new _Tensor.default([], [newDim1, newDim2, newDim3, inputChannels]); + + if (padValue !== 0) { + _ndarrayOps.default.assigns(_x.tensor, padValue); + } + + _ndarrayOps.default.assign(_x.tensor.hi(inputDim1 + paddingDim1Before, inputDim2 + paddingDim2Before, inputDim3 + paddingDim3Before, inputChannels).lo(paddingDim1Before, paddingDim2Before, paddingDim3Before, 0), x.tensor); + + return _x; + } + + return x; + } + + _vol2col(x) { + const [inputDim1, inputDim2, inputDim3, inputChannels] = x.tensor.shape; + const kernelDim1 = this.kernelShape[1]; + const kernelDim2 = this.kernelShape[2]; + const kernelDim3 = this.kernelShape[3]; + const outputDim1 = this.outputShape[0]; + const outputDim2 = this.outputShape[1]; + const outputDim3 = this.outputShape[2]; + const nbPatches = outputDim1 * outputDim2 * outputDim3; + const patchLen = kernelDim1 * kernelDim2 * kernelDim3 * inputChannels; + const kernelDim1Dilated = kernelDim1 + (kernelDim1 - 1) * (this.dilationRate[0] - 1); + const kernelDim2Dilated = kernelDim2 + (kernelDim2 - 1) * (this.dilationRate[1] - 1); + const kernelDim3Dilated = kernelDim3 + (kernelDim3 - 1) * (this.dilationRate[2] - 1); + + if (!this.volColsMat) { + this.volColsMat = new _Tensor.default([], [nbPatches, patchLen]); + } + + if (kernelDim1Dilated === 1 && kernelDim2Dilated === 1 && kernelDim3Dilated === 1 && this.strides[0] === 1 && this.strides[1] === 1 && this.strides[2] === 1) { + this.volColsMat.replaceTensorData(x.tensor.data); + return this.volColsMat; + } + + const patch = new _Tensor.default([], [kernelDim1, kernelDim2, kernelDim3, inputChannels]); + let offset = 0; + + for (let i = 0, limit = inputDim1 - kernelDim1Dilated; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputDim2 - kernelDim2Dilated; j <= limit; j += this.strides[1]) { + for (let k = 0, limit = inputDim3 - kernelDim3Dilated; k <= limit; k += this.strides[2]) { + _ndarrayOps.default.assign(patch.tensor, x.tensor.hi(i + kernelDim1Dilated, j + kernelDim2Dilated, k + kernelDim3Dilated, inputChannels).lo(i, j, k, 0).step(this.dilationRate[0], this.dilationRate[1], this.dilationRate[2], 1)); + + this.volColsMat.tensor.data.set(patch.tensor.data, offset); + offset += patchLen; + } + } + } + + return this.volColsMat; + } + + _w2row() { + const inputChannels = this.weights['kernel'].tensor.shape[3]; + const [nbFilter, kernelDim1, kernelDim2, kernelDim3] = this.kernelShape; + const patchLen = kernelDim1 * kernelDim2 * kernelDim3 * inputChannels; + this.wRowsMat = new _Tensor.default([], [patchLen, nbFilter]); + const patch = new _Tensor.default([], [kernelDim1, kernelDim2, kernelDim3, inputChannels]); + const patchRaveled = new _Tensor.default([], [patchLen]); + + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assign(patch.tensor, this.weights['kernel'].tensor.pick(null, null, null, null, n)); + + patchRaveled.replaceTensorData(patch.tensor.data); + + _ndarrayOps.default.assign(this.wRowsMat.tensor.pick(null, n), patchRaveled.tensor); + } + + return this.wRowsMat; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + x = this._padInput(x); + + this._vol2col(x); + + const nbFilter = this.kernelShape[0]; + const outputDim1 = this.outputShape[0]; + const outputDim2 = this.outputShape[1]; + const outputDim3 = this.outputShape[2]; + const nbPatches = outputDim1 * outputDim2 * outputDim3; + const matMul = new _Tensor.default([], [nbPatches, nbFilter]); + + if (this.useBias) { + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assigns(matMul.tensor.pick(null, n), this.weights['bias'].tensor.get(n)); + } + } + + (0, _ndarrayGemm.default)(matMul.tensor, this.volColsMat.tensor, this.wRowsMat.tensor, 1, 1); + this.output = new _Tensor.default([], this.outputShape); + let outputChannelRaveled = new _Tensor.default([], [outputDim1 * outputDim2 * outputDim3]); + let outputChannel = new _Tensor.default([], [outputDim1, outputDim2, outputDim3]); + + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assign(outputChannelRaveled.tensor, matMul.tensor.pick(null, n)); + + outputChannel.replaceTensorData(outputChannelRaveled.tensor.data); + + _ndarrayOps.default.assign(this.output.tensor.pick(null, null, null, n), outputChannel.tensor); + } + + this.activationFunc(this.output); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + let [inputDim1, inputDim2, inputDim3, inputChannels] = this.inputShape; + let indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + + if (this.padding === 'same') { + const [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After] = this.inputPadding; + inputDim1 = inputDim1 + paddingDim1Before + paddingDim1After; + inputDim2 = inputDim2 + paddingDim2Before + paddingDim2After; + inputDim3 = inputDim3 + paddingDim3Before + paddingDim3After; + const padValue = -1; + indices = this._padInput(indices, padValue); + } + + const kernelDim1 = this.kernelShape[1]; + const kernelDim2 = this.kernelShape[2]; + const kernelDim3 = this.kernelShape[3]; + const outputDim1 = this.outputShape[0]; + const outputDim2 = this.outputShape[1]; + const outputDim3 = this.outputShape[2]; + const nbPatches = outputDim1 * outputDim2 * outputDim3; + const patchLen = kernelDim1 * kernelDim2 * kernelDim3 * inputChannels; + const kernelDim1Dilated = kernelDim1 + (kernelDim1 - 1) * (this.dilationRate[0] - 1); + const kernelDim2Dilated = kernelDim2 + (kernelDim2 - 1) * (this.dilationRate[1] - 1); + const kernelDim3Dilated = kernelDim3 + (kernelDim3 - 1) * (this.dilationRate[2] - 1); + this.indexMap = new _Tensor.default([], [nbPatches, patchLen], { + type: Int32Array + }); + const indicesPatch = new _Tensor.default([], [kernelDim1, kernelDim2, kernelDim3, inputChannels]); + let offset = 0; + + for (let i = 0, limit = inputDim1 - kernelDim1Dilated; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputDim2 - kernelDim2Dilated; j <= limit; j += this.strides[1]) { + for (let k = 0, limit = inputDim3 - kernelDim3Dilated; k <= limit; k += this.strides[2]) { + _ndarrayOps.default.assign(indicesPatch.tensor, indices.tensor.hi(i + kernelDim1Dilated, j + kernelDim2Dilated, k + kernelDim3Dilated, inputChannels).lo(i, j, k, 0).step(this.dilationRate[0], this.dilationRate[1], this.dilationRate[2], 1)); + + this.indexMap.tensor.data.set(indicesPatch.tensor.data, offset); + offset += patchLen; + } + } + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + let outputTextureShape; + + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + + this._calcOutputShape(this.inputShape); + + this._createIndexMap(x.indicesForReshaped); + + outputTextureShape = [this.indexMap.glTextureShape[0], this.weights['kernel'].glTextureShape[1]]; + } else { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + x = this._padInput(x); + + this._vol2col(x); + + this.volColsMat.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + outputTextureShape = [this.volColsMat.glTextureShape[0], this.weights['kernel'].glTextureShape[1]]; + } + + if (this.activation !== 'linear' && !this.outputPreactiv) { + this.outputPreactiv = new _Tensor.default([], outputTextureShape); + this.outputPreactiv.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.outputPreactiv.is2DReshaped = true; + this.outputPreactiv.originalShape = this.outputShape; + this.outputPreactiv.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (!this.output) { + this.output = new _Tensor.default([], outputTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this.outputShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (x.is2DReshaped || x.is2DSquareReshaped) { + const hasFragments = Boolean(x.glTextureFragments); + + if (hasFragments) { + x.convert2DRowFragmentedGLTextureToColStack(); + } + + if (!this.convProgram) { + const convProgramSource = (0, _createGLSLProgram.default)('conv2d', this.output.glTextureFragmentShape ? this.output.glTextureFragmentShape : this.output.glTextureShape, x.glTextureFragmentShape ? x.glTextureFragmentShape : x.glTextureShape, this.indexMap.glTextureFragmentShape ? this.indexMap.glTextureFragmentShape : this.indexMap.glTextureShape, this.useBias, hasFragments); + this.convProgram = _WebGL.webgl2.compileProgram(convProgramSource); + } + + _WebGL.webgl2.runProgram({ + program: this.convProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }, { + input: this.weights['kernel'], + name: 'kernel' + }, ...(this.useBias ? [{ + input: this.weights['bias'], + name: 'bias' + }] : [])], + supportsTextureFragments: true + }); + + if (hasFragments) { + x.removeGLTextureFragmentsAsColStack(); + } + } else { + const matMulInputs = [{ + input: this.volColsMat, + name: 'A' + }, { + input: this.weights['kernel'], + name: 'B' + }]; + + if (this.useBias) { + matMulInputs.push({ + input: this.weights['bias'], + name: 'C' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: matMulInputs, + uniforms: [{ + value: this.useBias ? 1 : 0, + type: 'bool', + name: 'addC' + }], + supportsTextureFragments: true + }); + } + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.output, + inputs: [{ + input: this.outputPreactiv, + name: 'x' + }], + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + } + +} + +exports.default = Conv3D; \ No newline at end of file diff --git a/lib/layers/convolutional/Cropping1D.js b/lib/layers/convolutional/Cropping1D.js new file mode 100644 index 0000000000..15d96ade58 --- /dev/null +++ b/lib/layers/convolutional/Cropping1D.js @@ -0,0 +1,143 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class Cropping1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Cropping1D'; + const { + cropping = [0, 0] + } = attrs; + + if (Array.isArray(cropping)) { + this.cropping = cropping; + } else { + this.cropping = [cropping, cropping]; + } + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] - this.cropping[0] - this.cropping[1], this.inputShape[1]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor, x.tensor.hi(this.inputShape[0] - this.cropping[1], this.inputShape[2]).lo(this.cropping[0], 0)); + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesRow = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesCol = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.inputShape[0]; i++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, null), i); + } + + for (let j = 0; j < this.inputShape[1]; j++) { + _ndarrayOps.default.assigns(indicesCol.tensor.pick(null, j), j); + } + + _ndarrayOps.default.muls(indices.tensor, indicesRow.tensor, this.inputShape[1]); + + _ndarrayOps.default.addeq(indices.tensor, indicesCol.tensor); + + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = [this.cropping[0], 0]; + const sliceEnd = [this.inputShape[0] - this.cropping[1], this.inputShape[2]]; + + _ndarrayOps.default.assign(this.indexMap.tensor, indices.tensor.hi(...sliceEnd).lo(...sliceStart)); + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] - this.cropping[0] - this.cropping[1], this.inputShape[1]]; + + this._createIndexMap(); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Cropping1D; \ No newline at end of file diff --git a/lib/layers/convolutional/Cropping2D.js b/lib/layers/convolutional/Cropping2D.js new file mode 100644 index 0000000000..eb9825d794 --- /dev/null +++ b/lib/layers/convolutional/Cropping2D.js @@ -0,0 +1,144 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class Cropping2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Cropping2D'; + const { + cropping = [[0, 0], [0, 0]], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(cropping)) { + if (Array.isArray(cropping[0])) { + this.cropping = cropping; + } else { + this.cropping = [[cropping[0], cropping[0]], [cropping[1], cropping[1]]]; + } + } else { + this.cropping = [[cropping, cropping], [cropping, cropping]]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][0] - this.cropping[1][1], this.inputShape[2]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor, x.tensor.hi(this.inputShape[0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][1], this.inputShape[2]).lo(this.cropping[0][0], this.cropping[1][0], 0)); + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(2, 0, 1); + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = this.dataFormat === 'channels_first' ? [0, this.cropping[0][0], this.cropping[1][0]] : [this.cropping[0][0], this.cropping[1][0], 0]; + const sliceEnd = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] - this.cropping[0][1], this.inputShape[2] - this.cropping[1][1]] : [this.inputShape[0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][1], this.inputShape[2]]; + + _ndarrayOps.default.assign(this.indexMap.tensor, indices.tensor.hi(...sliceEnd).lo(...sliceStart)); + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[2] - this.cropping[1][0] - this.cropping[1][1]] : [this.inputShape[0] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][0] - this.cropping[1][1], this.inputShape[2]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = Cropping2D; \ No newline at end of file diff --git a/lib/layers/convolutional/Cropping3D.js b/lib/layers/convolutional/Cropping3D.js new file mode 100644 index 0000000000..a28b472fa8 --- /dev/null +++ b/lib/layers/convolutional/Cropping3D.js @@ -0,0 +1,144 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class Cropping3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Cropping3D'; + const { + cropping = [[0, 0], [0, 0], [0, 0]], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(cropping)) { + if (Array.isArray(cropping[0])) { + this.cropping = cropping; + } else { + this.cropping = [[cropping[0], cropping[0]], [cropping[1], cropping[1]], [cropping[2], cropping[2]]]; + } + } else { + this.cropping = [[cropping, cropping], [cropping, cropping], [cropping, cropping]]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][0] - this.cropping[1][1], this.inputShape[2] - this.cropping[2][0] - this.cropping[2][1], this.inputShape[3]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor, x.tensor.hi(this.inputShape[0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][1], this.inputShape[2] - this.cropping[2][1], this.inputShape[3]).lo(this.cropping[0][0], this.cropping[1][0], this.cropping[2][0], 0)); + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(3, 0, 1, 2); + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = this.dataFormat === 'channels_first' ? [0, this.cropping[0][0], this.cropping[1][0], this.cropping[2][0]] : [this.cropping[0][0], this.cropping[1][0], this.cropping[2][0], 0]; + const sliceEnd = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] - this.cropping[0][1], this.inputShape[2] - this.cropping[1][1], this.inputShape[3] - this.cropping[2][1]] : [this.inputShape[0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][1], this.inputShape[2] - this.cropping[2][1], this.inputShape[3]]; + + _ndarrayOps.default.assign(this.indexMap.tensor, indices.tensor.hi(...sliceEnd).lo(...sliceStart)); + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[2] - this.cropping[1][0] - this.cropping[1][1], this.inputShape[3] - this.cropping[2][0] - this.cropping[2][1]] : [this.inputShape[0] - this.cropping[0][0] - this.cropping[0][1], this.inputShape[1] - this.cropping[1][0] - this.cropping[1][1], this.inputShape[2] - this.cropping[2][0] - this.cropping[2][1], this.inputShape[3]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = Cropping3D; \ No newline at end of file diff --git a/lib/layers/convolutional/SeparableConv2D.js b/lib/layers/convolutional/SeparableConv2D.js new file mode 100644 index 0000000000..1b557064c8 --- /dev/null +++ b/lib/layers/convolutional/SeparableConv2D.js @@ -0,0 +1,366 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var activations = _interopRequireWildcard(require("../../activations")); + +var _WebGL = require("../../WebGL2"); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var _Conv2D = _interopRequireDefault(require("./Conv2D")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class _DepthwiseConv2D extends _Conv2D.default { + constructor(attrs = {}) { + super(attrs); + } + + _calcOutputShape(inputShape) { + super._calcOutputShape(inputShape); + + const nbFilter = this.kernelShape[0]; + const inputChannels = inputShape[2]; + this.outputShape[2] = nbFilter * inputChannels; + } + + _im2col(x) { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + const nbRow = this.kernelShape[1]; + const nbCol = this.kernelShape[2]; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + const nbPatches = outputRows * outputCols; + const patchLen = nbRow * nbCol; + + if (!this.imColsMat) { + this.imColsMat = new _Tensor.default([], [nbPatches * inputChannels, patchLen]); + } + + let patch = new _Tensor.default([], [nbRow, nbCol, 1]); + let offset = 0; + + for (let c = 0; c < inputChannels; c++) { + for (let i = 0, limit = inputRows - nbRow; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputCols - nbCol; j <= limit; j += this.strides[1]) { + _ndarrayOps.default.assign(patch.tensor, x.tensor.hi(i + nbRow, j + nbCol, c + 1).lo(i, j, c)); + + this.imColsMat.tensor.data.set(patch.tensor.data, offset); + offset += patchLen; + } + } + } + + return this.imColsMat; + } + + _w2row() { + const inputChannels = this.weights['kernel'].tensor.shape[2]; + const [nbFilter, nbRow, nbCol] = this.kernelShape; + const patchLen = nbRow * nbCol; + this.wRowsMat = new _Tensor.default([], [patchLen, nbFilter * inputChannels]); + let patch = new _Tensor.default([], [nbRow, nbCol]); + let patchRaveled = new _Tensor.default([], [patchLen]); + let p = 0; + + for (let c = 0; c < inputChannels; c++) { + for (let n = 0; n < nbFilter; n++) { + _ndarrayOps.default.assign(patch.tensor, this.weights['kernel'].tensor.pick(null, null, c, n)); + + patchRaveled.replaceTensorData(patch.tensor.data); + + _ndarrayOps.default.assign(this.wRowsMat.tensor.pick(null, p), patchRaveled.tensor); + + p += 1; + } + } + + return this.wRowsMat; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + + this._calcOutputShape(this.inputShape); + + x = this._padInput(x); + + this._im2col(x); + + const nbFilter = this.kernelShape[0]; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + const nbPatches = outputRows * outputCols; + const inputChannels = this.inputShape[2]; + const matMul = new _Tensor.default([], [nbPatches * inputChannels, nbFilter * inputChannels]); + (0, _ndarrayGemm.default)(matMul.tensor, this.imColsMat.tensor, this.wRowsMat.tensor, 1, 1); + this.output = new _Tensor.default([], this.outputShape); + const outputDataLength = outputRows * outputCols * nbFilter * inputChannels; + let dataFiltered = new Float32Array(outputDataLength); + + for (let c = 0; c < inputChannels; c++) { + for (let n = c * outputDataLength + c * nbFilter; n < (c + 1) * outputDataLength; n += nbFilter * inputChannels) { + for (let m = 0; m < nbFilter; m++) { + dataFiltered[n + m - c * outputDataLength] = matMul.tensor.data[n + m]; + } + } + } + + this.output.replaceTensorData(dataFiltered); + } + + _createOutputReshapeIndexMap() { + if (this.reshapeIndexMap) { + return; + } + + const nbFilter = this.kernelShape[0]; + const reshape = [this.outputShape[0] * this.outputShape[1], this.outputShape[2]]; + const reshapeRowIndices = new _Tensor.default([], reshape, { + type: Int32Array + }); + const reshapeColIndices = new _Tensor.default([], reshape, { + type: Int32Array + }); + this.reshapeIndexMap = new _Tensor.default([], reshape, { + type: Int32Array + }); + + for (let j = 0; j < reshape[1]; j++) { + for (let i = 0; i < reshape[0]; i++) { + _ndarrayOps.default.assigns(reshapeRowIndices.tensor.pick(i, j), i + Math.floor(j / nbFilter) * reshape[0]); + } + } + + for (let j = 0; j < reshape[1]; j++) { + _ndarrayOps.default.assigns(reshapeColIndices.tensor.pick(null, j), j); + } + + _ndarrayOps.default.muls(this.reshapeIndexMap.tensor, reshapeRowIndices.tensor, reshape[1]); + + _ndarrayOps.default.addeq(this.reshapeIndexMap.tensor, reshapeColIndices.tensor); + + this.reshapeIndexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + super._callGPU(x); + + this._createOutputReshapeIndexMap(); + + if (!this.outputReshaped) { + const reshape = [this.outputShape[0] * this.outputShape[1], this.outputShape[2]]; + this.outputReshaped = new _Tensor.default([], reshape); + this.outputReshaped.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.outputReshaped.is2DReshaped = true; + this.outputReshaped.originalShape = this.outputShape; + this.outputReshaped.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + if (this.output.glTextureFragments) { + this.output.convert2DRowFragmentedGLTextureToColStack(); + } + + _WebGL.webgl2.runProgram({ + program: this.output.glTextureFragments ? this.mapInputFragmentsProgram : this.mapInputProgram, + output: this.outputReshaped, + inputs: [{ + input: this.output, + name: 'x' + }, { + input: this.reshapeIndexMap, + name: 'indexMap' + }], + uniforms: [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'inputCols' + }], + supportsTextureFragments: true + }); + + if (this.output.glTextureFragments) { + this.output.removeGLTextureFragmentsAsColStack(); + } + } + +} + +class SeparableConv2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'SeparableConv2D'; + const { + filters = 1, + kernel_size = [1, 1], + strides = [1, 1], + padding = 'valid', + data_format = 'channels_last', + depth_multiplier = 1, + activation = 'linear', + use_bias = true + } = attrs; + + if (Array.isArray(kernel_size)) { + this.kernelShape = [filters, ...kernel_size]; + } else { + this.kernelShape = [filters, kernel_size, kernel_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else { + this.strides = [strides, strides]; + } + + if (padding === 'valid' || padding === 'same') { + this.padding = padding; + } else { + this.throwError('Invalid padding.'); + } + + if (data_format === 'channels_last' || data_format === 'channels_first') { + this.dataFormat = data_format; + } else { + this.throwError('Only channels_last and channels_first data formats are allowed.'); + } + + this.activation = activation; + this.activationFunc = activations[activation]; + + if (padding === 'valid' || padding === 'same') { + this.padding = padding; + } else { + this.throwError('Invalid padding.'); + } + + this.useBias = use_bias; + this.params = this.useBias ? ['depthwise_kernel', 'pointwise_kernel', 'bias'] : ['depthwise_kernel', 'pointwise_kernel']; + this.depthwiseConvAttrs = { + filters: depth_multiplier, + kernel_size: [this.kernelShape[1], this.kernelShape[2]], + strides: this.strides, + padding, + data_format, + activation: 'linear', + use_bias: false, + gpu: attrs.gpu + }; + this.pointwiseConvAttrs = { + filters, + kernel_size: [1, 1], + strides: [1, 1], + padding, + data_format, + activation: 'linear', + use_bias, + gpu: attrs.gpu + }; + + if (this.gpu) { + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + setWeights(weightsArr) { + this._depthwiseConv = new _DepthwiseConv2D(this.depthwiseConvAttrs); + + this._depthwiseConv.setWeights(weightsArr.slice(0, 1)); + + this._pointwiseConv = new _Conv2D.default(this.pointwiseConvAttrs); + + this._pointwiseConv.setWeights(weightsArr.slice(1, 3)); + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this._depthwiseConv._callCPU(x); + + this._pointwiseConv._callCPU(this._depthwiseConv.output); + + this.output = this._pointwiseConv.output; + this.activationFunc(this.output); + } + + _callGPU(x) { + this._depthwiseConv.outbound = [null]; + this._pointwiseConv.outbound = [null]; + + this._depthwiseConv._callGPU(x); + + this._pointwiseConv._callGPU(this._depthwiseConv.outputReshaped); + + if (this.activation === 'linear') { + this.output = this._pointwiseConv.output; + } else { + if (!this.output) { + this.output = new _Tensor.default([], this._pointwiseConv.output.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this._pointwiseConv.output.originalShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this._pointwiseConv.output.originalShape, false, -1); + } + + this.outputPreactiv = this._pointwiseConv.output; + + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.output, + inputs: [{ + input: this.outputPreactiv, + name: 'x' + }], + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + } + +} + +exports.default = SeparableConv2D; \ No newline at end of file diff --git a/lib/layers/convolutional/UpSampling1D.js b/lib/layers/convolutional/UpSampling1D.js new file mode 100644 index 0000000000..eda598eebf --- /dev/null +++ b/lib/layers/convolutional/UpSampling1D.js @@ -0,0 +1,140 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class UpSampling1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'UpSampling1D'; + const { + size = 2 + } = attrs; + this.size = size; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] * this.size, this.inputShape[1]]; + this.output = new _Tensor.default([], this.outputShape); + + for (let i = 0; i < this.size; i++) { + _ndarrayOps.default.assign(this.output.tensor.lo(i, 0).step(this.size, 1), x.tensor); + } + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesRow = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesCol = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.inputShape[0]; i++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, null), i); + } + + for (let j = 0; j < this.inputShape[1]; j++) { + _ndarrayOps.default.assigns(indicesCol.tensor.pick(null, j), j); + } + + _ndarrayOps.default.muls(indices.tensor, indicesRow.tensor, this.inputShape[1]); + + _ndarrayOps.default.addeq(indices.tensor, indicesCol.tensor); + + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.size; i++) { + _ndarrayOps.default.assign(this.indexMap.tensor.lo(i, 0).step(this.size, 1), indices.tensor); + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] * this.size, this.inputShape[1]]; + + this._createIndexMap(); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = UpSampling1D; \ No newline at end of file diff --git a/lib/layers/convolutional/UpSampling2D.js b/lib/layers/convolutional/UpSampling2D.js new file mode 100644 index 0000000000..bd032d24a8 --- /dev/null +++ b/lib/layers/convolutional/UpSampling2D.js @@ -0,0 +1,149 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class UpSampling2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'UpSampling2D'; + const { + size = [2, 2], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(size)) { + this.size = size; + } else { + this.size = [size, size]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] * this.size[0], this.inputShape[1] * this.size[1], this.inputShape[2]]; + this.output = new _Tensor.default([], this.outputShape); + + for (let i = 0; i < this.size[0]; i++) { + for (let j = 0; j < this.size[1]; j++) { + _ndarrayOps.default.assign(this.output.tensor.lo(i, j, 0).step(this.size[0], this.size[1], 1), x.tensor); + } + } + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(2, 0, 1); + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.size[0]; i++) { + for (let j = 0; j < this.size[1]; j++) { + const sliceStart = this.dataFormat === 'channels_first' ? [0, i, j] : [i, j, 0]; + const step = this.dataFormat === 'channels_first' ? [1, this.size[0], this.size[1]] : [this.size[0], this.size[1], 1]; + + _ndarrayOps.default.assign(this.indexMap.tensor.lo(...sliceStart).step(...step), indices.tensor); + } + } + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] * this.size[0], this.inputShape[2] * this.size[1]] : [this.inputShape[0] * this.size[0], this.inputShape[1] * this.size[1], this.inputShape[2]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = UpSampling2D; \ No newline at end of file diff --git a/lib/layers/convolutional/UpSampling3D.js b/lib/layers/convolutional/UpSampling3D.js new file mode 100644 index 0000000000..9ea2cd274e --- /dev/null +++ b/lib/layers/convolutional/UpSampling3D.js @@ -0,0 +1,153 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class UpSampling3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'UpSampling3D'; + const { + size = [2, 2, 2], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(size)) { + this.size = size; + } else { + this.size = [size, size, size]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] * this.size[0], this.inputShape[1] * this.size[1], this.inputShape[2] * this.size[2], this.inputShape[3]]; + this.output = new _Tensor.default([], this.outputShape); + + for (let i = 0; i < this.size[0]; i++) { + for (let j = 0; j < this.size[1]; j++) { + for (let k = 0; k < this.size[2]; k++) { + _ndarrayOps.default.assign(this.output.tensor.lo(i, j, k, 0).step(this.size[0], this.size[1], this.size[2], 1), x.tensor); + } + } + } + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(3, 0, 1, 2); + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.size[0]; i++) { + for (let j = 0; j < this.size[1]; j++) { + for (let k = 0; k < this.size[2]; k++) { + const sliceStart = this.dataFormat === 'channels_first' ? [0, i, j, k] : [i, j, k, 0]; + const step = this.dataFormat === 'channels_first' ? [1, this.size[0], this.size[1], this.size[2]] : [this.size[0], this.size[1], this.size[2], 1]; + + _ndarrayOps.default.assign(this.indexMap.tensor.lo(...sliceStart).step(...step), indices.tensor); + } + } + } + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] * this.size[0], this.inputShape[2] * this.size[1], this.inputShape[3] * this.size[2]] : [this.inputShape[0] * this.size[0], this.inputShape[1] * this.size[1], this.inputShape[2] * this.size[2], this.inputShape[3]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = UpSampling3D; \ No newline at end of file diff --git a/lib/layers/convolutional/ZeroPadding1D.js b/lib/layers/convolutional/ZeroPadding1D.js new file mode 100644 index 0000000000..62c841cce0 --- /dev/null +++ b/lib/layers/convolutional/ZeroPadding1D.js @@ -0,0 +1,145 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class ZeroPadding1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'ZeroPadding1D'; + const { + padding = [1, 1] + } = attrs; + + if (Array.isArray(padding)) { + this.padding = padding; + } else { + this.padding = [padding, padding]; + } + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] + this.padding[0] + this.padding[1], this.inputShape[1]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor.hi(this.inputShape[0] + this.padding[0], this.inputShape[1]).lo(this.padding[0], 0), x.tensor); + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesRow = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesCol = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + for (let i = 0; i < this.inputShape[0]; i++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, null), i); + } + + for (let j = 0; j < this.inputShape[1]; j++) { + _ndarrayOps.default.assigns(indicesCol.tensor.pick(null, j), j); + } + + _ndarrayOps.default.muls(indices.tensor, indicesRow.tensor, this.inputShape[1]); + + _ndarrayOps.default.addeq(indices.tensor, indicesCol.tensor); + + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = [this.padding[0], 0]; + const sliceEnd = [this.inputShape[0] + this.padding[0], this.inputShape[1]]; + + _ndarrayOps.default.assigns(this.indexMap.tensor, -1); + + _ndarrayOps.default.assign(this.indexMap.tensor.hi(...sliceEnd).lo(...sliceStart), indices.tensor); + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] + this.padding[0] + this.padding[1], this.inputShape[1]]; + + this._createIndexMap(); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = ZeroPadding1D; \ No newline at end of file diff --git a/lib/layers/convolutional/ZeroPadding2D.js b/lib/layers/convolutional/ZeroPadding2D.js new file mode 100644 index 0000000000..077f541a13 --- /dev/null +++ b/lib/layers/convolutional/ZeroPadding2D.js @@ -0,0 +1,146 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class ZeroPadding2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'ZeroPadding2D'; + const { + padding = [[1, 1], [1, 1]], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(padding)) { + if (Array.isArray(padding[0])) { + this.padding = padding; + } else { + this.padding = [[padding[0], padding[0]], [padding[1], padding[1]]]; + } + } else { + this.padding = [[padding, padding], [padding, padding]]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] + this.padding[0][0] + this.padding[0][1], this.inputShape[1] + this.padding[1][0] + this.padding[1][1], this.inputShape[2]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor.hi(this.inputShape[0] + this.padding[0][0], this.inputShape[1] + this.padding[1][0], this.inputShape[2]).lo(this.padding[0][0], this.padding[1][0], 0), x.tensor); + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(2, 0, 1); + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = this.dataFormat === 'channels_first' ? [0, this.padding[0][0], this.padding[1][0]] : [this.padding[0][0], this.padding[1][0], 0]; + const sliceEnd = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] + this.padding[0][0], this.inputShape[2] + this.padding[1][0]] : [this.inputShape[0] + this.padding[0][0], this.inputShape[1] + this.padding[1][0], this.inputShape[2]]; + + _ndarrayOps.default.assigns(this.indexMap.tensor, -1); + + _ndarrayOps.default.assign(this.indexMap.tensor.hi(...sliceEnd).lo(...sliceStart), indices.tensor); + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] + this.padding[0][0] + this.padding[0][1], this.inputShape[2] + this.padding[1][0] + this.padding[1][1]] : [this.inputShape[0] + this.padding[0][0] + this.padding[0][1], this.inputShape[1] + this.padding[1][0] + this.padding[1][1], this.inputShape[2]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = ZeroPadding2D; \ No newline at end of file diff --git a/lib/layers/convolutional/ZeroPadding3D.js b/lib/layers/convolutional/ZeroPadding3D.js new file mode 100644 index 0000000000..69917c9e9b --- /dev/null +++ b/lib/layers/convolutional/ZeroPadding3D.js @@ -0,0 +1,146 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class ZeroPadding3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'ZeroPadding3D'; + const { + padding = [[1, 1], [1, 1], [1, 1]], + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(padding)) { + if (Array.isArray(padding[0])) { + this.padding = padding; + } else { + this.padding = [[padding[0], padding[0]], [padding[1], padding[1]], [padding[2], padding[2]]]; + } + } else { + this.padding = [[padding, padding], [padding, padding], [padding, padding]]; + } + + this.dataFormat = data_format; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this.inputShape = x.tensor.shape; + this.outputShape = [this.inputShape[0] + this.padding[0][0] + this.padding[0][1], this.inputShape[1] + this.padding[1][0] + this.padding[1][1], this.inputShape[2] + this.padding[2][0] + this.padding[2][1], this.inputShape[3]]; + this.output = new _Tensor.default([], this.outputShape); + + _ndarrayOps.default.assign(this.output.tensor.hi(this.inputShape[0] + this.padding[0][0], this.inputShape[1] + this.padding[1][0], this.inputShape[2] + this.padding[2][0], this.inputShape[3]).lo(this.padding[0][0], this.padding[1][0], this.padding[2][0], 0), x.tensor); + + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(3, 0, 1, 2); + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMap = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + const sliceStart = this.dataFormat === 'channels_first' ? [0, this.padding[0][0], this.padding[1][0], this.padding[2][0]] : [this.padding[0][0], this.padding[1][0], this.padding[2][0], 0]; + const sliceEnd = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] + this.padding[0][0], this.inputShape[2] + this.padding[1][0], this.inputShape[3] + this.padding[2][0]] : [this.inputShape[0] + this.padding[0][0], this.inputShape[1] + this.padding[1][0], this.inputShape[2] + this.padding[2][0], this.inputShape[3]]; + + _ndarrayOps.default.assigns(this.indexMap.tensor, -1); + + _ndarrayOps.default.assign(this.indexMap.tensor.hi(...sliceEnd).lo(...sliceStart), indices.tensor); + + this.indexMap.reshapeTo2DSquare(); + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.originalShape; + this.outputShape = this.dataFormat === 'channels_first' ? [this.inputShape[0], this.inputShape[1] + this.padding[0][0] + this.padding[0][1], this.inputShape[2] + this.padding[1][0] + this.padding[1][1], this.inputShape[3] + this.padding[2][0] + this.padding[2][1]] : [this.inputShape[0] + this.padding[0][0] + this.padding[0][1], this.inputShape[1] + this.padding[1][0] + this.padding[1][1], this.inputShape[2] + this.padding[2][0] + this.padding[2][1], this.inputShape[3]]; + + this._createIndexMap(x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2DSquare(); + } + } + +} + +exports.default = ZeroPadding3D; \ No newline at end of file diff --git a/lib/layers/convolutional/index.js b/lib/layers/convolutional/index.js new file mode 100644 index 0000000000..ddb1105c55 --- /dev/null +++ b/lib/layers/convolutional/index.js @@ -0,0 +1,119 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Conv1D", { + enumerable: true, + get: function () { + return _Conv1D.default; + } +}); +Object.defineProperty(exports, "Conv2D", { + enumerable: true, + get: function () { + return _Conv2D.default; + } +}); +Object.defineProperty(exports, "SeparableConv2D", { + enumerable: true, + get: function () { + return _SeparableConv2D.default; + } +}); +Object.defineProperty(exports, "Conv2DTranspose", { + enumerable: true, + get: function () { + return _Conv2DTranspose.default; + } +}); +Object.defineProperty(exports, "Conv3D", { + enumerable: true, + get: function () { + return _Conv3D.default; + } +}); +Object.defineProperty(exports, "Cropping1D", { + enumerable: true, + get: function () { + return _Cropping1D.default; + } +}); +Object.defineProperty(exports, "Cropping2D", { + enumerable: true, + get: function () { + return _Cropping2D.default; + } +}); +Object.defineProperty(exports, "Cropping3D", { + enumerable: true, + get: function () { + return _Cropping3D.default; + } +}); +Object.defineProperty(exports, "UpSampling1D", { + enumerable: true, + get: function () { + return _UpSampling1D.default; + } +}); +Object.defineProperty(exports, "UpSampling2D", { + enumerable: true, + get: function () { + return _UpSampling2D.default; + } +}); +Object.defineProperty(exports, "UpSampling3D", { + enumerable: true, + get: function () { + return _UpSampling3D.default; + } +}); +Object.defineProperty(exports, "ZeroPadding1D", { + enumerable: true, + get: function () { + return _ZeroPadding1D.default; + } +}); +Object.defineProperty(exports, "ZeroPadding2D", { + enumerable: true, + get: function () { + return _ZeroPadding2D.default; + } +}); +Object.defineProperty(exports, "ZeroPadding3D", { + enumerable: true, + get: function () { + return _ZeroPadding3D.default; + } +}); + +var _Conv1D = _interopRequireDefault(require("./Conv1D")); + +var _Conv2D = _interopRequireDefault(require("./Conv2D")); + +var _SeparableConv2D = _interopRequireDefault(require("./SeparableConv2D")); + +var _Conv2DTranspose = _interopRequireDefault(require("./Conv2DTranspose")); + +var _Conv3D = _interopRequireDefault(require("./Conv3D")); + +var _Cropping1D = _interopRequireDefault(require("./Cropping1D")); + +var _Cropping2D = _interopRequireDefault(require("./Cropping2D")); + +var _Cropping3D = _interopRequireDefault(require("./Cropping3D")); + +var _UpSampling1D = _interopRequireDefault(require("./UpSampling1D")); + +var _UpSampling2D = _interopRequireDefault(require("./UpSampling2D")); + +var _UpSampling3D = _interopRequireDefault(require("./UpSampling3D")); + +var _ZeroPadding1D = _interopRequireDefault(require("./ZeroPadding1D")); + +var _ZeroPadding2D = _interopRequireDefault(require("./ZeroPadding2D")); + +var _ZeroPadding3D = _interopRequireDefault(require("./ZeroPadding3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/core/Activation.js b/lib/layers/core/Activation.js new file mode 100644 index 0000000000..ff8c191de5 --- /dev/null +++ b/lib/layers/core/Activation.js @@ -0,0 +1,111 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var activations = _interopRequireWildcard(require("../../activations")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Activation extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Activation'; + const { + activation = 'linear' + } = attrs; + this.activation = activation; + this.activationFunc = activations[activation]; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + call(x) { + if (this.activation === 'linear') { + this.output = x; + return this.output; + } + + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = new _Tensor.default(new x.arrayType(x.tensor.data), x.tensor.shape); + this.activationFunc(this.output); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = Activation; \ No newline at end of file diff --git a/lib/layers/core/Dense.js b/lib/layers/core/Dense.js new file mode 100644 index 0000000000..b1bd4b3f1b --- /dev/null +++ b/lib/layers/core/Dense.js @@ -0,0 +1,144 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var activations = _interopRequireWildcard(require("../../activations")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayBlasLevel = require("ndarray-blas-level2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; + +class Dense extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Dense'; + const { + units = 1, + activation = 'linear', + input_dim = null, + use_bias = true + } = attrs; + this.activation = activation; + this.activationFunc = activations[this.activation]; + this.units = units; + this.input_dim = input_dim; + this.use_bias = use_bias; + this.params = this.use_bias ? ['kernel', 'bias'] : ['kernel']; + + if (this.input_dim) { + this.inputShape = [this.input_dim]; + } + + if (this.gpu) { + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = new _Tensor.default([], [this.units]); + + if (this.use_bias) { + _ndarrayOps.default.assign(this.output.tensor, this.weights['bias'].tensor); + } + + (0, _ndarrayBlasLevel.gemv)(1, this.weights['kernel'].tensor.transpose(1, 0), x.tensor, 1, this.output.tensor); + this.activationFunc(this.output); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (this.activation !== 'linear' && !this.outputPreactiv) { + this.outputPreactiv = new _Tensor.default([], [this.units]); + this.outputPreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], [this.units]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const matMulInputs = [{ + input: x, + name: 'A' + }, { + input: this.weights['kernel'], + name: 'B' + }]; + + if (this.use_bias) { + matMulInputs.push({ + input: this.weights['bias'], + name: 'C' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.activation === 'linear' ? this.output : this.outputPreactiv, + inputs: matMulInputs, + uniforms: [{ + value: this.use_bias ? 1 : 0, + type: 'bool', + name: 'addC' + }] + }); + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.output, + inputs: [{ + input: this.outputPreactiv, + name: 'x' + }] + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Dense; \ No newline at end of file diff --git a/lib/layers/core/Dropout.js b/lib/layers/core/Dropout.js new file mode 100644 index 0000000000..60e9b0c37d --- /dev/null +++ b/lib/layers/core/Dropout.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Dropout extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Dropout'; + const { + rate = 0.5 + } = attrs; + this.rate = Math.min(Math.max(0, rate), 1); + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = Dropout; \ No newline at end of file diff --git a/lib/layers/core/Flatten.js b/lib/layers/core/Flatten.js new file mode 100644 index 0000000000..df0e85f85b --- /dev/null +++ b/lib/layers/core/Flatten.js @@ -0,0 +1,128 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const flattenProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int outputSize;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(outputSize) * outTex.x);\r\n int out_y = 0;\r\n\r\n int i = int(floor(float(out_x) / float(inputCols)));\r\n int j = int(mod(float(out_x), float(inputCols)));\r\n outColor = vec4(texelFetch(x, ivec2(j, i), 0).r);\r\n}\r\n"; +const flattenFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int outputSize;\r\nuniform int inputRows;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(outputSize) * outTex.x);\r\n int out_y = 0;\r\n\r\n int rowIndex = int(mod(floor(float(out_x) / float(inputCols)), float(inputRows)));\r\n int colIndex = int(mod(float(out_x), float(inputCols)));\r\n int fragmentIndex = int(floor(float(out_x) / (float(inputRows) * float(inputCols))));\r\n colIndex += fragmentIndex * inputCols;\r\n outColor = vec4(texelFetch(x, ivec2(colIndex, rowIndex), 0).r);\r\n}\r\n"; + +class Flatten extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Flatten'; + + if (this.gpu) { + this.flattenProgram = _WebGL.webgl2.compileProgram(flattenProgramSource); + this.flattenFragmentsProgram = _WebGL.webgl2.compileProgram(flattenFragmentsProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (x.tensor.shape.length <= 1) { + this.output = x; + } else { + this.output = new _Tensor.default([], [x.tensor.shape.reduce((a, b) => a * b, 1)]); + this.output.replaceTensorData(x.tensor.data); + } + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } else if (x.tensor.shape.length > 2 && !x.is2DReshaped) { + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + + if (!this.output) { + this.output = new _Tensor.default([], [x.glTextureShape.reduce((a, b) => a * b, 1)]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (x.glTextureFragments) { + x.convert2DRowFragmentedGLTextureToColStack(); + + _WebGL.webgl2.runProgram({ + program: this.flattenFragmentsProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'outputSize' + }, { + value: x.glTextureShape[0], + type: 'int', + name: 'inputRows' + }, { + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }], + supportsTextureFragments: true + }); + + x.removeGLTextureFragmentsAsColStack(); + } else { + _WebGL.webgl2.runProgram({ + program: this.flattenProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'outputSize' + }, { + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }], + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Flatten; \ No newline at end of file diff --git a/lib/layers/core/Permute.js b/lib/layers/core/Permute.js new file mode 100644 index 0000000000..cafda5e68a --- /dev/null +++ b/lib/layers/core/Permute.js @@ -0,0 +1,194 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _last2 = _interopRequireDefault(require("lodash/last")); + +var _range2 = _interopRequireDefault(require("lodash/range")); + +var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class Permute extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Permute'; + const { + dims = [] + } = attrs; + this.dims = dims.map(dim => dim - 1); + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (x.tensor.shape.length <= 1 || (0, _isEqual2.default)((0, _range2.default)(x.tensor.shape.length), this.dims)) { + this.output = x; + return this.output; + } + + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dims.length !== x.tensor.shape.length) { + this.throwError('The specified dims permutation must match the number of dimensions.'); + } + + const outputShape = this.dims.map(i => x.tensor.shape[i]); + this.output = new _Tensor.default([], outputShape); + + _ndarrayOps.default.assign(this.output.tensor, x.tensor.transpose(...this.dims)); + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesRow = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesCol = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + if (this.inputShape.length === 2) { + for (let i = 0; i < this.inputShape[0]; i++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, null), i); + } + } else if (this.inputShape.length === 3) { + for (let i = 0; i < this.inputShape[0]; i++) { + for (let j = 0; j < this.inputShape[1]; j++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, j, null), i * this.inputShape[1] + j); + } + } + } else if (this.inputShape.length === 4) { + for (let i = 0; i < this.inputShape[0]; i++) { + for (let j = 0; j < this.inputShape[1]; j++) { + for (let k = 0; k < this.inputShape[2]; k++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, j, k, null), i * this.inputShape[1] * this.inputShape[2] + j * this.inputShape[2] + k); + } + } + } + } + + for (let c = 0; c < (0, _last2.default)(this.inputShape); c++) { + _ndarrayOps.default.assigns(indicesCol.tensor.pick(...Array(this.inputShape.length - 1).fill(null), c), c); + } + + _ndarrayOps.default.muls(indices.tensor, indicesRow.tensor, (0, _last2.default)(this.inputShape)); + + _ndarrayOps.default.addeq(indices.tensor, indicesCol.tensor); + + const outputShape = this.dims.map(i => this.inputShape[i]); + this.indexMap = new _Tensor.default([], outputShape, { + type: Int32Array + }); + + _ndarrayOps.default.assign(this.indexMap.tensor, indices.tensor.transpose(...this.dims)); + + if (outputShape.length > 2) { + this.indexMap.reshapeTo2D(); + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + this.inputShape = x.tensor.shape; + + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } else if (x.tensor.shape.length > 2 && !x.is2DReshaped) { + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + this.inputShape = x.tensor.shape; + } + + this._createIndexMap(); + + if (!this.output) { + const outputShape = this.dims.map(i => this.inputShape[i]); + this.output = new _Tensor.default([], outputShape); + + if (outputShape.length > 2) { + this.output.reshapeTo2D(); + } + + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = Permute; \ No newline at end of file diff --git a/lib/layers/core/RepeatVector.js b/lib/layers/core/RepeatVector.js new file mode 100644 index 0000000000..df1eab5a16 --- /dev/null +++ b/lib/layers/core/RepeatVector.js @@ -0,0 +1,87 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayUnsqueeze = _interopRequireDefault(require("ndarray-unsqueeze")); + +var _ndarrayTile = _interopRequireDefault(require("ndarray-tile")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n outColor = texture(x, vec2(outTex.x, 0));\r\n}\r\n"; + +class RepeatVector extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'RepeatVector'; + const { + n = 1 + } = attrs; + this.n = n; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (x.tensor.shape.length !== 1) { + this.throwError('Only 1D tensor inputs allowed.'); + } + + this.output = new _Tensor.default([], [this.n, x.tensor.shape[1]]); + this.output.tensor = (0, _ndarrayTile.default)((0, _ndarrayUnsqueeze.default)(x.tensor, 0), [this.n, 1]); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], [this.n, x.glTextureShape[1]]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = RepeatVector; \ No newline at end of file diff --git a/lib/layers/core/Reshape.js b/lib/layers/core/Reshape.js new file mode 100644 index 0000000000..c056f7050d --- /dev/null +++ b/lib/layers/core/Reshape.js @@ -0,0 +1,180 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _last2 = _interopRequireDefault(require("lodash/last")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; + +class Reshape extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Reshape'; + const { + target_shape = [] + } = attrs; + this.targetShape = target_shape; + + if (this.gpu) { + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.targetShape.reduce((a, b) => a * b, 1) !== x.tensor.size) { + this.throwError('The total size of new array must be unchanged in reshape layer.'); + } + + this.output = new _Tensor.default([], this.targetShape); + this.output.replaceTensorData(x.tensor.data); + } + + _createIndexMap() { + if (this.indexMap) { + return; + } + + const indices = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesRow = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + const indicesCol = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + if (this.inputShape.length === 2) { + for (let i = 0; i < this.inputShape[0]; i++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, null), i); + } + } else if (this.inputShape.length === 3) { + for (let i = 0; i < this.inputShape[0]; i++) { + for (let j = 0; j < this.inputShape[1]; j++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, j, null), i * this.inputShape[1] + j); + } + } + } else if (this.inputShape.length === 4) { + for (let i = 0; i < this.inputShape[0]; i++) { + for (let j = 0; j < this.inputShape[1]; j++) { + for (let k = 0; k < this.inputShape[2]; k++) { + _ndarrayOps.default.assigns(indicesRow.tensor.pick(i, j, k, null), i * this.inputShape[1] * this.inputShape[2] + j * this.inputShape[2] + k); + } + } + } + } + + for (let c = 0; c < (0, _last2.default)(this.inputShape); c++) { + _ndarrayOps.default.assigns(indicesCol.tensor.pick(...Array(this.inputShape.length - 1).fill(null), c), c); + } + + _ndarrayOps.default.muls(indices.tensor, indicesRow.tensor, (0, _last2.default)(this.inputShape)); + + _ndarrayOps.default.addeq(indices.tensor, indicesCol.tensor); + + this.indexMap = new _Tensor.default([], this.targetShape, { + type: Int32Array + }); + this.indexMap.replaceTensorData(new Int32Array(indices.tensor.data)); + + if (this.targetShape.length > 2) { + this.indexMap.reshapeTo2D(); + } + + this.indexMap.createGLTexture({ + type: '2d', + format: 'int' + }); + } + + _callGPU(x) { + if (!x.glTexture) { + this.inputShape = x.tensor.shape; + + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } else if (x.tensor.shape.length > 2 && !x.is2DReshaped) { + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + this.inputShape = x.tensor.shape; + } + + this._createIndexMap(); + + if (!this.output) { + this.output = new _Tensor.default([], this.targetShape); + + if (this.targetShape.length > 2) { + this.output.reshapeTo2D(); + } + + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMap, + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = Reshape; \ No newline at end of file diff --git a/lib/layers/core/SpatialDropout1D.js b/lib/layers/core/SpatialDropout1D.js new file mode 100644 index 0000000000..a42b324b4b --- /dev/null +++ b/lib/layers/core/SpatialDropout1D.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class SpatialDropout1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'SpatialDropout1D'; + const { + p = 0.5 + } = attrs; + this.p = Math.min(Math.max(0, p), 1); + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = SpatialDropout1D; \ No newline at end of file diff --git a/lib/layers/core/SpatialDropout2D.js b/lib/layers/core/SpatialDropout2D.js new file mode 100644 index 0000000000..38949bd9f7 --- /dev/null +++ b/lib/layers/core/SpatialDropout2D.js @@ -0,0 +1,31 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class SpatialDropout2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'SpatialDropout2D'; + const { + rate = 0.5, + data_format = 'channels_last' + } = attrs; + this.rate = Math.min(Math.max(0, rate), 1); + this.dataFormat = data_format; + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = SpatialDropout2D; \ No newline at end of file diff --git a/lib/layers/core/SpatialDropout3D.js b/lib/layers/core/SpatialDropout3D.js new file mode 100644 index 0000000000..abbe65a7ff --- /dev/null +++ b/lib/layers/core/SpatialDropout3D.js @@ -0,0 +1,31 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class SpatialDropout3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'SpatialDropout3D'; + const { + rate = 0.5, + data_format = 'channels_last' + } = attrs; + this.rate = Math.min(Math.max(0, rate), 1); + this.dataFormat = data_format; + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = SpatialDropout3D; \ No newline at end of file diff --git a/lib/layers/core/index.js b/lib/layers/core/index.js new file mode 100644 index 0000000000..9a078e0b87 --- /dev/null +++ b/lib/layers/core/index.js @@ -0,0 +1,87 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Dense", { + enumerable: true, + get: function () { + return _Dense.default; + } +}); +Object.defineProperty(exports, "Activation", { + enumerable: true, + get: function () { + return _Activation.default; + } +}); +Object.defineProperty(exports, "Dropout", { + enumerable: true, + get: function () { + return _Dropout.default; + } +}); +Object.defineProperty(exports, "SpatialDropout1D", { + enumerable: true, + get: function () { + return _SpatialDropout1D.default; + } +}); +Object.defineProperty(exports, "SpatialDropout2D", { + enumerable: true, + get: function () { + return _SpatialDropout2D.default; + } +}); +Object.defineProperty(exports, "SpatialDropout3D", { + enumerable: true, + get: function () { + return _SpatialDropout3D.default; + } +}); +Object.defineProperty(exports, "Flatten", { + enumerable: true, + get: function () { + return _Flatten.default; + } +}); +Object.defineProperty(exports, "Reshape", { + enumerable: true, + get: function () { + return _Reshape.default; + } +}); +Object.defineProperty(exports, "Permute", { + enumerable: true, + get: function () { + return _Permute.default; + } +}); +Object.defineProperty(exports, "RepeatVector", { + enumerable: true, + get: function () { + return _RepeatVector.default; + } +}); + +var _Dense = _interopRequireDefault(require("./Dense")); + +var _Activation = _interopRequireDefault(require("./Activation")); + +var _Dropout = _interopRequireDefault(require("./Dropout")); + +var _SpatialDropout1D = _interopRequireDefault(require("./SpatialDropout1D")); + +var _SpatialDropout2D = _interopRequireDefault(require("./SpatialDropout2D")); + +var _SpatialDropout3D = _interopRequireDefault(require("./SpatialDropout3D")); + +var _Flatten = _interopRequireDefault(require("./Flatten")); + +var _Reshape = _interopRequireDefault(require("./Reshape")); + +var _Permute = _interopRequireDefault(require("./Permute")); + +var _RepeatVector = _interopRequireDefault(require("./RepeatVector")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/embeddings/Embedding.js b/lib/layers/embeddings/Embedding.js new file mode 100644 index 0000000000..0011414a94 --- /dev/null +++ b/lib/layers/embeddings/Embedding.js @@ -0,0 +1,94 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform sampler2D embeddings;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 x_size = textureSize(x, 0);\r\n ivec2 embeddings_size = textureSize(embeddings, 0);\r\n int out_x = int(float(embeddings_size[0]) * outTex.x);\r\n int out_y = int(float(x_size[0]) * outTex.y);\r\n\r\n int index = int(texelFetch(x, ivec2(out_y, 0), 0).r);\r\n outColor = texelFetch(embeddings, ivec2(out_x, index), 0);\r\n}\r\n"; + +class Embedding extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Embedding'; + const { + input_dim = 1, + output_dim = 1, + input_length = 0, + mask_zero = false + } = attrs; + this.inputDim = input_dim; + this.outputDim = output_dim; + this.inputLength = input_length; + this.maskZero = mask_zero; + this.params = ['embeddings']; + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.output = new _Tensor.default([], [x.tensor.shape[0], this.weights['embeddings'].tensor.shape[1]]); + + for (let i = 0, len = x.tensor.shape[0]; i < len; i++) { + _ndarrayOps.default.assign(this.output.tensor.pick(i, null), this.weights['embeddings'].tensor.pick(x.tensor.get(i), null)); + } + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], [x.glTextureShape[1], this.weights['embeddings'].glTextureShape[1]]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.weights['embeddings'], + name: 'embeddings' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Embedding; \ No newline at end of file diff --git a/lib/layers/embeddings/index.js b/lib/layers/embeddings/index.js new file mode 100644 index 0000000000..68fc079719 --- /dev/null +++ b/lib/layers/embeddings/index.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Embedding", { + enumerable: true, + get: function () { + return _Embedding.default; + } +}); + +var _Embedding = _interopRequireDefault(require("./Embedding")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/index.js b/lib/layers/index.js new file mode 100644 index 0000000000..218f1c290e --- /dev/null +++ b/lib/layers/index.js @@ -0,0 +1,148 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var _exportNames = { + InputLayer: true +}; +Object.defineProperty(exports, "InputLayer", { + enumerable: true, + get: function () { + return _InputLayer.default; + } +}); + +var _InputLayer = _interopRequireDefault(require("./InputLayer")); + +var _advanced_activations = require("./advanced_activations"); + +Object.keys(_advanced_activations).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _advanced_activations[key]; + } + }); +}); + +var _convolutional = require("./convolutional"); + +Object.keys(_convolutional).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _convolutional[key]; + } + }); +}); + +var _core = require("./core"); + +Object.keys(_core).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _core[key]; + } + }); +}); + +var _embeddings = require("./embeddings"); + +Object.keys(_embeddings).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _embeddings[key]; + } + }); +}); + +var _merge = require("./merge"); + +Object.keys(_merge).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _merge[key]; + } + }); +}); + +var _noise = require("./noise"); + +Object.keys(_noise).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _noise[key]; + } + }); +}); + +var _normalization = require("./normalization"); + +Object.keys(_normalization).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _normalization[key]; + } + }); +}); + +var _pooling = require("./pooling"); + +Object.keys(_pooling).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _pooling[key]; + } + }); +}); + +var _recurrent = require("./recurrent"); + +Object.keys(_recurrent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _recurrent[key]; + } + }); +}); + +var _wrappers = require("./wrappers"); + +Object.keys(_wrappers).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _wrappers[key]; + } + }); +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/merge/Add.js b/lib/layers/merge/Add.js new file mode 100644 index 0000000000..1cbd95c0c4 --- /dev/null +++ b/lib/layers/merge/Add.js @@ -0,0 +1,48 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Add extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Add'; + this.mode = 'sum'; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + for (let i = 0; i < inputs.length; i++) { + _ndarrayOps.default.addeq(this.output.tensor, inputs[i].tensor); + } + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('add', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Add; \ No newline at end of file diff --git a/lib/layers/merge/Average.js b/lib/layers/merge/Average.js new file mode 100644 index 0000000000..7386a75bdb --- /dev/null +++ b/lib/layers/merge/Average.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Average extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Average'; + this.mode = 'ave'; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + for (let i = 0; i < inputs.length; i++) { + _ndarrayOps.default.addeq(this.output.tensor, inputs[i].tensor); + } + + _ndarrayOps.default.divseq(this.output.tensor, inputs.length); + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('average', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Average; \ No newline at end of file diff --git a/lib/layers/merge/Concatenate.js b/lib/layers/merge/Concatenate.js new file mode 100644 index 0000000000..1ae70447b6 --- /dev/null +++ b/lib/layers/merge/Concatenate.js @@ -0,0 +1,143 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _sum2 = _interopRequireDefault(require("lodash/sum")); + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayConcatRows = _interopRequireDefault(require("ndarray-concat-rows")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Concatenate extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Concatenate'; + this.mode = 'concat'; + const { + axis = -1 + } = attrs; + this.concatAxis = axis <= 0 ? axis : axis - 1; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + + const _concatAxis = this.concatAxis < 0 ? outputShape.length + this.concatAxis : this.concatAxis; + + inputs.slice(1, inputs.length).forEach(x => { + const d = x.tensor.shape.slice()[_concatAxis]; + + outputShape[_concatAxis] += d; + }); + this.output = new _Tensor.default([], outputShape); + + if (_concatAxis === 0) { + (0, _ndarrayConcatRows.default)(this.output.tensor, inputs.map(x => x.tensor)); + } else { + let dimsAxisSwap = [_concatAxis]; + + for (let i = 0; i < inputs[0].tensor.shape.length; i++) { + if (i !== _concatAxis) dimsAxisSwap.push(i); + } + + (0, _ndarrayConcatRows.default)(this.output.tensor.transpose(...dimsAxisSwap), inputs.map(x => x.tensor.transpose(...dimsAxisSwap))); + } + } + + _callGPU(inputs) { + inputs.forEach(input => { + if (!input.glTexture && !input.glTextureFragments) { + input.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + }); + const outputShape = inputs[0].glTextureShape.slice(); + let _concatAxis = 1; + + if (inputs[0].is2DReshaped) { + if (this.concatAxis === -1 || this.concatAxis === inputs[0].originalShape.length - 1) { + _concatAxis = 1; + } else { + this.throwError('specified axis not supported for now.'); + } + } else { + if (this.concatAxis === -1 || this.concatAxis === 1) { + _concatAxis = 1; + } else if (this.concatAxis === -2 || this.concatAxis === 0) { + _concatAxis = 0; + } else { + this.throwError('specified axis not supported for now.'); + } + } + + outputShape[_concatAxis] = (0, _sum2.default)(inputs.map(input => input.glTextureShape[_concatAxis])); + + if (!this.output) { + this.output = new _Tensor.default([], outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: _concatAxis === 1 + }); + + if (inputs[0].is1D) { + this.output.is1D = inputs[0].is1D; + } else if (inputs[0].is2DReshaped) { + this.output.is2DReshaped = inputs[0].is2DReshaped; + this.output.originalShape = inputs[0].originalShape.slice(); + + const _concatAxis = this.concatAxis < 0 ? this.output.originalShape.length + this.concatAxis : this.concatAxis; + + this.output.originalShape[_concatAxis] = (0, _sum2.default)(inputs.map(input => input.originalShape[_concatAxis])); + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.output.originalShape, false, _concatAxis); + } + } + + if (!this.mergeProgram) { + const outputShape = this.output.glTextureFragments ? this.output.glTextureFragmentShape : this.output.glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('concatenate', inputs.length, inputs.map(input => input.glTextureShape), outputShape, _concatAxis); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + _WebGL.webgl2.runProgram({ + program: this.mergeProgram, + output: this.output, + inputs: inputs.map((input, i) => ({ + input, + name: `inputs[${i}]` + })), + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = Concatenate; \ No newline at end of file diff --git a/lib/layers/merge/Dot.js b/lib/layers/merge/Dot.js new file mode 100644 index 0000000000..b0c09931b9 --- /dev/null +++ b/lib/layers/merge/Dot.js @@ -0,0 +1,159 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const mergeProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D input1;\r\nuniform sampler2D input2;\r\nuniform int rows;\r\nuniform int cols;\r\nuniform int dotAxis1;\r\nuniform int dotAxis2;\r\nuniform int commonDim;\r\nuniform bool normalize;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(cols) * outTex.x);\r\n int out_y = int(float(rows) * outTex.y);\r\n\r\n float sum = 0.;\r\n float a = 0.;\r\n float b = 0.;\r\n float norm1 = 0.;\r\n float norm2 = 0.;\r\n\r\n for (int i = 0; i < commonDim; ++i) {\r\n if (dotAxis1 == 0 && dotAxis2 == 0) {\r\n a = texelFetch(input1, ivec2(out_y, i), 0).r;\r\n b = texelFetch(input2, ivec2(out_x, i), 0).r;\r\n } else if (dotAxis1 == 1 && dotAxis2 == 1) {\r\n a = texelFetch(input1, ivec2(i, out_y), 0).r;\r\n b = texelFetch(input2, ivec2(i, out_x), 0).r;\r\n }\r\n\r\n sum += a * b;\r\n\r\n if (normalize) {\r\n norm1 += a * a;\r\n norm2 += b * b;\r\n }\r\n }\r\n\r\n if (normalize) {\r\n sum /= sqrt(norm1) * sqrt(norm2);\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; + +class Dot extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Dot'; + this.mode = 'dot'; + const { + axes = -1, + normalize = false + } = attrs; + + if (Array.isArray(axes)) { + this.dotAxes = [axes[0] <= 0 ? axes[0] : axes[0] - 1, axes[1] <= 0 ? axes[1] : axes[1] - 1]; + } else { + this.dotAxes = [axes <= 0 ? axes : axes - 1, axes <= 0 ? axes : axes - 1]; + } + + this.normalize = normalize; + + if (this.gpu) { + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + } + + _calcOutputShape(inputShapes) { + let shape1 = inputShapes[0].slice(); + let shape2 = inputShapes[1].slice(); + shape1.splice(this.dotAxes[0], 1); + shape2.splice(this.dotAxes[1], 1); + this.outputShape = shape1.concat(shape2); + + if (this.outputShape.length === 1) { + this.outputShape.push(1); + } + } + + _callCPU(inputs) { + this._calcOutputShape([inputs[0].tensor.shape, inputs[1].tensor.shape]); + + this.output = new _Tensor.default([], this.outputShape); + + if (inputs[0].tensor.shape.length === 2 && inputs[1].tensor.shape.length === 2) { + if (this.dotAxes[0] === 0 && this.dotAxes[1] === 0) { + if (this.normalize) { + for (let i = 0; i < inputs[0].tensor.shape[1]; i++) { + _ndarrayOps.default.divseq(inputs[0].tensor.pick(null, i), _ndarrayOps.default.norm2(inputs[0].tensor.pick(null, i))); + } + + for (let i = 0; i < inputs[1].tensor.shape[1]; i++) { + _ndarrayOps.default.divseq(inputs[1].tensor.pick(null, i), _ndarrayOps.default.norm2(inputs[1].tensor.pick(null, i))); + } + } + + (0, _ndarrayGemm.default)(this.output.tensor, inputs[0].tensor.transpose(1, 0), inputs[1].tensor); + } else if (this.dotAxes[0] === 1 && this.dotAxes[1] === 1) { + if (this.normalize) { + for (let i = 0; i < inputs[0].tensor.shape[0]; i++) { + _ndarrayOps.default.divseq(inputs[0].tensor.pick(i, null), _ndarrayOps.default.norm2(inputs[0].tensor.pick(i, null))); + } + + for (let i = 0; i < inputs[1].tensor.shape[0]; i++) { + _ndarrayOps.default.divseq(inputs[1].tensor.pick(i, null), _ndarrayOps.default.norm2(inputs[1].tensor.pick(i, null))); + } + } + + (0, _ndarrayGemm.default)(this.output.tensor, inputs[0].tensor, inputs[1].tensor.transpose(1, 0)); + } + } else { + this.throwError('dot mode for 3+ dim tensors not yet implemented.'); + } + } + + _callGPU(inputs) { + inputs.forEach(input => { + if (!input.glTexture && !input.glTextureFragments) { + input.createGLTexture({ + type: '2d', + format: 'float' + }); + } + }); + + this._calcOutputShape([inputs[0].glTextureShape, inputs[1].glTextureShape]); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const commonDim = inputs[0].glTextureShape[this.dotAxes[0]]; + + _WebGL.webgl2.runProgram({ + program: this.mergeProgram, + output: this.output, + inputs: [{ + input: inputs[0], + name: 'input1' + }, { + input: inputs[1], + name: 'input2' + }], + uniforms: [{ + value: this.output.glTextureShape[0], + type: 'int', + name: 'rows' + }, { + value: this.output.glTextureShape[1], + type: 'int', + name: 'cols' + }, { + value: this.dotAxes[0], + type: 'int', + name: 'dotAxis1' + }, { + value: this.dotAxes[1], + type: 'int', + name: 'dotAxis2' + }, { + value: commonDim, + type: 'int', + name: 'commonDim' + }, { + value: +this.normalize, + type: 'bool', + name: 'normalize' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Dot; \ No newline at end of file diff --git a/lib/layers/merge/Maximum.js b/lib/layers/merge/Maximum.js new file mode 100644 index 0000000000..a80055bd19 --- /dev/null +++ b/lib/layers/merge/Maximum.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Maximum extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Maximum'; + this.mode = 'max'; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + _ndarrayOps.default.assign(this.output.tensor, inputs[0].tensor); + + for (let i = 1; i < inputs.length; i++) { + _ndarrayOps.default.maxeq(this.output.tensor, inputs[i].tensor); + } + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('maximum', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Maximum; \ No newline at end of file diff --git a/lib/layers/merge/Minimum.js b/lib/layers/merge/Minimum.js new file mode 100644 index 0000000000..f935cc4db5 --- /dev/null +++ b/lib/layers/merge/Minimum.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Minimum extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Minimum'; + this.mode = 'min'; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + _ndarrayOps.default.assign(this.output.tensor, inputs[0].tensor); + + for (let i = 1; i < inputs.length; i++) { + _ndarrayOps.default.mineq(this.output.tensor, inputs[i].tensor); + } + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('minimum', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Minimum; \ No newline at end of file diff --git a/lib/layers/merge/Multiply.js b/lib/layers/merge/Multiply.js new file mode 100644 index 0000000000..bf2a9833fe --- /dev/null +++ b/lib/layers/merge/Multiply.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Multiply extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Multiply'; + this.mode = 'mul'; + } + + _callCPU(inputs) { + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + _ndarrayOps.default.assigns(this.output.tensor, 1); + + for (let i = 0; i < inputs.length; i++) { + _ndarrayOps.default.muleq(this.output.tensor, inputs[i].tensor); + } + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('multiply', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Multiply; \ No newline at end of file diff --git a/lib/layers/merge/Subtract.js b/lib/layers/merge/Subtract.js new file mode 100644 index 0000000000..23fe170588 --- /dev/null +++ b/lib/layers/merge/Subtract.js @@ -0,0 +1,50 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Merge2 = _interopRequireDefault(require("./_Merge")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _createGLSLProgram = _interopRequireDefault(require("../../webgl/dynamic/createGLSLProgram")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class Subtract extends _Merge2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Subtract'; + this.mode = 'diff'; + } + + _callCPU(inputs) { + if (inputs.length !== 2) { + this.throwError('Inputs should be an array of 2 Tensors.'); + } + + const outputShape = inputs[0].tensor.shape.slice(); + this.output = new _Tensor.default([], outputShape); + + _ndarrayOps.default.sub(this.output.tensor, inputs[0].tensor, inputs[1].tensor); + } + + _callGPU(inputs) { + if (!this.mergeProgram) { + const shape = inputs[0].glTextureFragments ? inputs[0].glTextureFragmentShape : inputs[0].glTextureShape; + const mergeProgramSource = (0, _createGLSLProgram.default)('subtract', inputs.length, shape); + this.mergeProgram = _WebGL.webgl2.compileProgram(mergeProgramSource); + } + + super._callGPU(inputs); + } + +} + +exports.default = Subtract; \ No newline at end of file diff --git a/lib/layers/merge/_Merge.js b/lib/layers/merge/_Merge.js new file mode 100644 index 0000000000..79543bc51b --- /dev/null +++ b/lib/layers/merge/_Merge.js @@ -0,0 +1,144 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _range2 = _interopRequireDefault(require("lodash/range")); + +var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class _Merge extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_Merge'; + this.isMergeLayer = true; + } + + call(inputs) { + if (this.gpu) { + this._callGPU(inputs); + } else { + const valid = this._validateInputs(inputs); + + if (!valid) { + this.throwError('Invalid inputs to call method.'); + } + + this._callCPU(inputs); + } + + return this.output; + } + + _validateInputs(inputs) { + const shapes = inputs.map(x => x.tensor.shape.slice()); + + if (['sum', 'diff', 'mul', 'ave', 'max', 'min'].indexOf(this.mode) > -1) { + if (!shapes.every(shape => (0, _isEqual2.default)(shape, shapes[0]))) { + this.throwError(`All input shapes must be the same for mode ${this.mode}.`); + } + } + + if (this.mode === 'dot') { + if (inputs.length !== 2) { + this.throwError(`Exactly 2 inputs required for mode ${this.mode}.`); + } + + if (this.dotAxes[0] < 0) { + this.dotAxes[0] = shapes[0].length + this.dotAxes[0]; + } + + if (this.dotAxes[1] < 0) { + this.dotAxes[1] = shapes[1].length + this.dotAxes[1]; + } + + if (shapes[0][this.dotAxes[0]] !== shapes[1][this.dotAxes[1]]) { + this.throwError('Dimensions incompatibility using dot mode.'); + } + } else if (this.mode === 'concat') { + let nonConcatShapes = shapes.slice(); + + let _concatAxis = this.concatAxis < 0 ? nonConcatShapes[0].length + this.concatAxis : this.concatAxis; + + if (this.concatAxis === 0) _concatAxis = 0; + (0, _range2.default)(nonConcatShapes.length).forEach(i => { + nonConcatShapes[i].splice(_concatAxis, 1); + }); + + if (!nonConcatShapes.every(shape => (0, _isEqual2.default)(shape, nonConcatShapes[0]))) { + this.throwError('In concat mode, all shapes must be the same except along the concat axis.'); + } + } + + return true; + } + + _callCPU() {} + + _callGPU(inputs) { + inputs.forEach(input => { + if (!input.glTexture && !input.glTextureFragments) { + input.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + }); + + if (!this.output) { + this.output = new _Tensor.default([], inputs[0].glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (inputs[0].is1D) { + this.output.is1D = inputs[0].is1D; + } else if (inputs[0].is2DReshaped || inputs[0].is2DSquareReshaped) { + if (inputs[0].is2DReshaped) { + this.output.is2DReshaped = inputs[0].is2DReshaped; + } else if (inputs[0].is2DSquareReshaped) { + this.output.is2DSquareReshaped = inputs[0].is2DSquareReshaped; + } + + this.output.originalShape = inputs[0].originalShape.slice(); + this.output.indicesForReshaped = inputs[0].indicesForReshaped; + } + } + + _WebGL.webgl2.runProgram({ + program: this.mergeProgram, + output: this.output, + inputs: inputs.map((input, i) => ({ + input, + name: `inputs[${i}]` + })), + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = _Merge; \ No newline at end of file diff --git a/lib/layers/merge/index.js b/lib/layers/merge/index.js new file mode 100644 index 0000000000..92e1fc1927 --- /dev/null +++ b/lib/layers/merge/index.js @@ -0,0 +1,71 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Add", { + enumerable: true, + get: function () { + return _Add.default; + } +}); +Object.defineProperty(exports, "Subtract", { + enumerable: true, + get: function () { + return _Subtract.default; + } +}); +Object.defineProperty(exports, "Multiply", { + enumerable: true, + get: function () { + return _Multiply.default; + } +}); +Object.defineProperty(exports, "Average", { + enumerable: true, + get: function () { + return _Average.default; + } +}); +Object.defineProperty(exports, "Maximum", { + enumerable: true, + get: function () { + return _Maximum.default; + } +}); +Object.defineProperty(exports, "Minimum", { + enumerable: true, + get: function () { + return _Minimum.default; + } +}); +Object.defineProperty(exports, "Concatenate", { + enumerable: true, + get: function () { + return _Concatenate.default; + } +}); +Object.defineProperty(exports, "Dot", { + enumerable: true, + get: function () { + return _Dot.default; + } +}); + +var _Add = _interopRequireDefault(require("./Add")); + +var _Subtract = _interopRequireDefault(require("./Subtract")); + +var _Multiply = _interopRequireDefault(require("./Multiply")); + +var _Average = _interopRequireDefault(require("./Average")); + +var _Maximum = _interopRequireDefault(require("./Maximum")); + +var _Minimum = _interopRequireDefault(require("./Minimum")); + +var _Concatenate = _interopRequireDefault(require("./Concatenate")); + +var _Dot = _interopRequireDefault(require("./Dot")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/noise/GaussianDropout.js b/lib/layers/noise/GaussianDropout.js new file mode 100644 index 0000000000..2eeefe7648 --- /dev/null +++ b/lib/layers/noise/GaussianDropout.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GaussianDropout extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GaussianDropout'; + const { + rate = 0.5 + } = attrs; + this.rate = Math.min(Math.max(0, rate), 1); + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = GaussianDropout; \ No newline at end of file diff --git a/lib/layers/noise/GaussianNoise.js b/lib/layers/noise/GaussianNoise.js new file mode 100644 index 0000000000..d8a7e7de58 --- /dev/null +++ b/lib/layers/noise/GaussianNoise.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GaussianNoise extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GaussianNoise'; + const { + stddev = 0 + } = attrs; + this.stddev = stddev; + } + + call(x) { + this.output = x; + return this.output; + } + +} + +exports.default = GaussianNoise; \ No newline at end of file diff --git a/lib/layers/noise/index.js b/lib/layers/noise/index.js new file mode 100644 index 0000000000..74e2a4a66c --- /dev/null +++ b/lib/layers/noise/index.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "GaussianDropout", { + enumerable: true, + get: function () { + return _GaussianDropout.default; + } +}); +Object.defineProperty(exports, "GaussianNoise", { + enumerable: true, + get: function () { + return _GaussianNoise.default; + } +}); + +var _GaussianDropout = _interopRequireDefault(require("./GaussianDropout")); + +var _GaussianNoise = _interopRequireDefault(require("./GaussianNoise")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/normalization/BatchNormalization.js b/lib/layers/normalization/BatchNormalization.js new file mode 100644 index 0000000000..d3d7dffbff --- /dev/null +++ b/lib/layers/normalization/BatchNormalization.js @@ -0,0 +1,272 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const programSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D X;\r\nuniform isampler2D normAxisIndexMap;\r\nuniform sampler2D gamma;\r\nuniform sampler2D beta;\r\nuniform sampler2D mean;\r\nuniform sampler2D std;\r\nuniform float epsilon;\r\nuniform bool scale;\r\nuniform bool center;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(X, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\nint normAxisIndex = texelFetch(normAxisIndexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n float _x = texelFetch(X, ivec2(out_x, out_y), 0).r;\r\n float _mean = texelFetch(mean, ivec2(normAxisIndex, 0), 0).r;\r\n float _std = texelFetch(std, ivec2(normAxisIndex, 0), 0).r;\r\n\r\n float _gamma = 1.0;\r\n if (scale) {\r\n _gamma = texelFetch(gamma, ivec2(normAxisIndex, 0), 0).r;\r\n }\r\n\r\n float _beta = 0.0;\r\n if (center) {\r\n _beta = texelFetch(beta, ivec2(normAxisIndex, 0), 0).r;\r\n }\r\n\r\n float sum = _beta + _gamma * (_x - _mean) / sqrt(_std + epsilon);\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; + +class BatchNormalization extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'BatchNormalization'; + const { + epsilon = 0.001, + axis = -1, + center = true, + scale = true + } = attrs; + this.epsilon = epsilon; + this.center = center; + this.scale = scale; + this.axis = axis; + this.axisNormalized = false; + this.params = []; + + if (this.scale) { + this.params.push('gamma'); + } + + if (this.center) { + this.params.push('beta'); + } + + this.params = this.params.concat(['moving_mean', 'moving_variance']); + + if (this.gpu) { + this.program = _WebGL.webgl2.compileProgram(programSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (!this.axisNormalized) { + this.axis = this.axis < 0 ? x.tensor.shape.length + this.axis : this.axis - 1; + this.axisNormalized = true; + } + + let broadcast = []; + + for (let d = 0; d < x.tensor.shape.length; d++) { + if (d === this.axis) broadcast.push(1);else broadcast.push(null); + } + + let _gamma = new _Tensor.default([], x.tensor.shape); + + let _beta = new _Tensor.default([], x.tensor.shape); + + for (let i = 0; i < x.tensor.shape[this.axis]; i++) { + broadcast[this.axis] = i; + + if (this.scale) { + _ndarrayOps.default.assigns(_gamma.tensor.pick(...broadcast), this.weights['gamma'].tensor.get(i)); + } + + if (this.center) { + _ndarrayOps.default.assigns(_beta.tensor.pick(...broadcast), this.weights['beta'].tensor.get(i)); + } + } + + let _mean = new _Tensor.default([], x.tensor.shape); + + let _std = new _Tensor.default([], x.tensor.shape); + + for (let i = 0; i < x.tensor.shape[this.axis]; i++) { + broadcast[this.axis] = i; + + _ndarrayOps.default.assigns(_mean.tensor.pick(...broadcast), this.weights['moving_mean'].tensor.get(i)); + + _ndarrayOps.default.assigns(_std.tensor.pick(...broadcast), this.weights['moving_variance'].tensor.get(i) + this.epsilon); + } + + _ndarrayOps.default.sqrteq(_std.tensor); + + this.output = new _Tensor.default(x.tensor.data, x.tensor.shape); + + _ndarrayOps.default.subeq(this.output.tensor, _mean.tensor); + + _ndarrayOps.default.diveq(this.output.tensor, _std.tensor); + + if (this.scale) { + _ndarrayOps.default.muleq(this.output.tensor, _gamma.tensor); + } + + if (this.center) { + _ndarrayOps.default.addeq(this.output.tensor, _beta.tensor); + } + } + + _createIndexMap(glTextureShape, indicesForReshaped) { + if (this.normAxisIndexMap) { + return; + } + + const _normAxisIndexMap = new _Tensor.default([], this.inputShape, { + type: Int32Array + }); + + this.normAxisIndexMap = new _Tensor.default([], glTextureShape, { + type: Int32Array + }); + const slice = Array(this.inputShape.length).fill(null); + + for (let i = 0; i < this.inputShape[this.axis]; i++) { + slice[this.axis] = i; + + _ndarrayOps.default.assigns(_normAxisIndexMap.tensor.pick(...slice), i); + } + + if (indicesForReshaped) { + for (let i = 0; i < indicesForReshaped.data.length; i++) { + this.normAxisIndexMap.tensor.data[indicesForReshaped.data[i]] = _normAxisIndexMap.tensor.data[i]; + } + } else { + this.normAxisIndexMap = _normAxisIndexMap; + } + + this.normAxisIndexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + if (!this.axisNormalized) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + this.inputShape = x.tensor.shape; + } + + this.axis = this.axis < 0 ? this.inputShape.length + this.axis : this.axis - 1; + this.axisNormalized = true; + } + + if (!x.glTexture && !x.glTextureFragments) { + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } else if (x.tensor.shape.length > 2 && !x.is2DReshaped) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + } + + this._createIndexMap(x.glTextureShape, x.indicesForReshaped); + + if (!this.output) { + this.output = new _Tensor.default([], x.glTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + + if (x.is1D) { + this.output.is1D = x.is1D; + } else if (x.is2DReshaped || x.is2DSquareReshaped) { + if (x.is2DReshaped) { + this.output.is2DReshaped = x.is2DReshaped; + } else if (x.is2DSquareReshaped) { + this.output.is2DSquareReshaped = x.is2DSquareReshaped; + } + + this.output.originalShape = x.originalShape; + this.output.indicesForReshaped = x.indicesForReshaped; + } + } + + const programInputs = [{ + input: x, + name: 'X' + }, { + input: this.normAxisIndexMap, + name: 'normAxisIndexMap' + }]; + + if (this.scale) { + programInputs.push({ + input: this.weights['gamma'], + name: 'gamma' + }); + } + + if (this.center) { + programInputs.push({ + input: this.weights['beta'], + name: 'beta' + }); + } + + programInputs.push({ + input: this.weights['moving_mean'], + name: 'mean' + }); + programInputs.push({ + input: this.weights['moving_variance'], + name: 'std' + }); + const programUniforms = [{ + value: this.epsilon, + type: 'float', + name: 'epsilon' + }, { + value: +this.scale, + type: 'bool', + name: 'scale' + }, { + value: +this.center, + type: 'bool', + name: 'center' + }]; + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: programInputs, + uniforms: programUniforms, + supportsTextureFragments: true + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = BatchNormalization; \ No newline at end of file diff --git a/lib/layers/normalization/index.js b/lib/layers/normalization/index.js new file mode 100644 index 0000000000..7985bce8aa --- /dev/null +++ b/lib/layers/normalization/index.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "BatchNormalization", { + enumerable: true, + get: function () { + return _BatchNormalization.default; + } +}); + +var _BatchNormalization = _interopRequireDefault(require("./BatchNormalization")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/pooling/AveragePooling1D.js b/lib/layers/pooling/AveragePooling1D.js new file mode 100644 index 0000000000..0ddbe25d2c --- /dev/null +++ b/lib/layers/pooling/AveragePooling1D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling1D2 = _interopRequireDefault(require("./_Pooling1D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class AveragePooling1D extends _Pooling1D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'AveragePooling1D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = AveragePooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/AveragePooling2D.js b/lib/layers/pooling/AveragePooling2D.js new file mode 100644 index 0000000000..b22880d9f8 --- /dev/null +++ b/lib/layers/pooling/AveragePooling2D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling2D2 = _interopRequireDefault(require("./_Pooling2D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class AveragePooling2D extends _Pooling2D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'AveragePooling2D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = AveragePooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/AveragePooling3D.js b/lib/layers/pooling/AveragePooling3D.js new file mode 100644 index 0000000000..a54a3e2d0b --- /dev/null +++ b/lib/layers/pooling/AveragePooling3D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling3D2 = _interopRequireDefault(require("./_Pooling3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class AveragePooling3D extends _Pooling3D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'AveragePooling3D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = AveragePooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalAveragePooling1D.js b/lib/layers/pooling/GlobalAveragePooling1D.js new file mode 100644 index 0000000000..741125c09c --- /dev/null +++ b/lib/layers/pooling/GlobalAveragePooling1D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling1D2 = _interopRequireDefault(require("./_GlobalPooling1D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalAveragePooling1D extends _GlobalPooling1D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalAveragePooling1D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = GlobalAveragePooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalAveragePooling2D.js b/lib/layers/pooling/GlobalAveragePooling2D.js new file mode 100644 index 0000000000..195f3a3787 --- /dev/null +++ b/lib/layers/pooling/GlobalAveragePooling2D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling2D2 = _interopRequireDefault(require("./_GlobalPooling2D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalAveragePooling2D extends _GlobalPooling2D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalAveragePooling2D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = GlobalAveragePooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalAveragePooling3D.js b/lib/layers/pooling/GlobalAveragePooling3D.js new file mode 100644 index 0000000000..9c9c95e6a6 --- /dev/null +++ b/lib/layers/pooling/GlobalAveragePooling3D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling3D2 = _interopRequireDefault(require("./_GlobalPooling3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalAveragePooling3D extends _GlobalPooling3D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalAveragePooling3D'; + this.poolingFunc = 'average'; + } + +} + +exports.default = GlobalAveragePooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalMaxPooling1D.js b/lib/layers/pooling/GlobalMaxPooling1D.js new file mode 100644 index 0000000000..bbc6871b6b --- /dev/null +++ b/lib/layers/pooling/GlobalMaxPooling1D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling1D2 = _interopRequireDefault(require("./_GlobalPooling1D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalMaxPooling1D extends _GlobalPooling1D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalMaxPooling1D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = GlobalMaxPooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalMaxPooling2D.js b/lib/layers/pooling/GlobalMaxPooling2D.js new file mode 100644 index 0000000000..532eed4613 --- /dev/null +++ b/lib/layers/pooling/GlobalMaxPooling2D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling2D2 = _interopRequireDefault(require("./_GlobalPooling2D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalMaxPooling2D extends _GlobalPooling2D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalMaxPooling2D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = GlobalMaxPooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/GlobalMaxPooling3D.js b/lib/layers/pooling/GlobalMaxPooling3D.js new file mode 100644 index 0000000000..cd7de61e57 --- /dev/null +++ b/lib/layers/pooling/GlobalMaxPooling3D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _GlobalPooling3D2 = _interopRequireDefault(require("./_GlobalPooling3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class GlobalMaxPooling3D extends _GlobalPooling3D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'GlobalMaxPooling3D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = GlobalMaxPooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/MaxPooling1D.js b/lib/layers/pooling/MaxPooling1D.js new file mode 100644 index 0000000000..01b7d1c47a --- /dev/null +++ b/lib/layers/pooling/MaxPooling1D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling1D2 = _interopRequireDefault(require("./_Pooling1D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class MaxPooling1D extends _Pooling1D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'MaxPooling1D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = MaxPooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/MaxPooling2D.js b/lib/layers/pooling/MaxPooling2D.js new file mode 100644 index 0000000000..814efd789d --- /dev/null +++ b/lib/layers/pooling/MaxPooling2D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling2D2 = _interopRequireDefault(require("./_Pooling2D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class MaxPooling2D extends _Pooling2D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'MaxPooling2D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = MaxPooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/MaxPooling3D.js b/lib/layers/pooling/MaxPooling3D.js new file mode 100644 index 0000000000..0815b92973 --- /dev/null +++ b/lib/layers/pooling/MaxPooling3D.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Pooling3D2 = _interopRequireDefault(require("./_Pooling3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class MaxPooling3D extends _Pooling3D2.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'MaxPooling3D'; + this.poolingFunc = 'max'; + } + +} + +exports.default = MaxPooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/_GlobalPooling1D.js b/lib/layers/pooling/_GlobalPooling1D.js new file mode 100644 index 0000000000..43020e2b16 --- /dev/null +++ b/lib/layers/pooling/_GlobalPooling1D.js @@ -0,0 +1,103 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int channelDataSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (isMaxPooling) {\r\n // GlobalMaxPooling\r\n float maxval = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n if (j == 0 || val > maxval) {\r\n maxval = val;\r\n }\r\n }\r\n outColor = vec4(maxval);\r\n } else {\r\n // GlobalAveragePooling\r\n float sum = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n sum += val;\r\n }\r\n outColor = vec4(sum / float(channelDataSize));\r\n }\r\n}\r\n"; + +class _GlobalPooling1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_GlobalPooling1D'; + const { + data_format = 'channels_last' + } = attrs; + this.dataFormat = data_format; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const [steps, features] = x.tensor.shape; + this.output = new _Tensor.default([], [features]); + + for (let i = 0, len = features; i < len; i++) { + if (this.poolingFunc === 'max') { + this.output.tensor.set(i, _ndarrayOps.default.sup(x.tensor.pick(null, i))); + } else if (this.poolingFunc === 'average') { + this.output.tensor.set(i, _ndarrayOps.default.sum(x.tensor.pick(null, i)) / steps); + } + } + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + this.inputShape = x.tensor.shape; + + if (!this.output) { + this.output = new _Tensor.default([], [this.inputShape[1]]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const isMaxPooling = this.poolingFunc === 'max'; + + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.inputShape[0], + type: 'int', + name: 'channelDataSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = _GlobalPooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/_GlobalPooling2D.js b/lib/layers/pooling/_GlobalPooling2D.js new file mode 100644 index 0000000000..db587281c3 --- /dev/null +++ b/lib/layers/pooling/_GlobalPooling2D.js @@ -0,0 +1,113 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int channelDataSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (isMaxPooling) {\r\n // GlobalMaxPooling\r\n float maxval = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n if (j == 0 || val > maxval) {\r\n maxval = val;\r\n }\r\n }\r\n outColor = vec4(maxval);\r\n } else {\r\n // GlobalAveragePooling\r\n float sum = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n sum += val;\r\n }\r\n outColor = vec4(sum / float(channelDataSize));\r\n }\r\n}\r\n"; + +class _GlobalPooling2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_GlobalPooling2D'; + const { + data_format = 'channels_last' + } = attrs; + this.dataFormat = data_format; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + const [rows, cols, channels] = x.tensor.shape; + this.output = new _Tensor.default([], [channels]); + + for (let i = 0, len = channels; i < len; i++) { + if (this.poolingFunc === 'max') { + this.output.tensor.set(i, _ndarrayOps.default.sup(x.tensor.pick(null, null, i))); + } else if (this.poolingFunc === 'average') { + this.output.tensor.set(i, _ndarrayOps.default.sum(x.tensor.pick(null, null, i)) / (rows * cols)); + } + } + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this.inputShape = x.tensor.shape; + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], [this.inputShape[2]]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const isMaxPooling = this.poolingFunc === 'max'; + + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.inputShape[0] * this.inputShape[1], + type: 'int', + name: 'channelDataSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = _GlobalPooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/_GlobalPooling3D.js b/lib/layers/pooling/_GlobalPooling3D.js new file mode 100644 index 0000000000..7aaa74e696 --- /dev/null +++ b/lib/layers/pooling/_GlobalPooling3D.js @@ -0,0 +1,113 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int channelDataSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (isMaxPooling) {\r\n // GlobalMaxPooling\r\n float maxval = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n if (j == 0 || val > maxval) {\r\n maxval = val;\r\n }\r\n }\r\n outColor = vec4(maxval);\r\n } else {\r\n // GlobalAveragePooling\r\n float sum = 0.0;\r\n for (int j = 0; j < size[1]; ++j) {\r\n float val = texelFetch(x, ivec2(out_x, j), 0).r;\r\n sum += val;\r\n }\r\n outColor = vec4(sum / float(channelDataSize));\r\n }\r\n}\r\n"; + +class _GlobalPooling3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_GlobalPooling3D'; + const { + data_format = 'channels_last' + } = attrs; + this.dataFormat = data_format; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + const [dim1, dim2, dim3, channels] = x.tensor.shape; + this.output = new _Tensor.default([], [channels]); + + for (let i = 0, len = channels; i < len; i++) { + if (this.poolingFunc === 'max') { + this.output.tensor.set(i, _ndarrayOps.default.sup(x.tensor.pick(null, null, null, i))); + } else if (this.poolingFunc === 'average') { + this.output.tensor.set(i, _ndarrayOps.default.sum(x.tensor.pick(null, null, null, i)) / (dim1 * dim2 * dim3)); + } + } + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this.inputShape = x.tensor.shape; + x.reshapeTo2D(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.output) { + this.output = new _Tensor.default([], [this.inputShape[3]]); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const isMaxPooling = this.poolingFunc === 'max'; + + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: this.inputShape[0] * this.inputShape[1] * this.inputShape[2], + type: 'int', + name: 'channelDataSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = _GlobalPooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/_Pooling1D.js b/lib/layers/pooling/_Pooling1D.js new file mode 100644 index 0000000000..59fa7bfadd --- /dev/null +++ b/lib/layers/pooling/_Pooling1D.js @@ -0,0 +1,210 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(textureSize(poolIndexMap, 0)[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n if (poolIndex != -1) {\r\n float val2 = texelFetch(x, ivec2(out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; +const poolingFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 inputSize = textureSize(x, 0);\r\n ivec2 outputSize = textureSize(poolIndexMap, 0);\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(outputSize[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n int fragmentIndex = int(floor(float(poolIndex) / float(inputSize[1])));\r\n if (poolIndex != -1) {\r\n poolIndex = int(mod(float(poolIndex), float(inputSize[1])));\r\n float val2 = texelFetch(x, ivec2(fragmentIndex * channels + out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; + +class _Pooling1D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_Pooling1D'; + const { + pool_size = 2, + strides = null, + padding = 'valid' + } = attrs; + this.poolSize = pool_size; + this.strides = strides === null ? this.poolSize : strides; + this.padding = padding; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + this.poolingFragmentsProgram = _WebGL.webgl2.compileProgram(poolingFragmentsProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const stepsNew = this.padding === 'valid' ? Math.floor((x.tensor.shape[0] - this.poolSize + this.strides) / this.strides) : Math.floor((x.tensor.shape[0] + this.strides - 1) / this.strides); + this.output = new _Tensor.default([], [stepsNew, x.tensor.shape[1]]); + const outputStep = new _Tensor.default([], [x.tensor.shape[1]]); + let step = this.padding === 'valid' ? 0 : Math.min(0, Math.ceil((x.tensor.shape[0] - (stepsNew - 1) * this.strides - this.poolSize) / 2)); + + for (let i = 0; i < stepsNew; i++) { + let _step = Math.max(0, step); + + let limit = this.poolSize + Math.min(0, step); + + _ndarrayOps.default.assign(outputStep.tensor, x.tensor.pick(_step, null)); + + let count = 1; + + for (let j = 1; j < limit; j++) { + if (_step + j > x.tensor.shape[0] - 1) { + break; + } + + if (this.poolingFunc === 'max') { + _ndarrayOps.default.maxeq(outputStep.tensor, x.tensor.pick(_step + j, null)); + } else if (this.poolingFunc === 'average') { + _ndarrayOps.default.addeq(outputStep.tensor, x.tensor.pick(_step + j, null)); + } + + count += 1; + } + + if (this.poolingFunc === 'average') { + _ndarrayOps.default.divseq(outputStep.tensor, count); + } + + _ndarrayOps.default.assign(this.output.tensor.pick(i, null), outputStep.tensor); + + step += this.strides; + } + } + + _createIndexMap() { + if (this.poolIndexMap) { + return; + } + + const stepsNew = this.padding === 'valid' ? Math.floor((this.inputShape[0] - this.poolSize + this.strides) / this.strides) : Math.floor((this.inputShape[0] + this.strides - 1) / this.strides); + this.outputShape = [stepsNew, this.inputShape[1]]; + this.poolIndexMap = new _Tensor.default([], [stepsNew, this.poolSize], { + type: Int32Array + }); + + _ndarrayOps.default.assigns(this.poolIndexMap.tensor, -1); + + let step = this.padding === 'valid' ? 0 : Math.min(0, Math.ceil((this.inputShape[0] - (stepsNew - 1) * this.strides - this.poolSize) / 2)); + + for (let i = 0; i < stepsNew; i++) { + let _step = Math.max(0, step); + + let limit = this.poolSize + Math.min(0, step); + let inputIndex = _step; + this.poolIndexMap.tensor.set(i, 0, inputIndex); + + for (let j = 1; j < limit; j++) { + inputIndex = _step + j; + + if (inputIndex <= this.inputShape[0] - 1) { + this.poolIndexMap.tensor.set(i, j, inputIndex); + } else { + break; + } + } + + step += this.strides; + } + + this.poolIndexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + if (!x.glTexture && !x.glTextureFragments) { + x.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + this.inputShape = x.tensor.shape; + + this._createIndexMap(); + + if (!this.output) { + this.output = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + const isMaxPooling = this.poolingFunc === 'max'; + const programUniforms = [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'channels' + }, { + value: this.poolSize, + type: 'int', + name: 'poolSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }]; + + if (x.glTextureFragments) { + x.convert2DRowFragmentedGLTextureToColStack(); + + _WebGL.webgl2.runProgram({ + program: this.poolingFragmentsProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms, + supportsTextureFragments: true + }); + + x.removeGLTextureFragmentsAsColStack(); + } else { + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms, + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = _Pooling1D; \ No newline at end of file diff --git a/lib/layers/pooling/_Pooling2D.js b/lib/layers/pooling/_Pooling2D.js new file mode 100644 index 0000000000..4e3641f00e --- /dev/null +++ b/lib/layers/pooling/_Pooling2D.js @@ -0,0 +1,338 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(textureSize(poolIndexMap, 0)[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n if (poolIndex != -1) {\r\n float val2 = texelFetch(x, ivec2(out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; +const poolingFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 inputSize = textureSize(x, 0);\r\n ivec2 outputSize = textureSize(poolIndexMap, 0);\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(outputSize[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n int fragmentIndex = int(floor(float(poolIndex) / float(inputSize[1])));\r\n if (poolIndex != -1) {\r\n poolIndex = int(mod(float(poolIndex), float(inputSize[1])));\r\n float val2 = texelFetch(x, ivec2(fragmentIndex * channels + out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; + +class _Pooling2D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_Pooling2D'; + const { + pool_size = [2, 2], + strides = null, + padding = 'valid', + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(pool_size)) { + this.poolSize = pool_size; + } else { + this.poolSize = [pool_size, pool_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else if (strides !== null) { + this.strides = [strides, strides]; + } else { + this.strides = this.poolSize; + } + + this.padding = padding; + this.dataFormat = data_format; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + this.poolingFragmentsProgram = _WebGL.webgl2.compileProgram(poolingFragmentsProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _calcOutputShape(inputShape) { + if (this.outputShape && this.inputPadding) { + return; + } + + const [inputRows, inputCols, inputChannels] = inputShape; + const [nbRow, nbCol] = this.poolSize; + const outputRows = this.padding === 'same' ? Math.floor((inputRows + this.strides[0] - 1) / this.strides[0]) : Math.floor((inputRows - nbRow + this.strides[0]) / this.strides[0]); + const outputCols = this.padding === 'same' ? Math.floor((inputCols + this.strides[1] - 1) / this.strides[1]) : Math.floor((inputCols - nbCol + this.strides[1]) / this.strides[1]); + const paddingRow = this.padding === 'same' ? Math.max(0, Math.floor((outputRows - 1) * this.strides[0] + nbRow - inputRows)) : 0; + const paddingCol = this.padding === 'same' ? Math.max(0, Math.floor((outputCols - 1) * this.strides[1] + nbCol - inputCols)) : 0; + const paddingRowBefore = Math.floor(paddingRow / 2); + const paddingRowAfter = paddingRow - paddingRowBefore; + const paddingColBefore = Math.floor(paddingCol / 2); + const paddingColAfter = paddingCol - paddingColBefore; + this.outputShape = [outputRows, outputCols, inputChannels]; + this.inputPadding = [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter]; + } + + _padInput(x) { + if (this.padding === 'same') { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.inputPadding; + const newRows = inputRows + paddingRowBefore + paddingRowAfter; + const newCols = inputCols + paddingColBefore + paddingColAfter; + + const _x = new _Tensor.default([], [newRows, newCols, inputChannels]); + + if (this.poolingFunc === 'max') { + _ndarrayOps.default.assigns(_x.tensor, Number.NEGATIVE_INFINITY); + } + + _ndarrayOps.default.assign(_x.tensor.hi(inputRows + paddingRowBefore, inputCols + paddingColBefore, inputChannels).lo(paddingRowBefore, paddingColBefore, 0), x.tensor); + + return _x; + } + + return x; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this._calcOutputShape(x.tensor.shape); + + x = this._padInput(x); + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + const [nbRow, nbCol] = this.poolSize; + this.output = new _Tensor.default([], this.outputShape); + const patch = new _Tensor.default([], [nbRow, nbCol, inputChannels]); + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.inputPadding; + + for (let i = 0, _i = 0; i <= inputRows - nbRow; i += this.strides[0], _i++) { + let nbRowInPadding = 0; + + if (i < paddingRowBefore) { + nbRowInPadding = paddingRowBefore - i; + } else if (i + nbRow > inputRows - paddingRowAfter) { + nbRowInPadding = i + nbRow - (inputRows - paddingRowAfter); + } + + for (let j = 0, _j = 0; j <= inputCols - nbCol; j += this.strides[1], _j++) { + let nbColInPadding = 0; + + if (j < paddingColBefore) { + nbColInPadding = paddingColBefore - j; + } else if (j + nbCol > inputCols - paddingColAfter) { + nbColInPadding = j + nbCol - (inputCols - paddingColAfter); + } + + const nbCellsEffective = (nbRow - nbRowInPadding) * (nbCol - nbColInPadding); + + _ndarrayOps.default.assign(patch.tensor, x.tensor.hi(i + nbRow, j + nbCol, inputChannels).lo(i, j, 0)); + + for (let c = 0; c < inputChannels; c++) { + if (this.poolingFunc === 'max') { + this.output.tensor.set(_i, _j, c, _ndarrayOps.default.sup(patch.tensor.pick(null, null, c))); + } else if (this.poolingFunc === 'average') { + this.output.tensor.set(_i, _j, c, _ndarrayOps.default.sum(patch.tensor.pick(null, null, c)) / nbCellsEffective); + } + } + } + } + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + + _im2col(x) { + const [inputRows, inputCols, inputChannels] = x.tensor.shape; + + if (!this.tiledInput) { + this.tiledInput = new _Tensor.default([], [inputRows * inputCols, inputChannels]); + } + + const patch = new _Tensor.default([], [inputRows, inputCols]); + const patchRaveled = new _Tensor.default([], [inputRows * inputCols]); + + for (let c = 0; c < inputChannels; c++) { + _ndarrayOps.default.assign(patch.tensor, x.tensor.pick(null, null, c)); + + patchRaveled.replaceTensorData(patch.tensor.data); + + _ndarrayOps.default.assign(this.tiledInput.tensor.pick(null, c), patchRaveled.tensor); + } + + return this.tiledInput; + } + + _createIndexMap() { + if (this.poolIndexMap) { + return; + } + + let inputRows = this.inputShape[0]; + let inputCols = this.inputShape[1]; + const rowIndices = new _Tensor.default([], [inputRows, inputCols]); + let index = 0; + + for (let i = 0; i < inputRows; i++) { + for (let j = 0; j < inputCols; j++) { + rowIndices.tensor.set(i, j, index); + index += 1; + } + } + + if (this.padding === 'same') { + const [paddingRowBefore, paddingRowAfter, paddingColBefore, paddingColAfter] = this.inputPadding; + inputRows = inputRows + paddingRowBefore + paddingRowAfter; + inputCols = inputCols + paddingColBefore + paddingColAfter; + + const _rowIndices = new _Tensor.default([], [inputRows, inputCols]); + + _ndarrayOps.default.assigns(_rowIndices.tensor, -1); + + _ndarrayOps.default.assign(_rowIndices.tensor.hi(this.inputShape[0] + paddingRowBefore, this.inputShape[1] + paddingColBefore).lo(paddingRowBefore, paddingColBefore), rowIndices.tensor); + + rowIndices.tensor = _rowIndices.tensor; + } + + const [nbRow, nbCol] = this.poolSize; + const outputRows = this.outputShape[0]; + const outputCols = this.outputShape[1]; + this.poolIndexMap = new _Tensor.default([], [outputRows * outputCols, nbRow * nbCol], { + type: Int32Array + }); + const patchRow = new _Tensor.default([], [nbRow, nbCol]); + let offset = 0; + + for (let i = 0, limit = inputRows - nbRow; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputCols - nbCol; j <= limit; j += this.strides[1]) { + _ndarrayOps.default.assign(patchRow.tensor, rowIndices.tensor.hi(i + nbRow, j + nbCol).lo(i, j)); + + this.poolIndexMap.tensor.data.set(patchRow.tensor.data, offset); + offset += nbRow * nbCol; + } + } + + this.poolIndexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 0); + } + + this.inputShape = x.tensor.shape; + + this._im2col(x); + + this.tiledInput.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + this._calcOutputShape(this.inputShape); + + this._createIndexMap(); + + if (!this.output) { + const [outputRows, outputCols, inputChannels] = this.outputShape; + const outputTextureShape = [outputRows * outputCols, inputChannels]; + this.output = new _Tensor.default([], outputTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this.outputShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + const input = x.is2DReshaped || x.is2DSquareReshaped ? x : this.tiledInput; + const poolSize = this.poolSize[0] * this.poolSize[1]; + const isMaxPooling = this.poolingFunc === 'max'; + const programUniforms = [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'channels' + }, { + value: poolSize, + type: 'int', + name: 'poolSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }]; + + if (input.glTextureFragments) { + input.convert2DRowFragmentedGLTextureToColStack(); + + _WebGL.webgl2.runProgram({ + program: this.poolingFragmentsProgram, + output: this.output, + inputs: [{ + input: input, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms, + supportsTextureFragments: true + }); + + input.removeGLTextureFragmentsAsColStack(); + } else { + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: input, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms, + supportsTextureFragments: true + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(2, 0, 1); + } + } + } + +} + +exports.default = _Pooling2D; \ No newline at end of file diff --git a/lib/layers/pooling/_Pooling3D.js b/lib/layers/pooling/_Pooling3D.js new file mode 100644 index 0000000000..652882cf74 --- /dev/null +++ b/lib/layers/pooling/_Pooling3D.js @@ -0,0 +1,359 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var tensorUtils = _interopRequireWildcard(require("../../utils/tensorUtils")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const poolingProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(textureSize(poolIndexMap, 0)[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n if (poolIndex != -1) {\r\n float val2 = texelFetch(x, ivec2(out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; +const poolingFragmentsProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D poolIndexMap;\r\nuniform int channels;\r\nuniform int poolSize;\r\nuniform bool isMaxPooling;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 inputSize = textureSize(x, 0);\r\n ivec2 outputSize = textureSize(poolIndexMap, 0);\r\n int out_x = int(float(channels) * outTex.x);\r\n int out_y = int(float(outputSize[1]) * outTex.y);\r\n\r\n float val = 0.;\r\n int count = 0;\r\n for (int i = 0; i < poolSize; ++i) {\r\n int poolIndex = texelFetch(poolIndexMap, ivec2(i, out_y), 0).r;\r\n int fragmentIndex = int(floor(float(poolIndex) / float(inputSize[1])));\r\n if (poolIndex != -1) {\r\n poolIndex = int(mod(float(poolIndex), float(inputSize[1])));\r\n float val2 = texelFetch(x, ivec2(fragmentIndex * channels + out_x, poolIndex), 0).r;\r\n if (isMaxPooling) {\r\n if (count == 0 || val2 > val) {\r\n val = val2;\r\n }\r\n } else {\r\n val += val2;\r\n }\r\n count += 1;\r\n }\r\n }\r\n\r\n if (!isMaxPooling) {\r\n val /= float(count);\r\n }\r\n\r\n outColor = vec4(val);\r\n}\r\n"; + +class _Pooling3D extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = '_Pooling3D'; + const { + pool_size = [2, 2, 2], + strides = null, + padding = 'valid', + data_format = 'channels_last' + } = attrs; + + if (Array.isArray(pool_size)) { + this.poolSize = pool_size; + } else { + this.poolSize = [pool_size, pool_size, pool_size]; + } + + if (Array.isArray(strides)) { + this.strides = strides; + } else if (strides !== null) { + this.strides = [strides, strides, strides]; + } else { + this.strides = this.poolSize; + } + + this.padding = padding; + this.dataFormat = data_format; + this.poolingFunc = 'max'; + + if (this.gpu) { + this.poolingProgram = _WebGL.webgl2.compileProgram(poolingProgramSource); + this.poolingFragmentsProgram = _WebGL.webgl2.compileProgram(poolingFragmentsProgramSource); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _calcOutputShape(inputShape) { + if (this.outputShape && this.inputPadding) { + return; + } + + const [inputDim1, inputDim2, inputDim3, inputChannels] = inputShape; + const [poolDim1, poolDim2, poolDim3] = this.poolSize; + const outputDim1 = this.padding === 'same' ? Math.floor((inputDim1 + this.strides[0] - 1) / this.strides[0]) : Math.floor((inputDim1 - poolDim1 + this.strides[0]) / this.strides[0]); + const outputDim2 = this.padding === 'same' ? Math.floor((inputDim2 + this.strides[1] - 1) / this.strides[1]) : Math.floor((inputDim2 - poolDim2 + this.strides[1]) / this.strides[1]); + const outputDim3 = this.padding === 'same' ? Math.floor((inputDim3 + this.strides[2] - 1) / this.strides[2]) : Math.floor((inputDim3 - poolDim3 + this.strides[2]) / this.strides[2]); + const paddingDim1 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim1 - 1) * this.strides[0] + poolDim1 - inputDim1)) : 0; + const paddingDim2 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim2 - 1) * this.strides[1] + poolDim2 - inputDim2)) : 0; + const paddingDim3 = this.padding === 'same' ? Math.max(0, Math.floor((outputDim3 - 1) * this.strides[2] + poolDim3 - inputDim3)) : 0; + const paddingDim1Before = Math.floor(paddingDim1 / 2); + const paddingDim1After = paddingDim1 - paddingDim1Before; + const paddingDim2Before = Math.floor(paddingDim2 / 2); + const paddingDim2After = paddingDim2 - paddingDim2Before; + const paddingDim3Before = Math.floor(paddingDim3 / 2); + const paddingDim3After = paddingDim3 - paddingDim3Before; + this.outputShape = [outputDim1, outputDim2, outputDim3, inputChannels]; + this.inputPadding = [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After]; + } + + _padInput(x) { + if (this.padding === 'same') { + const [inputDim1, inputDim2, inputDim3, inputChannels] = x.tensor.shape; + const [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After] = this.inputPadding; + const newDim1 = inputDim1 + paddingDim1Before + paddingDim1After; + const newDim2 = inputDim2 + paddingDim2Before + paddingDim2After; + const newDim3 = inputDim3 + paddingDim3Before + paddingDim3After; + + const _x = new _Tensor.default([], [newDim1, newDim2, newDim3, inputChannels]); + + if (this.poolingFunc === 'max') { + _ndarrayOps.default.assigns(_x.tensor, Number.NEGATIVE_INFINITY); + } + + _ndarrayOps.default.assign(_x.tensor.hi(inputDim1 + paddingDim1Before, inputDim2 + paddingDim2Before, inputDim3 + paddingDim3Before, inputChannels).lo(paddingDim1Before, paddingDim2Before, paddingDim3Before, 0), x.tensor); + + return _x; + } + + return x; + } + + _callCPU(x) { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this._calcOutputShape(x.tensor.shape); + + x = this._padInput(x); + const [inputDim1, inputDim2, inputDim3, inputChannels] = x.tensor.shape; + const [poolDim1, poolDim2, poolDim3] = this.poolSize; + this.output = new _Tensor.default([], this.outputShape); + let patch = new _Tensor.default([], [poolDim1, poolDim2, poolDim3, inputChannels]); + const [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After] = this.inputPadding; + + for (let i = 0, _i = 0; i <= inputDim1 - poolDim1; i += this.strides[0], _i++) { + let dim1InPadding = 0; + + if (i < paddingDim1Before) { + dim1InPadding = paddingDim1Before - i; + } else if (i + poolDim1 > inputDim1 - paddingDim1After) { + dim1InPadding = i + poolDim1 - (inputDim1 - paddingDim1After); + } + + for (let j = 0, _j = 0; j <= inputDim2 - poolDim2; j += this.strides[1], _j++) { + let dim2InPadding = 0; + + if (j < paddingDim2Before) { + dim2InPadding = paddingDim2Before - j; + } else if (j + poolDim2 > inputDim2 - paddingDim2After) { + dim2InPadding = j + poolDim2 - (inputDim2 - paddingDim2After); + } + + for (let k = 0, _k = 0; k <= inputDim3 - poolDim3; k += this.strides[2], _k++) { + let dim3InPadding = 0; + + if (k < paddingDim3Before) { + dim3InPadding = paddingDim3Before - k; + } else if (k + poolDim3 > inputDim3 - paddingDim3After) { + dim3InPadding = k + poolDim3 - (inputDim3 - paddingDim3After); + } + + const nbCellsEffective = (poolDim1 - dim1InPadding) * (poolDim2 - dim2InPadding) * (poolDim3 - dim3InPadding); + + _ndarrayOps.default.assign(patch.tensor, x.tensor.hi(i + poolDim1, j + poolDim2, k + poolDim3, inputChannels).lo(i, j, k, 0)); + + for (let c = 0; c < inputChannels; c++) { + if (this.poolingFunc === 'max') { + this.output.tensor.set(_i, _j, _k, c, _ndarrayOps.default.sup(patch.tensor.pick(null, null, null, c))); + } else if (this.poolingFunc === 'average') { + this.output.tensor.set(_i, _j, _k, c, _ndarrayOps.default.sum(patch.tensor.pick(null, null, null, c)) / nbCellsEffective); + } + } + } + } + } + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + + _vol2col(x) { + const [inputDim1, inputDim2, inputDim3, inputChannels] = x.tensor.shape; + + if (!this.tiledInput) { + this.tiledInput = new _Tensor.default([], [inputDim1 * inputDim2 * inputDim3, inputChannels]); + } + + const patch = new _Tensor.default([], [inputDim1, inputDim2, inputDim3]); + const patchRaveled = new _Tensor.default([], [inputDim1 * inputDim2 * inputDim3]); + + for (let c = 0; c < inputChannels; c++) { + _ndarrayOps.default.assign(patch.tensor, x.tensor.pick(null, null, null, c)); + + patchRaveled.replaceTensorData(patch.tensor.data); + + _ndarrayOps.default.assign(this.tiledInput.tensor.pick(null, c), patchRaveled.tensor); + } + + return this.tiledInput; + } + + _createIndexMap() { + if (this.poolIndexMap) { + return; + } + + let inputDim1 = this.inputShape[0]; + let inputDim2 = this.inputShape[1]; + let inputDim3 = this.inputShape[2]; + const rowIndices = new _Tensor.default([], [inputDim1, inputDim2, inputDim3]); + let index = 0; + + for (let i = 0; i < inputDim1; i++) { + for (let j = 0; j < inputDim2; j++) { + for (let k = 0; k < inputDim3; k++) { + rowIndices.tensor.set(i, j, k, index); + index += 1; + } + } + } + + if (this.padding === 'same') { + const [paddingDim1Before, paddingDim1After, paddingDim2Before, paddingDim2After, paddingDim3Before, paddingDim3After] = this.inputPadding; + inputDim1 = inputDim1 + paddingDim1Before + paddingDim1After; + inputDim2 = inputDim2 + paddingDim2Before + paddingDim2After; + inputDim3 = inputDim3 + paddingDim3Before + paddingDim3After; + + const _rowIndices = new _Tensor.default([], [inputDim1, inputDim2, inputDim3]); + + _ndarrayOps.default.assigns(_rowIndices.tensor, -1); + + _ndarrayOps.default.assign(_rowIndices.tensor.hi(this.inputShape[0] + paddingDim1Before, this.inputShape[1] + paddingDim2Before, this.inputShape[2] + paddingDim3Before).lo(paddingDim1Before, paddingDim2Before, paddingDim3Before), rowIndices.tensor); + + rowIndices.tensor = _rowIndices.tensor; + } + + const [poolDim1, poolDim2, poolDim3] = this.poolSize; + const outputDim1 = this.outputShape[0]; + const outputDim2 = this.outputShape[1]; + const outputDim3 = this.outputShape[2]; + this.poolIndexMap = new _Tensor.default([], [outputDim1 * outputDim2 * outputDim3, poolDim1 * poolDim2 * poolDim3], { + type: Int32Array + }); + const patchRow = new _Tensor.default([], [poolDim1, poolDim2, poolDim3]); + let offset = 0; + + for (let i = 0, limit = inputDim1 - poolDim1; i <= limit; i += this.strides[0]) { + for (let j = 0, limit = inputDim2 - poolDim2; j <= limit; j += this.strides[1]) { + for (let k = 0, limit = inputDim3 - poolDim3; k <= limit; k += this.strides[2]) { + _ndarrayOps.default.assign(patchRow.tensor, rowIndices.tensor.hi(i + poolDim1, j + poolDim2, k + poolDim3).lo(i, j, k)); + + this.poolIndexMap.tensor.data.set(patchRow.tensor.data, offset); + offset += poolDim1 * poolDim2 * poolDim3; + } + } + } + + this.poolIndexMap.createGLTexture({ + type: '2d', + format: 'int', + supportsTextureFragments: true + }); + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + if (this.dataFormat === 'channels_first') { + x.tensor = x.tensor.transpose(1, 2, 3, 0); + } + + this.inputShape = x.tensor.shape; + + this._vol2col(x); + + this.tiledInput.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + } + + this._calcOutputShape(this.inputShape); + + this._createIndexMap(); + + if (!this.output) { + const [outputDim1, outputDim2, outputDim3, inputChannels] = this.outputShape; + const outputTextureShape = [outputDim1 * outputDim2 * outputDim3, inputChannels]; + this.output = new _Tensor.default([], outputTextureShape); + this.output.createGLTexture({ + type: '2d', + format: 'float', + supportsTextureFragments: true + }); + this.output.is2DReshaped = true; + this.output.originalShape = this.outputShape; + this.output.indicesForReshaped = tensorUtils.createIndicesFor2DReshaped(this.outputShape, false, -1); + } + + const input = x.is2DReshaped || x.is2DSquareReshaped ? x : this.tiledInput; + const poolSize = this.poolSize[0] * this.poolSize[1] * this.poolSize[2]; + const isMaxPooling = this.poolingFunc === 'max'; + const programUniforms = [{ + value: this.output.glTextureShape[1], + type: 'int', + name: 'channels' + }, { + value: poolSize, + type: 'int', + name: 'poolSize' + }, { + value: +isMaxPooling, + type: 'bool', + name: 'isMaxPooling' + }]; + + if (input.glTextureFragments) { + input.convert2DRowFragmentedGLTextureToColStack(); + + _WebGL.webgl2.runProgram({ + program: this.poolingFragmentsProgram, + output: this.output, + inputs: [{ + input: input, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms, + supportsTextureFragments: true + }); + + input.removeGLTextureFragmentsAsColStack(); + } else { + _WebGL.webgl2.runProgram({ + program: this.poolingProgram, + output: this.output, + inputs: [{ + input: input, + name: 'x' + }, { + input: this.poolIndexMap, + name: 'poolIndexMap' + }], + uniforms: programUniforms + }); + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + this.output.reshapeFrom2D(); + + if (this.dataFormat === 'channels_first') { + this.output.tensor = this.output.tensor.transpose(3, 0, 1, 2); + } + } + } + +} + +exports.default = _Pooling3D; \ No newline at end of file diff --git a/lib/layers/pooling/index.js b/lib/layers/pooling/index.js new file mode 100644 index 0000000000..6774b8b615 --- /dev/null +++ b/lib/layers/pooling/index.js @@ -0,0 +1,103 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "MaxPooling1D", { + enumerable: true, + get: function () { + return _MaxPooling1D.default; + } +}); +Object.defineProperty(exports, "MaxPooling2D", { + enumerable: true, + get: function () { + return _MaxPooling2D.default; + } +}); +Object.defineProperty(exports, "MaxPooling3D", { + enumerable: true, + get: function () { + return _MaxPooling3D.default; + } +}); +Object.defineProperty(exports, "AveragePooling1D", { + enumerable: true, + get: function () { + return _AveragePooling1D.default; + } +}); +Object.defineProperty(exports, "AveragePooling2D", { + enumerable: true, + get: function () { + return _AveragePooling2D.default; + } +}); +Object.defineProperty(exports, "AveragePooling3D", { + enumerable: true, + get: function () { + return _AveragePooling3D.default; + } +}); +Object.defineProperty(exports, "GlobalMaxPooling1D", { + enumerable: true, + get: function () { + return _GlobalMaxPooling1D.default; + } +}); +Object.defineProperty(exports, "GlobalMaxPooling2D", { + enumerable: true, + get: function () { + return _GlobalMaxPooling2D.default; + } +}); +Object.defineProperty(exports, "GlobalMaxPooling3D", { + enumerable: true, + get: function () { + return _GlobalMaxPooling3D.default; + } +}); +Object.defineProperty(exports, "GlobalAveragePooling1D", { + enumerable: true, + get: function () { + return _GlobalAveragePooling1D.default; + } +}); +Object.defineProperty(exports, "GlobalAveragePooling2D", { + enumerable: true, + get: function () { + return _GlobalAveragePooling2D.default; + } +}); +Object.defineProperty(exports, "GlobalAveragePooling3D", { + enumerable: true, + get: function () { + return _GlobalAveragePooling3D.default; + } +}); + +var _MaxPooling1D = _interopRequireDefault(require("./MaxPooling1D")); + +var _MaxPooling2D = _interopRequireDefault(require("./MaxPooling2D")); + +var _MaxPooling3D = _interopRequireDefault(require("./MaxPooling3D")); + +var _AveragePooling1D = _interopRequireDefault(require("./AveragePooling1D")); + +var _AveragePooling2D = _interopRequireDefault(require("./AveragePooling2D")); + +var _AveragePooling3D = _interopRequireDefault(require("./AveragePooling3D")); + +var _GlobalMaxPooling1D = _interopRequireDefault(require("./GlobalMaxPooling1D")); + +var _GlobalMaxPooling2D = _interopRequireDefault(require("./GlobalMaxPooling2D")); + +var _GlobalMaxPooling3D = _interopRequireDefault(require("./GlobalMaxPooling3D")); + +var _GlobalAveragePooling1D = _interopRequireDefault(require("./GlobalAveragePooling1D")); + +var _GlobalAveragePooling2D = _interopRequireDefault(require("./GlobalAveragePooling2D")); + +var _GlobalAveragePooling3D = _interopRequireDefault(require("./GlobalAveragePooling3D")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/recurrent/GRU.js b/lib/layers/recurrent/GRU.js new file mode 100644 index 0000000000..6bf7c72d37 --- /dev/null +++ b/lib/layers/recurrent/GRU.js @@ -0,0 +1,682 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var activations = _interopRequireWildcard(require("../../activations")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayBlasLevel = require("ndarray-blas-level2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _cwise = _interopRequireDefault(require("cwise")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +const copyTextureProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D source;\r\nout vec4 outColor;\r\n\r\nvoid main(void) {\r\n outColor = texture(source, vec2(outTex.x, outTex.y));\r\n}\r\n"; +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; +const gateSummationProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D t1;\r\nuniform sampler2D t2;\r\nuniform sampler2D bias;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(bias, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float t1_val = texelFetch(t1, ivec2(out_x, out_y), 0).r;\r\n float t2_val = texelFetch(t2, ivec2(out_x, out_y), 0).r;\r\n float bias_val = texelFetch(bias, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(t1_val + t2_val + bias_val);\r\n}\r\n"; +const gateProductProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D t1;\r\nuniform sampler2D t2;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(t1, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float t1_val = texelFetch(t1, ivec2(out_x, out_y), 0).r;\r\n float t2_val = texelFetch(t2, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(t1_val * t2_val);\r\n}\r\n"; +const timestepReadProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n\r\n outColor = vec4(texelFetch(x, ivec2(out_x, index), 0).r);\r\n}\r\n"; +const timestepWriteProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform sampler2D y;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(y, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (out_y == index) {\r\n outColor = vec4(texelFetch(x, ivec2(out_x, 0), 0).r);\r\n } else {\r\n outColor = vec4(texelFetch(y, ivec2(out_x, out_y), 0).r);\r\n }\r\n}\r\n"; +const updateProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D h;\r\nuniform sampler2D htm1;\r\nuniform sampler2D z;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(h, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float h_val = texelFetch(h, ivec2(out_x, out_y), 0).r;\r\n float htm1_val = texelFetch(htm1, ivec2(out_x, out_y), 0).r;\r\n float z_val = texelFetch(z, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(h_val * (float(1.0) - z_val) + htm1_val * z_val);\r\n}\r\n"; + +class GRU extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + Object.defineProperty(this, "_combine", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array', 'array', 'array'], + body: function (_y, _x1, _x2, _b) { + _y = _x1 + _x2 + _b; + } + }) + }); + Object.defineProperty(this, "_update", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array', 'array'], + body: function (_h, _htm1, _z) { + _h = _h * (1 - _z) + _htm1 * _z; + } + }) + }); + this.layerClass = 'GRU'; + const { + units = 1, + activation = 'tanh', + use_bias = true, + recurrent_activation = 'hard_sigmoid', + return_sequences = false, + go_backwards = false, + stateful = false + } = attrs; + this.units = units; + this.activation = activation; + this.recurrentActivation = recurrent_activation; + this.activationFunc = activations[activation]; + this.recurrentActivationFunc = activations[recurrent_activation]; + this.use_bias = use_bias; + this.returnSequences = return_sequences; + this.goBackwards = go_backwards; + this.stateful = stateful; + this.params = this.use_bias ? ['kernel', 'recurrent_kernel', 'bias'] : ['kernel', 'recurrent_kernel']; + + if (this.gpu) { + this.copyTextureProgram = _WebGL.webgl2.compileProgram(copyTextureProgramSource); + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + this.recurrentActivationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.recurrentActivation]); + this.gateSummationProgram = _WebGL.webgl2.compileProgram(gateSummationProgramSource); + this.gateProductProgram = _WebGL.webgl2.compileProgram(gateProductProgramSource); + this.timestepReadProgram = _WebGL.webgl2.compileProgram(timestepReadProgramSource); + this.timestepWriteProgram = _WebGL.webgl2.compileProgram(timestepWriteProgramSource); + this.updateProgram = _WebGL.webgl2.compileProgram(updateProgramSource); + } + } + + setWeights(weightsArr) { + super.setWeights(weightsArr); + const shape_W = this.weights['kernel'].tensor.shape; + this.weights['W_z'] = new _Tensor.default([], [shape_W[0], this.units]); + this.weights['W_r'] = new _Tensor.default([], [shape_W[0], this.units]); + this.weights['W_h'] = new _Tensor.default([], [shape_W[0], this.units]); + + _ndarrayOps.default.assign(this.weights['W_z'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], this.units).lo(0, 0)); + + _ndarrayOps.default.assign(this.weights['W_r'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], 2 * this.units).lo(0, this.units)); + + _ndarrayOps.default.assign(this.weights['W_h'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], 3 * this.units).lo(0, 2 * this.units)); + + const shape_U = this.weights['recurrent_kernel'].tensor.shape; + this.weights['U_z'] = new _Tensor.default([], [shape_U[0], this.units]); + this.weights['U_r'] = new _Tensor.default([], [shape_U[0], this.units]); + this.weights['U_h'] = new _Tensor.default([], [shape_U[0], this.units]); + + _ndarrayOps.default.assign(this.weights['U_z'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], this.units).lo(0, 0)); + + _ndarrayOps.default.assign(this.weights['U_r'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 2 * this.units).lo(0, this.units)); + + _ndarrayOps.default.assign(this.weights['U_h'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 3 * this.units).lo(0, 2 * this.units)); + + this.weights['b_z'] = new _Tensor.default([], [this.units]); + this.weights['b_r'] = new _Tensor.default([], [this.units]); + this.weights['b_h'] = new _Tensor.default([], [this.units]); + + if (this.use_bias) { + _ndarrayOps.default.assign(this.weights['b_z'].tensor, this.weights['bias'].tensor.hi(this.units).lo(0)); + + _ndarrayOps.default.assign(this.weights['b_r'].tensor, this.weights['bias'].tensor.hi(2 * this.units).lo(this.units)); + + _ndarrayOps.default.assign(this.weights['b_h'].tensor, this.weights['bias'].tensor.hi(3 * this.units).lo(2 * this.units)); + } + + if (this.gpu) { + const names = ['W_z', 'W_r', 'W_h', 'U_z', 'U_r', 'U_h', 'b_z', 'b_r', 'b_h']; + names.forEach(name => { + this.weights[name].createGLTexture({ + type: '2d', + format: 'float' + }); + }); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const dimUpdateGate = this.weights['b_z'].tensor.shape[0]; + const dimResetGate = this.weights['b_r'].tensor.shape[0]; + const dimHiddenState = this.weights['b_h'].tensor.shape[0]; + const currentUpdateGateState = new _Tensor.default([], [dimUpdateGate]); + const tempXZ = new _Tensor.default([], [dimUpdateGate]); + const tempHZ = new _Tensor.default([], [dimUpdateGate]); + const currentResetGateState = new _Tensor.default([], [dimResetGate]); + const tempXR = new _Tensor.default([], [dimResetGate]); + const tempHR = new _Tensor.default([], [dimResetGate]); + const currentHiddenState = this.stateful && this.currentHiddenState ? this.currentHiddenState : new _Tensor.default([], [dimHiddenState]); + const tempXH = new _Tensor.default([], [dimHiddenState]); + const tempHH = new _Tensor.default([], [dimHiddenState]); + const previousHiddenState = new _Tensor.default([], [dimHiddenState]); + this.hiddenStateSequence = new _Tensor.default([], [x.tensor.shape[0], dimHiddenState]); + const currentX = new _Tensor.default([], [x.tensor.shape[1]]); + + const _step = () => { + _ndarrayOps.default.assign(previousHiddenState.tensor, currentHiddenState.tensor); + + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_z'].tensor.transpose(1, 0), currentX.tensor, 1, tempXZ.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_z'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHZ.tensor); + + this._combine(currentUpdateGateState.tensor, tempXZ.tensor, tempHZ.tensor, this.weights['b_z'].tensor); + + this.recurrentActivationFunc(currentUpdateGateState); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_r'].tensor.transpose(1, 0), currentX.tensor, 1, tempXR.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_r'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHR.tensor); + + this._combine(currentResetGateState.tensor, tempXR.tensor, tempHR.tensor, this.weights['b_r'].tensor); + + this.recurrentActivationFunc(currentResetGateState); + + _ndarrayOps.default.muleq(currentResetGateState.tensor, previousHiddenState.tensor); + + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_h'].tensor.transpose(1, 0), currentX.tensor, 1, tempXH.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_h'].tensor.transpose(1, 0), currentResetGateState.tensor, 1, tempHH.tensor); + + this._combine(currentHiddenState.tensor, tempXH.tensor, tempHH.tensor, this.weights['b_h'].tensor); + + this.activationFunc(currentHiddenState); + + this._update(currentHiddenState.tensor, previousHiddenState.tensor, currentUpdateGateState.tensor); + }; + + for (let i = 0, len = x.tensor.shape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _ndarrayOps.default.assign(currentX.tensor, x.tensor.pick(inputIndex, null)); + + const tempTensors = [tempXZ, tempHZ, tempXR, tempHR, tempXH, tempHH]; + tempTensors.forEach(temp => _ndarrayOps.default.assigns(temp.tensor, 0)); + + _step(); + + if (this.returnSequences) { + _ndarrayOps.default.assign(this.hiddenStateSequence.tensor.pick(i, null), currentHiddenState.tensor); + } + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = currentHiddenState; + } + + if (this.stateful) { + this.currentHiddenState = currentHiddenState; + } + } + + _stepGPU() { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.previousHiddenState, + inputs: [{ + input: this.currentHiddenState, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXZ, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_z'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHZ, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_z'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentUpdateGateStatePreactiv, + inputs: [{ + input: this.tempXZ, + name: 't1' + }, { + input: this.tempHZ, + name: 't2' + }, { + input: this.weights['b_z'], + name: 'bias' + }] + }); + + if (this.recurrentActivation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.recurrentActivationProgram, + output: this.currentUpdateGateState, + inputs: [{ + input: this.currentUpdateGateStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentUpdateGateState = this.currentUpdateGateStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXR, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_r'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHR, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_r'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentResetGateStatePreactiv, + inputs: [{ + input: this.tempXR, + name: 't1' + }, { + input: this.tempHR, + name: 't2' + }, { + input: this.weights['b_r'], + name: 'bias' + }] + }); + + if (this.recurrentActivation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.recurrentActivationProgram, + output: this.currentResetGateState, + inputs: [{ + input: this.currentResetGateStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentResetGateState = this.currentResetGateStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.currentResetGateStateCopy, + inputs: [{ + input: this.currentResetGateState, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateProductProgram, + output: this.currentResetGateState, + inputs: [{ + input: this.currentResetGateStateCopy, + name: 't1' + }, { + input: this.previousHiddenState, + name: 't2' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXH, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_h'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHH, + inputs: [{ + input: this.currentResetGateState, + name: 'A' + }, { + input: this.weights['U_h'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentHiddenStatePreactiv, + inputs: [{ + input: this.tempXH, + name: 't1' + }, { + input: this.tempHH, + name: 't2' + }, { + input: this.weights['b_h'], + name: 'bias' + }] + }); + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.currentHiddenState, + inputs: [{ + input: this.currentHiddenStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentHiddenState = this.currentHiddenStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.currentHiddenStateCopy, + inputs: [{ + input: this.currentHiddenState, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.updateProgram, + output: this.currentHiddenState, + inputs: [{ + input: this.currentHiddenStateCopy, + name: 'h' + }, { + input: this.previousHiddenState, + name: 'htm1' + }, { + input: this.currentUpdateGateState, + name: 'z' + }] + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const dimUpdateGate = this.weights['b_z'].glTextureShape[1]; + const dimResetGate = this.weights['b_r'].glTextureShape[1]; + const dimHiddenState = this.weights['b_h'].glTextureShape[1]; + + if (!this.currentHiddenState || !this.stateful) { + this.currentHiddenState = new _Tensor.default([], [dimHiddenState]); + this.currentHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentHiddenStateCopy) { + this.currentHiddenStateCopy = new _Tensor.default([], [dimHiddenState]); + this.currentHiddenStateCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentHiddenStatePreactiv) { + this.currentHiddenStatePreactiv = new _Tensor.default([], [dimHiddenState]); + this.currentHiddenStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentUpdateGateState) { + this.currentUpdateGateState = new _Tensor.default([], [dimUpdateGate]); + this.currentUpdateGateState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentUpdateGateStatePreactiv) { + this.currentUpdateGateStatePreactiv = new _Tensor.default([], [dimUpdateGate]); + this.currentUpdateGateStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXZ) { + this.tempXZ = new _Tensor.default([], [dimUpdateGate]); + this.tempXZ.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHZ) { + this.tempHZ = new _Tensor.default([], [dimUpdateGate]); + this.tempHZ.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentResetGateState) { + this.currentResetGateState = new _Tensor.default([], [dimResetGate]); + this.currentResetGateState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentResetGateStateCopy) { + this.currentResetGateStateCopy = new _Tensor.default([], [dimResetGate]); + this.currentResetGateStateCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentResetGateStatePreactiv) { + this.currentResetGateStatePreactiv = new _Tensor.default([], [dimResetGate]); + this.currentResetGateStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXR) { + this.tempXR = new _Tensor.default([], [dimResetGate]); + this.tempXR.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHR) { + this.tempHR = new _Tensor.default([], [dimResetGate]); + this.tempHR.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXH) { + this.tempXH = new _Tensor.default([], [dimHiddenState]); + this.tempXH.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHH) { + this.tempHH = new _Tensor.default([], [dimHiddenState]); + this.tempHH.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.previousHiddenState) { + this.previousHiddenState = new _Tensor.default([], [dimHiddenState]); + this.previousHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequence) { + this.hiddenStateSequence = new _Tensor.default([], [x.glTextureShape[0], dimHiddenState]); + this.hiddenStateSequence.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequenceCopy) { + this.hiddenStateSequenceCopy = new _Tensor.default([], [x.glTextureShape[0], dimHiddenState]); + this.hiddenStateSequenceCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentX) { + this.currentX = new _Tensor.default([], [x.glTextureShape[1]]); + this.currentX.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + for (let i = 0, len = x.glTextureShape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _WebGL.webgl2.runProgram({ + program: this.timestepReadProgram, + output: this.currentX, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: inputIndex, + type: 'int', + name: 'index' + }] + }); + + this._stepGPU(); + + if (this.returnSequences) { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.hiddenStateSequenceCopy, + inputs: [{ + input: this.hiddenStateSequence, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.timestepWriteProgram, + output: this.hiddenStateSequence, + inputs: [{ + input: this.currentHiddenState, + name: 'x' + }, { + input: this.hiddenStateSequenceCopy, + name: 'y' + }], + uniforms: [{ + value: i, + type: 'int', + name: 'index' + }] + }); + } + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = this.currentHiddenState; + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = GRU; \ No newline at end of file diff --git a/lib/layers/recurrent/LSTM.js b/lib/layers/recurrent/LSTM.js new file mode 100644 index 0000000000..66e38fb29c --- /dev/null +++ b/lib/layers/recurrent/LSTM.js @@ -0,0 +1,833 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var activations = _interopRequireWildcard(require("../../activations")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayBlasLevel = require("ndarray-blas-level2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _cwise = _interopRequireDefault(require("cwise")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +const copyTextureProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D source;\r\nout vec4 outColor;\r\n\r\nvoid main(void) {\r\n outColor = texture(source, vec2(outTex.x, outTex.y));\r\n}\r\n"; +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; +const gateSummationProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D t1;\r\nuniform sampler2D t2;\r\nuniform sampler2D bias;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(bias, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float t1_val = texelFetch(t1, ivec2(out_x, out_y), 0).r;\r\n float t2_val = texelFetch(t2, ivec2(out_x, out_y), 0).r;\r\n float bias_val = texelFetch(bias, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(t1_val + t2_val + bias_val);\r\n}\r\n"; +const gateProductProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D t1;\r\nuniform sampler2D t2;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(t1, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float t1_val = texelFetch(t1, ivec2(out_x, out_y), 0).r;\r\n float t2_val = texelFetch(t2, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(t1_val * t2_val);\r\n}\r\n"; +const timestepReadProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n\r\n outColor = vec4(texelFetch(x, ivec2(out_x, index), 0).r);\r\n}\r\n"; +const timestepWriteProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform sampler2D y;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(y, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (out_y == index) {\r\n outColor = vec4(texelFetch(x, ivec2(out_x, 0), 0).r);\r\n } else {\r\n outColor = vec4(texelFetch(y, ivec2(out_x, out_y), 0).r);\r\n }\r\n}\r\n"; +const updateProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D c;\r\nuniform sampler2D ctm1;\r\nuniform sampler2D i;\r\nuniform sampler2D f;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(c, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float c_val = texelFetch(c, ivec2(out_x, out_y), 0).r;\r\n float ctm1_val = texelFetch(ctm1, ivec2(out_x, out_y), 0).r;\r\n float i_val = texelFetch(i, ivec2(out_x, out_y), 0).r;\r\n float f_val = texelFetch(f, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(c_val * i_val + ctm1_val * f_val);\r\n}\r\n"; + +class LSTM extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + Object.defineProperty(this, "_combine", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array', 'array', 'array'], + body: function (_y, _x1, _x2, _b) { + _y = _x1 + _x2 + _b; + } + }) + }); + Object.defineProperty(this, "_update", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array', 'array', 'array'], + body: function (_c, _ctm1, _i, _f) { + _c = _c * _i + _ctm1 * _f; + } + }) + }); + this.layerClass = 'LSTM'; + const { + units = 1, + activation = 'tanh', + use_bias = true, + recurrent_activation = 'hard_sigmoid', + return_sequences = false, + go_backwards = false, + stateful = false + } = attrs; + this.units = units; + this.activation = activation; + this.recurrentActivation = recurrent_activation; + this.activationFunc = activations[activation]; + this.recurrentActivationFunc = activations[recurrent_activation]; + this.use_bias = use_bias; + this.returnSequences = return_sequences; + this.goBackwards = go_backwards; + this.stateful = stateful; + this.params = this.use_bias ? ['kernel', 'recurrent_kernel', 'bias'] : ['kernel', 'recurrent_kernel']; + + if (this.gpu) { + this.copyTextureProgram = _WebGL.webgl2.compileProgram(copyTextureProgramSource); + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + this.recurrentActivationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.recurrentActivation]); + this.gateSummationProgram = _WebGL.webgl2.compileProgram(gateSummationProgramSource); + this.gateProductProgram = _WebGL.webgl2.compileProgram(gateProductProgramSource); + this.timestepReadProgram = _WebGL.webgl2.compileProgram(timestepReadProgramSource); + this.timestepWriteProgram = _WebGL.webgl2.compileProgram(timestepWriteProgramSource); + this.updateProgram = _WebGL.webgl2.compileProgram(updateProgramSource); + } + } + + setWeights(weightsArr) { + super.setWeights(weightsArr); + const shape_W = this.weights['kernel'].tensor.shape; + this.weights['W_i'] = new _Tensor.default([], [shape_W[0], this.units]); + this.weights['W_f'] = new _Tensor.default([], [shape_W[0], this.units]); + this.weights['W_c'] = new _Tensor.default([], [shape_W[0], this.units]); + this.weights['W_o'] = new _Tensor.default([], [shape_W[0], this.units]); + + _ndarrayOps.default.assign(this.weights['W_i'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], this.units).lo(0, 0)); + + _ndarrayOps.default.assign(this.weights['W_f'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], 2 * this.units).lo(0, this.units)); + + _ndarrayOps.default.assign(this.weights['W_c'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], 3 * this.units).lo(0, 2 * this.units)); + + _ndarrayOps.default.assign(this.weights['W_o'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], 4 * this.units).lo(0, 3 * this.units)); + + const shape_U = this.weights['recurrent_kernel'].tensor.shape; + this.weights['U_i'] = new _Tensor.default([], [shape_U[0], this.units]); + this.weights['U_f'] = new _Tensor.default([], [shape_U[0], this.units]); + this.weights['U_c'] = new _Tensor.default([], [shape_U[0], this.units]); + this.weights['U_o'] = new _Tensor.default([], [shape_U[0], this.units]); + + _ndarrayOps.default.assign(this.weights['U_i'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], this.units).lo(0, 0)); + + _ndarrayOps.default.assign(this.weights['U_f'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 2 * this.units).lo(0, this.units)); + + _ndarrayOps.default.assign(this.weights['U_c'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 3 * this.units).lo(0, 2 * this.units)); + + _ndarrayOps.default.assign(this.weights['U_o'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 4 * this.units).lo(0, 3 * this.units)); + + this.weights['b_i'] = new _Tensor.default([], [this.units]); + this.weights['b_f'] = new _Tensor.default([], [this.units]); + this.weights['b_c'] = new _Tensor.default([], [this.units]); + this.weights['b_o'] = new _Tensor.default([], [this.units]); + + if (this.use_bias) { + _ndarrayOps.default.assign(this.weights['b_i'].tensor, this.weights['bias'].tensor.hi(this.units).lo(0)); + + _ndarrayOps.default.assign(this.weights['b_f'].tensor, this.weights['bias'].tensor.hi(2 * this.units).lo(this.units)); + + _ndarrayOps.default.assign(this.weights['b_c'].tensor, this.weights['bias'].tensor.hi(3 * this.units).lo(2 * this.units)); + + _ndarrayOps.default.assign(this.weights['b_o'].tensor, this.weights['bias'].tensor.hi(4 * this.units).lo(3 * this.units)); + } + + if (this.gpu) { + const names = ['W_i', 'W_f', 'W_c', 'W_o', 'U_i', 'U_f', 'U_c', 'U_o', 'b_i', 'b_f', 'b_c', 'b_o']; + names.forEach(name => { + this.weights[name].createGLTexture({ + type: '2d', + format: 'float' + }); + }); + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const dimInputGate = this.weights['b_i'].tensor.shape[0]; + const dimCandidate = this.weights['b_c'].tensor.shape[0]; + const dimForgetGate = this.weights['b_f'].tensor.shape[0]; + const dimOutputGate = this.weights['b_o'].tensor.shape[0]; + const currentInputGateState = new _Tensor.default([], [dimInputGate]); + const tempXI = new _Tensor.default([], [dimInputGate]); + const tempHI = new _Tensor.default([], [dimInputGate]); + const currentForgetGateState = new _Tensor.default([], [dimForgetGate]); + const tempXF = new _Tensor.default([], [dimForgetGate]); + const tempHF = new _Tensor.default([], [dimForgetGate]); + const currentOutputGateState = new _Tensor.default([], [dimOutputGate]); + const tempXO = new _Tensor.default([], [dimOutputGate]); + const tempHO = new _Tensor.default([], [dimOutputGate]); + const currentCandidate = new _Tensor.default([], [dimCandidate]); + const tempXC = new _Tensor.default([], [dimCandidate]); + const tempHC = new _Tensor.default([], [dimCandidate]); + const previousCandidate = this.stateful && this.previousCandidate ? this.previousCandidate : new _Tensor.default([], [dimCandidate]); + const currentHiddenState = this.stateful && this.currentHiddenState ? this.currentHiddenState : new _Tensor.default([], [dimCandidate]); + const previousHiddenState = new _Tensor.default([], [dimCandidate]); + this.hiddenStateSequence = new _Tensor.default([], [x.tensor.shape[0], dimCandidate]); + const currentX = new _Tensor.default([], [x.tensor.shape[1]]); + + const _step = () => { + _ndarrayOps.default.assign(previousHiddenState.tensor, currentHiddenState.tensor); + + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_i'].tensor.transpose(1, 0), currentX.tensor, 1, tempXI.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_i'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHI.tensor); + + this._combine(currentInputGateState.tensor, tempXI.tensor, tempHI.tensor, this.weights['b_i'].tensor); + + this.recurrentActivationFunc(currentInputGateState); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_f'].tensor.transpose(1, 0), currentX.tensor, 1, tempXF.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_f'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHF.tensor); + + this._combine(currentForgetGateState.tensor, tempXF.tensor, tempHF.tensor, this.weights['b_f'].tensor); + + this.recurrentActivationFunc(currentForgetGateState); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_o'].tensor.transpose(1, 0), currentX.tensor, 1, tempXO.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_o'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHO.tensor); + + this._combine(currentOutputGateState.tensor, tempXO.tensor, tempHO.tensor, this.weights['b_o'].tensor); + + this.recurrentActivationFunc(currentOutputGateState); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['W_c'].tensor.transpose(1, 0), currentX.tensor, 1, tempXC.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['U_c'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHC.tensor); + + this._combine(currentCandidate.tensor, tempXC.tensor, tempHC.tensor, this.weights['b_c'].tensor); + + this.activationFunc(currentCandidate); + + this._update(currentCandidate.tensor, previousCandidate.tensor, currentInputGateState.tensor, currentForgetGateState.tensor); + + _ndarrayOps.default.assign(previousCandidate.tensor, currentCandidate.tensor); + + this.activationFunc(currentCandidate); + + _ndarrayOps.default.mul(currentHiddenState.tensor, currentOutputGateState.tensor, currentCandidate.tensor); + }; + + for (let i = 0, len = x.tensor.shape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _ndarrayOps.default.assign(currentX.tensor, x.tensor.pick(inputIndex, null)); + + const tempTensors = [tempXI, tempHI, tempXF, tempHF, tempXO, tempHO, tempXC, tempHC]; + tempTensors.forEach(temp => _ndarrayOps.default.assigns(temp.tensor, 0)); + + _step(); + + _ndarrayOps.default.assign(this.hiddenStateSequence.tensor.pick(i, null), currentHiddenState.tensor); + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = currentHiddenState; + } + + if (this.stateful) { + this.previousCandidate = previousCandidate; + this.currentHiddenState = currentHiddenState; + } + } + + _stepGPU() { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.previousHiddenState, + inputs: [{ + input: this.currentHiddenState, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXI, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_i'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHI, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_i'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentInputGateStatePreactiv, + inputs: [{ + input: this.tempXI, + name: 't1' + }, { + input: this.tempHI, + name: 't2' + }, { + input: this.weights['b_i'], + name: 'bias' + }] + }); + + if (this.recurrentActivation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.recurrentActivationProgram, + output: this.currentInputGateState, + inputs: [{ + input: this.currentInputGateStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentInputGateState = this.currentInputGateStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXF, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_f'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHF, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_f'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentForgetGateStatePreactiv, + inputs: [{ + input: this.tempXF, + name: 't1' + }, { + input: this.tempHF, + name: 't2' + }, { + input: this.weights['b_f'], + name: 'bias' + }] + }); + + if (this.recurrentActivation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.recurrentActivationProgram, + output: this.currentForgetGateState, + inputs: [{ + input: this.currentForgetGateStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentForgetGateState = this.currentForgetGateStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXO, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_o'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHO, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_o'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentOutputGateStatePreactiv, + inputs: [{ + input: this.tempXO, + name: 't1' + }, { + input: this.tempHO, + name: 't2' + }, { + input: this.weights['b_o'], + name: 'bias' + }] + }); + + if (this.recurrentActivation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.recurrentActivationProgram, + output: this.currentOutputGateState, + inputs: [{ + input: this.currentOutputGateStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentOutputGateState = this.currentOutputGateStatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXC, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['W_c'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHC, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['U_c'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentCandidatePreactiv, + inputs: [{ + input: this.tempXC, + name: 't1' + }, { + input: this.tempHC, + name: 't2' + }, { + input: this.weights['b_c'], + name: 'bias' + }] + }); + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.currentCandidate, + inputs: [{ + input: this.currentCandidatePreactiv, + name: 'x' + }] + }); + } else { + this.currentCandidate = this.currentCandidatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.currentCandidateCopy, + inputs: [{ + input: this.currentCandidate, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.updateProgram, + output: this.currentCandidate, + inputs: [{ + input: this.currentCandidateCopy, + name: 'c' + }, { + input: this.previousCandidate, + name: 'ctm1' + }, { + input: this.currentInputGateState, + name: 'i' + }, { + input: this.currentForgetGateState, + name: 'f' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.previousCandidate, + inputs: [{ + input: this.currentCandidate, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.currentCandidatePreactiv, + inputs: [{ + input: this.currentCandidate, + name: 'source' + }] + }); + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.currentCandidate, + inputs: [{ + input: this.currentCandidatePreactiv, + name: 'x' + }] + }); + } else { + this.currentCandidate = this.currentCandidatePreactiv; + } + + _WebGL.webgl2.runProgram({ + program: this.gateProductProgram, + output: this.currentHiddenState, + inputs: [{ + input: this.currentOutputGateState, + name: 't1' + }, { + input: this.currentCandidate, + name: 't2' + }] + }); + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const dimInputGate = this.weights['b_i'].glTextureShape[1]; + const dimCandidate = this.weights['b_c'].glTextureShape[1]; + const dimForgetGate = this.weights['b_f'].glTextureShape[1]; + const dimOutputGate = this.weights['b_o'].glTextureShape[1]; + + if (!this.currentInputGateState) { + this.currentInputGateState = new _Tensor.default([], [dimInputGate]); + this.currentInputGateState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentInputGateStatePreactiv) { + this.currentInputGateStatePreactiv = new _Tensor.default([], [dimInputGate]); + this.currentInputGateStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXI) { + this.tempXI = new _Tensor.default([], [dimInputGate]); + this.tempXI.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHI) { + this.tempHI = new _Tensor.default([], [dimInputGate]); + this.tempHI.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentForgetGateState) { + this.currentForgetGateState = new _Tensor.default([], [dimForgetGate]); + this.currentForgetGateState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentForgetGateStatePreactiv) { + this.currentForgetGateStatePreactiv = new _Tensor.default([], [dimForgetGate]); + this.currentForgetGateStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXF) { + this.tempXF = new _Tensor.default([], [dimForgetGate]); + this.tempXF.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHF) { + this.tempHF = new _Tensor.default([], [dimForgetGate]); + this.tempHF.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentOutputGateState) { + this.currentOutputGateState = new _Tensor.default([], [dimOutputGate]); + this.currentOutputGateState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentOutputGateStatePreactiv) { + this.currentOutputGateStatePreactiv = new _Tensor.default([], [dimOutputGate]); + this.currentOutputGateStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXO) { + this.tempXO = new _Tensor.default([], [dimOutputGate]); + this.tempXO.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHO) { + this.tempHO = new _Tensor.default([], [dimOutputGate]); + this.tempHO.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentCandidate) { + this.currentCandidate = new _Tensor.default([], [dimCandidate]); + this.currentCandidate.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentCandidateCopy) { + this.currentCandidateCopy = new _Tensor.default([], [dimCandidate]); + this.currentCandidateCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentCandidatePreactiv) { + this.currentCandidatePreactiv = new _Tensor.default([], [dimCandidate]); + this.currentCandidatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXC) { + this.tempXC = new _Tensor.default([], [dimCandidate]); + this.tempXC.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHC) { + this.tempHC = new _Tensor.default([], [dimCandidate]); + this.tempHC.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.previousCandidate || !this.stateful) { + this.previousCandidate = new _Tensor.default([], [dimCandidate]); + this.previousCandidate.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentHiddenState || !this.stateful) { + this.currentHiddenState = new _Tensor.default([], [dimCandidate]); + this.currentHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.previousHiddenState) { + this.previousHiddenState = new _Tensor.default([], [dimCandidate]); + this.previousHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequence) { + this.hiddenStateSequence = new _Tensor.default([], [x.glTextureShape[0], dimCandidate]); + this.hiddenStateSequence.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequenceCopy) { + this.hiddenStateSequenceCopy = new _Tensor.default([], [x.glTextureShape[0], dimCandidate]); + this.hiddenStateSequenceCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentX) { + this.currentX = new _Tensor.default([], [x.glTextureShape[1]]); + this.currentX.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + for (let i = 0, len = x.glTextureShape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _WebGL.webgl2.runProgram({ + program: this.timestepReadProgram, + output: this.currentX, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: inputIndex, + type: 'int', + name: 'index' + }] + }); + + this._stepGPU(); + + if (this.returnSequences) { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.hiddenStateSequenceCopy, + inputs: [{ + input: this.hiddenStateSequence, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.timestepWriteProgram, + output: this.hiddenStateSequence, + inputs: [{ + input: this.currentHiddenState, + name: 'x' + }, { + input: this.hiddenStateSequenceCopy, + name: 'y' + }], + uniforms: [{ + value: i, + type: 'int', + name: 'index' + }] + }); + } + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = this.currentHiddenState; + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = LSTM; \ No newline at end of file diff --git a/lib/layers/recurrent/SimpleRNN.js b/lib/layers/recurrent/SimpleRNN.js new file mode 100644 index 0000000000..d8f3060b6e --- /dev/null +++ b/lib/layers/recurrent/SimpleRNN.js @@ -0,0 +1,355 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var activations = _interopRequireWildcard(require("../../activations")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayBlasLevel = require("ndarray-blas-level2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _cwise = _interopRequireDefault(require("cwise")); + +var activationProgramSources = _interopRequireWildcard(require("../../activations/programSources")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +const copyTextureProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D source;\r\nout vec4 outColor;\r\n\r\nvoid main(void) {\r\n outColor = texture(source, vec2(outTex.x, outTex.y));\r\n}\r\n"; +const matMulProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D A;\r\nuniform sampler2D B;\r\nuniform sampler2D C;\r\nuniform bool addC;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 A_size = textureSize(A, 0);\r\n ivec2 B_size = textureSize(B, 0);\r\n int out_x = int(float(B_size[0]) * outTex.x);\r\n int out_y = int(float(A_size[1]) * outTex.y);\r\n int commonDim = A_size[0];\r\n\r\n float sum = 0.;\r\n for (int i = 0; i < commonDim; ++i) {\r\n float a = texelFetch(A, ivec2(i, out_y), 0).r;\r\n float b = texelFetch(B, ivec2(out_x, i), 0).r;\r\n sum += a * b;\r\n }\r\n\r\n if (addC) {\r\n sum += texelFetch(C, ivec2(out_x, 0), 0).r;\r\n }\r\n\r\n outColor = vec4(sum);\r\n}\r\n"; +const gateSummationProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D t1;\r\nuniform sampler2D t2;\r\nuniform sampler2D bias;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(bias, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float t1_val = texelFetch(t1, ivec2(out_x, out_y), 0).r;\r\n float t2_val = texelFetch(t2, ivec2(out_x, out_y), 0).r;\r\n float bias_val = texelFetch(bias, ivec2(out_x, out_y), 0).r;\r\n\r\n outColor = vec4(t1_val + t2_val + bias_val);\r\n}\r\n"; +const timestepReadProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n\r\n outColor = vec4(texelFetch(x, ivec2(out_x, index), 0).r);\r\n}\r\n"; +const timestepWriteProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform sampler2D y;\r\nuniform int index;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(y, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (out_y == index) {\r\n outColor = vec4(texelFetch(x, ivec2(out_x, 0), 0).r);\r\n } else {\r\n outColor = vec4(texelFetch(y, ivec2(out_x, out_y), 0).r);\r\n }\r\n}\r\n"; + +class SimpleRNN extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + Object.defineProperty(this, "_combine", { + configurable: true, + enumerable: true, + writable: true, + value: (0, _cwise.default)({ + args: ['array', 'array', 'array', 'array'], + body: function (_y, _x1, _x2, _b) { + _y = _x1 + _x2 + _b; + } + }) + }); + this.layerClass = 'SimpleRNN'; + const { + units = 1, + activation = 'tanh', + use_bias = true, + return_sequences = false, + go_backwards = false, + stateful = false + } = attrs; + this.units = units; + this.activation = activation; + this.activationFunc = activations[activation]; + this.use_bias = use_bias; + this.returnSequences = return_sequences; + this.goBackwards = go_backwards; + this.stateful = stateful; + this.params = this.use_bias ? ['kernel', 'recurrent_kernel', 'bias'] : ['kernel', 'recurrent_kernel']; + + if (this.gpu) { + this.copyTextureProgram = _WebGL.webgl2.compileProgram(copyTextureProgramSource); + this.matMulProgram = _WebGL.webgl2.compileProgram(matMulProgramSource); + this.activationProgram = _WebGL.webgl2.compileProgram(activationProgramSources[this.activation]); + this.gateSummationProgram = _WebGL.webgl2.compileProgram(gateSummationProgramSource); + this.timestepReadProgram = _WebGL.webgl2.compileProgram(timestepReadProgramSource); + this.timestepWriteProgram = _WebGL.webgl2.compileProgram(timestepWriteProgramSource); + } + } + + setWeights(weightsArr) { + super.setWeights(weightsArr); + + if (!this.use_bias) { + this.weights['bias'] = new _Tensor.default([], [this.units]); + + if (this.gpu) { + this.weights['bias'].createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const dimHiddenState = this.units; + const currentHiddenState = this.stateful && this.currentHiddenState ? this.currentHiddenState : new _Tensor.default([], [dimHiddenState]); + const tempXH = new _Tensor.default([], [dimHiddenState]); + const tempHH = new _Tensor.default([], [dimHiddenState]); + const previousHiddenState = new _Tensor.default([], [dimHiddenState]); + this.hiddenStateSequence = new _Tensor.default([], [x.tensor.shape[0], dimHiddenState]); + const currentX = new _Tensor.default([], [x.tensor.shape[1]]); + + const _step = () => { + _ndarrayOps.default.assign(previousHiddenState.tensor, currentHiddenState.tensor); + + (0, _ndarrayBlasLevel.gemv)(1, this.weights['kernel'].tensor.transpose(1, 0), currentX.tensor, 1, tempXH.tensor); + (0, _ndarrayBlasLevel.gemv)(1, this.weights['recurrent_kernel'].tensor.transpose(1, 0), previousHiddenState.tensor, 1, tempHH.tensor); + + this._combine(currentHiddenState.tensor, tempXH.tensor, tempHH.tensor, this.weights['bias'].tensor); + + this.activationFunc(currentHiddenState); + }; + + for (let i = 0, len = x.tensor.shape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _ndarrayOps.default.assign(currentX.tensor, x.tensor.pick(inputIndex, null)); + + const tempTensors = [tempXH, tempHH]; + tempTensors.forEach(temp => _ndarrayOps.default.assigns(temp.tensor, 0)); + + _step(); + + if (this.returnSequences) { + _ndarrayOps.default.assign(this.hiddenStateSequence.tensor.pick(i, null), currentHiddenState.tensor); + } + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = currentHiddenState; + } + + if (this.stateful) { + this.currentHiddenState = currentHiddenState; + } + } + + _stepGPU() { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.previousHiddenState, + inputs: [{ + input: this.currentHiddenState, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempXH, + inputs: [{ + input: this.currentX, + name: 'A' + }, { + input: this.weights['kernel'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.matMulProgram, + output: this.tempHH, + inputs: [{ + input: this.previousHiddenState, + name: 'A' + }, { + input: this.weights['recurrent_kernel'], + name: 'B' + }], + uniforms: [{ + value: 0, + type: 'bool', + name: 'addC' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.gateSummationProgram, + output: this.currentHiddenStatePreactiv, + inputs: [{ + input: this.tempXH, + name: 't1' + }, { + input: this.tempHH, + name: 't2' + }, { + input: this.weights['bias'], + name: 'bias' + }] + }); + + if (this.activation !== 'linear') { + _WebGL.webgl2.runProgram({ + program: this.activationProgram, + output: this.currentHiddenState, + inputs: [{ + input: this.currentHiddenStatePreactiv, + name: 'x' + }] + }); + } else { + this.currentHiddenState = this.currentHiddenStatePreactiv; + } + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const dimHiddenState = this.units; + + if (!this.currentHiddenState || !this.stateful) { + this.currentHiddenState = new _Tensor.default([], [dimHiddenState]); + this.currentHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentHiddenStatePreactiv) { + this.currentHiddenStatePreactiv = new _Tensor.default([], [dimHiddenState]); + this.currentHiddenStatePreactiv.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempXH) { + this.tempXH = new _Tensor.default([], [dimHiddenState]); + this.tempXH.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.tempHH) { + this.tempHH = new _Tensor.default([], [dimHiddenState]); + this.tempHH.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.previousHiddenState) { + this.previousHiddenState = new _Tensor.default([], [dimHiddenState]); + this.previousHiddenState.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequence) { + this.hiddenStateSequence = new _Tensor.default([], [x.glTextureShape[0], dimHiddenState]); + this.hiddenStateSequence.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.hiddenStateSequenceCopy) { + this.hiddenStateSequenceCopy = new _Tensor.default([], [x.glTextureShape[0], dimHiddenState]); + this.hiddenStateSequenceCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.currentX) { + this.currentX = new _Tensor.default([], [x.glTextureShape[1]]); + this.currentX.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + for (let i = 0, len = x.glTextureShape[0]; i < len; i++) { + const inputIndex = this.goBackwards ? len - i - 1 : i; + + _WebGL.webgl2.runProgram({ + program: this.timestepReadProgram, + output: this.currentX, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: inputIndex, + type: 'int', + name: 'index' + }] + }); + + this._stepGPU(); + + if (this.returnSequences) { + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.hiddenStateSequenceCopy, + inputs: [{ + input: this.hiddenStateSequence, + name: 'source' + }] + }); + + _WebGL.webgl2.runProgram({ + program: this.timestepWriteProgram, + output: this.hiddenStateSequence, + inputs: [{ + input: this.currentHiddenState, + name: 'x' + }, { + input: this.hiddenStateSequenceCopy, + name: 'y' + }], + uniforms: [{ + value: i, + type: 'int', + name: 'index' + }] + }); + } + } + + if (this.returnSequences) { + this.output = this.hiddenStateSequence; + } else { + this.output = this.currentHiddenState; + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = SimpleRNN; \ No newline at end of file diff --git a/lib/layers/recurrent/index.js b/lib/layers/recurrent/index.js new file mode 100644 index 0000000000..d5f72ef7fb --- /dev/null +++ b/lib/layers/recurrent/index.js @@ -0,0 +1,31 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "SimpleRNN", { + enumerable: true, + get: function () { + return _SimpleRNN.default; + } +}); +Object.defineProperty(exports, "LSTM", { + enumerable: true, + get: function () { + return _LSTM.default; + } +}); +Object.defineProperty(exports, "GRU", { + enumerable: true, + get: function () { + return _GRU.default; + } +}); + +var _SimpleRNN = _interopRequireDefault(require("./SimpleRNN")); + +var _LSTM = _interopRequireDefault(require("./LSTM")); + +var _GRU = _interopRequireDefault(require("./GRU")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/layers/wrappers/Bidirectional.js b/lib/layers/wrappers/Bidirectional.js new file mode 100644 index 0000000000..736ca2e452 --- /dev/null +++ b/lib/layers/wrappers/Bidirectional.js @@ -0,0 +1,210 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var recurrentLayers = _interopRequireWildcard(require("../recurrent")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const copyTextureProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D source;\r\nout vec4 outColor;\r\n\r\nvoid main(void) {\r\n outColor = texture(source, vec2(outTex.x, outTex.y));\r\n}\r\n"; +const concatMergeProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D forward;\r\nuniform sampler2D backward;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(forward, 0);\r\n int out_x = int(float(size[0] * 2) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n if (out_x >= 0 && out_x < size[0]) {\r\n outColor = vec4(texelFetch(forward, ivec2(out_x, out_y), 0).r);\r\n } else {\r\n outColor = vec4(texelFetch(backward, ivec2(out_x - size[0], size[1] - out_y - 1), 0).r);\r\n }\r\n}\r\n"; +const sumMergeProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D forward;\r\nuniform sampler2D backward;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(forward, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float forward_val = texelFetch(forward, ivec2(out_x, out_y), 0).r;\r\n float backward_val = texelFetch(backward, ivec2(out_x, size[1] - out_y - 1), 0).r;\r\n\r\n outColor = vec4(forward_val + backward_val);\r\n}\r\n"; +const mulMergeProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D forward;\r\nuniform sampler2D backward;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(forward, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float forward_val = texelFetch(forward, ivec2(out_x, out_y), 0).r;\r\n float backward_val = texelFetch(backward, ivec2(out_x, size[1] - out_y - 1), 0).r;\r\n\r\n outColor = vec4(forward_val * backward_val);\r\n}\r\n"; +const aveMergeProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D forward;\r\nuniform sampler2D backward;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(forward, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n float forward_val = texelFetch(forward, ivec2(out_x, out_y), 0).r;\r\n float backward_val = texelFetch(backward, ivec2(out_x, size[1] - out_y - 1), 0).r;\r\n\r\n outColor = vec4(0.5 * (forward_val + backward_val));\r\n}\r\n"; + +class Bidirectional extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'Bidirectional'; + const { + layer, + merge_mode = 'concat' + } = attrs; + + if (!layer) { + this.throwError('wrapped layer is undefined.'); + } + + if (!['SimpleRNN', 'GRU', 'LSTM'].includes(layer.class_name)) { + this.throwError(`cannot wrap ${layer.class_name} layer.`); + } + + if (!['concat', 'sum', 'mul', 'ave'].includes(merge_mode)) { + this.throwError(`merge_mode ${merge_mode} not supported.`); + } + + const forwardLayerAttrs = Object.assign({}, layer.config, { + gpu: attrs.gpu + }); + const backwardLayerAttrs = Object.assign({}, layer.config, { + gpu: attrs.gpu + }); + backwardLayerAttrs.go_backwards = !backwardLayerAttrs.go_backwards; + this.forwardLayer = new recurrentLayers[layer.class_name](forwardLayerAttrs); + this.backwardLayer = new recurrentLayers[layer.class_name](backwardLayerAttrs); + this.forwardLayer.outbound = [null]; + this.backwardLayer.outbound = [null]; + this.mergeMode = merge_mode; + this.returnSequences = layer.config.return_sequences; + + if (this.gpu) { + this.copyTextureProgram = _WebGL.webgl2.compileProgram(copyTextureProgramSource); + + if (this.mergeMode === 'concat') { + this.mergeProgram = _WebGL.webgl2.compileProgram(concatMergeProgramSource); + } else if (this.mergeMode === 'sum') { + this.mergeProgram = _WebGL.webgl2.compileProgram(sumMergeProgramSource); + } else if (this.mergeMode === 'mul') { + this.mergeProgram = _WebGL.webgl2.compileProgram(mulMergeProgramSource); + } else if (this.mergeMode === 'ave') { + this.mergeProgram = _WebGL.webgl2.compileProgram(aveMergeProgramSource); + } + } + } + + setWeights(weightsArr) { + this.forwardLayer.setWeights(weightsArr.slice(0, weightsArr.length / 2)); + this.backwardLayer.setWeights(weightsArr.slice(weightsArr.length / 2)); + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + this.forwardLayer._callCPU(new _Tensor.default(x.tensor.data, x.tensor.shape)); + + this.backwardLayer._callCPU(new _Tensor.default(x.tensor.data, x.tensor.shape)); + + const forwardOutput = this.forwardLayer.output; + const backwardOutput = this.backwardLayer.output; + + if (this.returnSequences) { + backwardOutput.tensor = backwardOutput.tensor.step(-1); + } + + const outShape = forwardOutput.tensor.shape.slice(); + + if (this.mergeMode === 'concat') { + outShape[outShape.length - 1] += backwardOutput.tensor.shape[outShape.length - 1]; + } + + this.output = new _Tensor.default([], outShape); + + if (this.mergeMode === 'concat') { + if (this.returnSequences) { + _ndarrayOps.default.assign(this.output.tensor.hi(outShape[0], forwardOutput.tensor.shape[1]).lo(0, 0), forwardOutput.tensor); + + _ndarrayOps.default.assign(this.output.tensor.hi(outShape[0], outShape[1]).lo(0, forwardOutput.tensor.shape[1]), backwardOutput.tensor); + } else { + _ndarrayOps.default.assign(this.output.tensor.hi(forwardOutput.tensor.shape[0]).lo(0), forwardOutput.tensor); + + _ndarrayOps.default.assign(this.output.tensor.hi(outShape[0]).lo(forwardOutput.tensor.shape[0]), backwardOutput.tensor); + } + } else if (this.mergeMode === 'sum') { + _ndarrayOps.default.addeq(this.output.tensor, forwardOutput.tensor); + + _ndarrayOps.default.addeq(this.output.tensor, backwardOutput.tensor); + } else if (this.mergeMode === 'mul') { + _ndarrayOps.default.assigns(this.output.tensor, 1); + + _ndarrayOps.default.muleq(this.output.tensor, forwardOutput.tensor); + + _ndarrayOps.default.muleq(this.output.tensor, backwardOutput.tensor); + } else if (this.mergeMode === 'ave') { + _ndarrayOps.default.addeq(this.output.tensor, forwardOutput.tensor); + + _ndarrayOps.default.addeq(this.output.tensor, backwardOutput.tensor); + + _ndarrayOps.default.divseq(this.output.tensor, 2); + } + } + + _callGPU(x) { + if (!x.glTexture) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + if (!this.inputCopy) { + this.inputCopy = new _Tensor.default([], x.glTextureShape); + this.inputCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.inputCopy, + inputs: [{ + input: x, + name: 'source' + }] + }); + + this.forwardLayer._callGPU(x); + + this.backwardLayer._callGPU(this.inputCopy); + + const forwardOutput = this.forwardLayer.output; + const backwardOutput = this.backwardLayer.output; + const outShape = forwardOutput.glTextureShape.slice(); + + if (this.mergeMode === 'concat') { + outShape[1] += backwardOutput.glTextureShape[1]; + } + + if (!this.output) { + this.output = new _Tensor.default([], outShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + + if (!this.returnSequences) { + this.output.is1D = true; + } + } + + _WebGL.webgl2.runProgram({ + program: this.mergeProgram, + output: this.output, + inputs: [{ + input: forwardOutput, + name: 'forward' + }, { + input: backwardOutput, + name: 'backward' + }] + }); + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + } + } + +} + +exports.default = Bidirectional; \ No newline at end of file diff --git a/lib/layers/wrappers/TimeDistributed.js b/lib/layers/wrappers/TimeDistributed.js new file mode 100644 index 0000000000..842ffa9993 --- /dev/null +++ b/lib/layers/wrappers/TimeDistributed.js @@ -0,0 +1,409 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Layer = _interopRequireDefault(require("../../Layer")); + +var _Tensor = _interopRequireDefault(require("../../Tensor")); + +var _WebGL = require("../../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var layers = _interopRequireWildcard(require("../")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const copyTextureProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D source;\r\nout vec4 outColor;\r\n\r\nvoid main(void) {\r\n outColor = texture(source, vec2(outTex.x, outTex.y));\r\n}\r\n"; +const mapInputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform isampler2D indexMap;\r\nuniform int inputCols;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(indexMap, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(inputCols)));\r\n int colIndex = int(mod(float(index), float(inputCols)));\r\n float val = texelFetch(x, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = vec4(0.0);\r\n }\r\n}\r\n"; +const selectSliceProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D x;\r\nuniform int t;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(x, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n\r\n outColor = vec4(texelFetch(x, ivec2(out_x, t), 0).r);\r\n}\r\n"; +const copySliceOutputProgramSource = "#version 300 es\r\nprecision highp float;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D outputCopy;\r\nuniform sampler2D sliceOutput;\r\nuniform int t;\r\nuniform int timesteps;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(sliceOutput, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(timesteps) * outTex.y);\r\n\r\n if (t == out_y) {\r\n outColor = vec4(texelFetch(sliceOutput, ivec2(out_x, 0), 0).r);\r\n } else {\r\n outColor = texelFetch(outputCopy, ivec2(out_x, out_y), 0);\r\n }\r\n}\r\n"; +const mapSliceOutputProgramSource = "#version 300 es\r\nprecision highp float;\r\nprecision highp isampler2D;\r\n\r\nin vec2 outTex;\r\nuniform sampler2D outputCopy;\r\nuniform sampler2D sliceOutput;\r\nuniform isampler2D indexMap;\r\nout vec4 outColor;\r\n\r\nvoid main() {\r\n ivec2 size = textureSize(outputCopy, 0);\r\n int out_x = int(float(size[0]) * outTex.x);\r\n int out_y = int(float(size[1]) * outTex.y);\r\n\r\n int index = texelFetch(indexMap, ivec2(out_x, out_y), 0).r;\r\n\r\n if (index != -1) {\r\n int rowIndex = int(floor(float(index) / float(textureSize(sliceOutput, 0)[0])));\r\n int colIndex = int(mod(float(index), float(textureSize(sliceOutput, 0)[0])));\r\n float val = texelFetch(sliceOutput, ivec2(colIndex, rowIndex), 0).r;\r\n outColor = vec4(val);\r\n } else {\r\n outColor = texelFetch(outputCopy, ivec2(out_x, out_y), 0);\r\n }\r\n}\r\n"; + +class TimeDistributed extends _Layer.default { + constructor(attrs = {}) { + super(attrs); + this.layerClass = 'TimeDistributed'; + const { + layer + } = attrs; + + if (!layer) { + this.throwError('wrapped layer is undefined.'); + } + + const wrappedLayerAttrs = Object.assign({}, layer.config, { + gpu: attrs.gpu + }); + this.wrappedLayer = new layers[layer.class_name](wrappedLayerAttrs); + this.wrappedLayer.outbound = [null]; + + if (this.gpu) { + this.copyTextureProgram = _WebGL.webgl2.compileProgram(copyTextureProgramSource); + this.mapInputProgram = _WebGL.webgl2.compileProgram(mapInputProgramSource); + this.selectSliceProgram = _WebGL.webgl2.compileProgram(selectSliceProgramSource); + this.copySliceOutputProgram = _WebGL.webgl2.compileProgram(copySliceOutputProgramSource); + this.mapSliceOutputProgram = _WebGL.webgl2.compileProgram(mapSliceOutputProgramSource); + } + } + + setWeights(weightsArr) { + this.wrappedLayer.setWeights(weightsArr); + } + + call(x) { + if (this.gpu) { + this._callGPU(x); + } else { + this._callCPU(x); + } + + return this.output; + } + + _callCPU(x) { + const stepShape = [...x.tensor.shape.slice(1)]; + const step = new _Tensor.default([], stepShape); + + _ndarrayOps.default.assign(step.tensor, x.tensor.pick(0, ...Array(stepShape.length).fill(null))); + + let stepOutput = this.wrappedLayer.call(step); + const stepOutputShape = stepOutput.tensor.shape.slice(); + this.output = new _Tensor.default([], [x.tensor.shape[0], ...stepOutputShape]); + + _ndarrayOps.default.assign(this.output.tensor.pick(0, ...Array(stepOutputShape.length).fill(null)), stepOutput.tensor); + + for (let i = 1, timesteps = x.tensor.shape[0]; i < timesteps; i++) { + _ndarrayOps.default.assign(step.tensor, x.tensor.pick(i, ...Array(stepShape.length).fill(null))); + + stepOutput = this.wrappedLayer.call(step); + + _ndarrayOps.default.assign(this.output.tensor.pick(i, ...Array(stepOutputShape.length).fill(null)), stepOutput.tensor); + } + } + + _createIndexMap(indicesForReshaped) { + if (this.indexMaps) { + return; + } + + const indices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.indexMaps = []; + const timesteps = this.inputShape[0]; + const sliceShape = this.inputShape.slice(1); + + for (let t = 0; t < timesteps; t++) { + const sliceIndices = new _Tensor.default([], sliceShape, { + type: Int32Array + }); + + _ndarrayOps.default.assign(sliceIndices.tensor, indices.tensor.pick(t, ...Array(sliceShape.length).fill(null))); + + sliceIndices.reshapeTo2DSquare(); + sliceIndices.createGLTexture({ + type: '2d', + format: 'int' + }); + this.indexMaps.push(sliceIndices); + } + } + + _createOutputIndexMap(indicesForReshaped) { + if (this.outputIndexMaps) { + return; + } + + const outputSliceIndices = new _Tensor.default(indicesForReshaped.data, indicesForReshaped.shape, { + type: Int32Array + }); + this.outputIndexMaps = []; + const timesteps = this.outputShape[0]; + const sliceShape = this.outputShape.slice(1); + + for (let t = 0; t < timesteps; t++) { + const outputIndices = new _Tensor.default([], this.outputShape, { + type: Int32Array + }); + + _ndarrayOps.default.assigns(outputIndices.tensor, -1); + + _ndarrayOps.default.assign(outputIndices.tensor.pick(t, ...Array(sliceShape.length).fill(null)), outputSliceIndices.tensor); + + outputIndices.reshapeTo2DSquare(); + outputIndices.createGLTexture({ + type: '2d', + format: 'int' + }); + this.outputIndexMaps.push(outputIndices); + } + } + + _callGPU(x) { + if (x.is2DReshaped || x.is2DSquareReshaped) { + this.inputShape = x.originalShape; + } else { + this.inputShape = x.tensor.shape; + } + + if (!x.glTexture) { + if (x.tensor.shape.length <= 2) { + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } else if (x.tensor.shape.length > 2 && !x.is2DReshaped) { + x.reshapeTo2DSquare(); + x.createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + + if (this.inputShape.length > 2) { + this._createIndexMap(x.indicesForReshaped); + } + + const timesteps = this.inputShape[0]; + const sliceShape = this.inputShape.slice(1); + + if (!this.slice) { + this.slice = new _Tensor.default([], sliceShape); + + if (sliceShape.length <= 2) { + this.slice.createGLTexture({ + type: '2d', + format: 'float' + }); + } else { + this.slice.reshapeTo2DSquare(); + this.slice.createGLTexture({ + type: '2d', + format: 'float' + }); + } + } + + if (this.inputShape.length <= 2) { + _WebGL.webgl2.runProgram({ + program: this.selectSliceProgram, + output: this.slice, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: 0, + type: 'int', + name: 't' + }] + }); + } else { + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.slice, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMaps[0], + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + } + + this.wrappedLayer._callGPU(this.slice); + + this.sliceOutput = this.wrappedLayer.output; + + if (!this.output) { + if (this.inputShape.length <= 2) { + this.outputShape = [timesteps, this.sliceOutput.glTextureShape[1]]; + this.output = new _Tensor.default([], this.outputShape); + this.outputCopy = new _Tensor.default([], this.outputShape); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + this.outputCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + } else { + this.outputShape = [timesteps, ...this.sliceOutput.originalShape]; + this.output = new _Tensor.default([], this.outputShape); + this.outputCopy = new _Tensor.default([], this.outputShape); + this.output.reshapeTo2DSquare(); + this.outputCopy.reshapeTo2DSquare(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + this.outputCopy.createGLTexture({ + type: '2d', + format: 'float' + }); + + this._createOutputIndexMap(this.sliceOutput.indicesForReshaped); + } + } + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.outputCopy, + inputs: [{ + input: this.output, + name: 'source' + }] + }); + + if (this.inputShape.length <= 2) { + _WebGL.webgl2.runProgram({ + program: this.copySliceOutputProgram, + output: this.output, + inputs: [{ + input: this.outputCopy, + name: 'outputCopy' + }, { + input: this.sliceOutput, + name: 'sliceOutput' + }], + uniforms: [{ + value: 0, + type: 'int', + name: 't' + }, { + value: timesteps, + type: 'int', + name: 'timesteps' + }] + }); + } else { + _WebGL.webgl2.runProgram({ + program: this.mapSliceOutputProgram, + output: this.output, + inputs: [{ + input: this.outputCopy, + name: 'outputCopy' + }, { + input: this.sliceOutput, + name: 'sliceOutput' + }, { + input: this.outputIndexMaps[0], + name: 'indexMap' + }] + }); + } + + for (let i = 1; i < timesteps; i++) { + if (this.inputShape.length <= 2) { + _WebGL.webgl2.runProgram({ + program: this.selectSliceProgram, + output: this.slice, + inputs: [{ + input: x, + name: 'x' + }], + uniforms: [{ + value: i, + type: 'int', + name: 't' + }] + }); + } else { + _WebGL.webgl2.runProgram({ + program: this.mapInputProgram, + output: this.slice, + inputs: [{ + input: x, + name: 'x' + }, { + input: this.indexMaps[i], + name: 'indexMap' + }], + uniforms: [{ + value: x.glTextureShape[1], + type: 'int', + name: 'inputCols' + }] + }); + } + + this.wrappedLayer._callGPU(this.slice); + + this.sliceOutput = this.wrappedLayer.output; + + _WebGL.webgl2.runProgram({ + program: this.copyTextureProgram, + output: this.outputCopy, + inputs: [{ + input: this.output, + name: 'source' + }] + }); + + if (this.inputShape.length <= 2) { + _WebGL.webgl2.runProgram({ + program: this.copySliceOutputProgram, + output: this.output, + inputs: [{ + input: this.outputCopy, + name: 'outputCopy' + }, { + input: this.sliceOutput, + name: 'sliceOutput' + }], + uniforms: [{ + value: i, + type: 'int', + name: 't' + }, { + value: timesteps, + type: 'int', + name: 'timesteps' + }] + }); + } else { + _WebGL.webgl2.runProgram({ + program: this.mapSliceOutputProgram, + output: this.output, + inputs: [{ + input: this.outputCopy, + name: 'outputCopy' + }, { + input: this.sliceOutput, + name: 'sliceOutput' + }, { + input: this.outputIndexMaps[i], + name: 'indexMap' + }] + }); + } + } + + if (this.outbound.length === 0) { + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } else if (this.output.is2DSquareReshaped) { + this.output.reshapeFrom2DSquare(); + } + } + } + +} + +exports.default = TimeDistributed; \ No newline at end of file diff --git a/lib/layers/wrappers/index.js b/lib/layers/wrappers/index.js new file mode 100644 index 0000000000..48c31cf75e --- /dev/null +++ b/lib/layers/wrappers/index.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "TimeDistributed", { + enumerable: true, + get: function () { + return _TimeDistributed.default; + } +}); +Object.defineProperty(exports, "Bidirectional", { + enumerable: true, + get: function () { + return _Bidirectional.default; + } +}); + +var _TimeDistributed = _interopRequireDefault(require("./TimeDistributed")); + +var _Bidirectional = _interopRequireDefault(require("./Bidirectional")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/local-path.js b/lib/local-path.js deleted file mode 100644 index 6bcceb05b0..0000000000 --- a/lib/local-path.js +++ /dev/null @@ -1,13 +0,0 @@ -const path = require('path') - -module.exports = { - isLocalPath (templatePath) { - return /^[./]|(^[a-zA-Z]:)/.test(templatePath) - }, - - getTemplatePath (templatePath) { - return path.isAbsolute(templatePath) - ? templatePath - : path.normalize(path.join(process.cwd(), templatePath)) - } -} diff --git a/lib/logger.js b/lib/logger.js deleted file mode 100644 index 31969d4251..0000000000 --- a/lib/logger.js +++ /dev/null @@ -1,44 +0,0 @@ -const chalk = require('chalk') -const format = require('util').format - -/** - * Prefix. - */ - -const prefix = ' vue-cli' -const sep = chalk.gray('·') - -/** - * Log a `message` to the console. - * - * @param {String} message - */ - -exports.log = function (...args) { - const msg = format.apply(format, args) - console.log(chalk.white(prefix), sep, msg) -} - -/** - * Log an error `message` to the console and exit. - * - * @param {String} message - */ - -exports.fatal = function (...args) { - if (args[0] instanceof Error) args[0] = args[0].message.trim() - const msg = format.apply(format, args) - console.error(chalk.red(prefix), sep, msg) - process.exit(1) -} - -/** - * Log a success `message` to the console and exit. - * - * @param {String} message - */ - -exports.success = function (...args) { - const msg = format.apply(format, args) - console.log(chalk.white(prefix), sep, msg) -} diff --git a/lib/options.js b/lib/options.js deleted file mode 100644 index a165366740..0000000000 --- a/lib/options.js +++ /dev/null @@ -1,89 +0,0 @@ -const path = require('path') -const metadata = require('read-metadata') -const exists = require('fs').existsSync -const getGitUser = require('./git-user') -const validateName = require('validate-npm-package-name') - -/** - * Read prompts metadata. - * - * @param {String} dir - * @return {Object} - */ - -module.exports = function options (name, dir) { - const opts = getMetadata(dir) - - setDefault(opts, 'name', name) - setValidateName(opts) - - const author = getGitUser() - if (author) { - setDefault(opts, 'author', author) - } - - return opts -} - -/** - * Gets the metadata from either a meta.json or meta.js file. - * - * @param {String} dir - * @return {Object} - */ - -function getMetadata (dir) { - const json = path.join(dir, 'meta.json') - const js = path.join(dir, 'meta.js') - let opts = {} - - if (exists(json)) { - opts = metadata.sync(json) - } else if (exists(js)) { - const req = require(path.resolve(js)) - if (req !== Object(req)) { - throw new Error('meta.js needs to expose an object') - } - opts = req - } - - return opts -} - -/** - * Set the default value for a prompt question - * - * @param {Object} opts - * @param {String} key - * @param {String} val - */ - -function setDefault (opts, key, val) { - if (opts.schema) { - opts.prompts = opts.schema - delete opts.schema - } - const prompts = opts.prompts || (opts.prompts = {}) - if (!prompts[key] || typeof prompts[key] !== 'object') { - prompts[key] = { - 'type': 'string', - 'default': val - } - } else { - prompts[key]['default'] = val - } -} - -function setValidateName (opts) { - const name = opts.prompts.name - const customValidate = name.validate - name.validate = name => { - const its = validateName(name) - if (!its.validForNewPackages) { - const errors = (its.errors || []).concat(its.warnings || []) - return 'Sorry, ' + errors.join(' and ') + '.' - } - if (typeof customValidate === 'function') return customValidate(name) - return true - } -} diff --git a/lib/proto.js b/lib/proto.js new file mode 100644 index 0000000000..7ea63640c3 --- /dev/null +++ b/lib/proto.js @@ -0,0 +1,352 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Model = exports.Weights = void 0; + +var $protobuf = _interopRequireWildcard(require("protobufjs/minimal")); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +const $Reader = $protobuf.Reader, + $Writer = $protobuf.Writer, + $util = $protobuf.util; +const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); +exports.default = $root; + +const Weights = $root.Weights = (() => { + function Weights(properties) { + this.shape = []; + if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; + } + + Weights.prototype.layerName = ""; + Weights.prototype.weightName = ""; + Weights.prototype.shape = $util.emptyArray; + Weights.prototype.type = ""; + Weights.prototype.data = $util.newBuffer([]); + Weights.prototype.quantizeMin = 0; + Weights.prototype.quantizeMax = 0; + + Weights.create = function create(properties) { + return new Weights(properties); + }; + + Weights.encode = function encode(message, writer) { + if (!writer) writer = $Writer.create(); + if (message.layerName != null && message.hasOwnProperty("layerName")) writer.uint32(10).string(message.layerName); + if (message.weightName != null && message.hasOwnProperty("weightName")) writer.uint32(18).string(message.weightName); + + if (message.shape != null && message.shape.length) { + writer.uint32(26).fork(); + + for (let i = 0; i < message.shape.length; ++i) writer.uint32(message.shape[i]); + + writer.ldelim(); + } + + if (message.type != null && message.hasOwnProperty("type")) writer.uint32(34).string(message.type); + if (message.data != null && message.hasOwnProperty("data")) writer.uint32(42).bytes(message.data); + if (message.quantizeMin != null && message.hasOwnProperty("quantizeMin")) writer.uint32(53).float(message.quantizeMin); + if (message.quantizeMax != null && message.hasOwnProperty("quantizeMax")) writer.uint32(61).float(message.quantizeMax); + return writer; + }; + + Weights.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + Weights.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, + message = new $root.Weights(); + + while (reader.pos < end) { + let tag = reader.uint32(); + + switch (tag >>> 3) { + case 1: + message.layerName = reader.string(); + break; + + case 2: + message.weightName = reader.string(); + break; + + case 3: + if (!(message.shape && message.shape.length)) message.shape = []; + + if ((tag & 7) === 2) { + let end2 = reader.uint32() + reader.pos; + + while (reader.pos < end2) message.shape.push(reader.uint32()); + } else message.shape.push(reader.uint32()); + + break; + + case 4: + message.type = reader.string(); + break; + + case 5: + message.data = reader.bytes(); + break; + + case 6: + message.quantizeMin = reader.float(); + break; + + case 7: + message.quantizeMax = reader.float(); + break; + + default: + reader.skipType(tag & 7); + break; + } + } + + return message; + }; + + Weights.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + Weights.verify = function verify(message) { + if (typeof message !== "object" || message === null) return "object expected"; + if (message.layerName != null && message.hasOwnProperty("layerName")) if (!$util.isString(message.layerName)) return "layerName: string expected"; + if (message.weightName != null && message.hasOwnProperty("weightName")) if (!$util.isString(message.weightName)) return "weightName: string expected"; + + if (message.shape != null && message.hasOwnProperty("shape")) { + if (!Array.isArray(message.shape)) return "shape: array expected"; + + for (let i = 0; i < message.shape.length; ++i) if (!$util.isInteger(message.shape[i])) return "shape: integer[] expected"; + } + + if (message.type != null && message.hasOwnProperty("type")) if (!$util.isString(message.type)) return "type: string expected"; + if (message.data != null && message.hasOwnProperty("data")) if (!(message.data && typeof message.data.length === "number" || $util.isString(message.data))) return "data: buffer expected"; + if (message.quantizeMin != null && message.hasOwnProperty("quantizeMin")) if (typeof message.quantizeMin !== "number") return "quantizeMin: number expected"; + if (message.quantizeMax != null && message.hasOwnProperty("quantizeMax")) if (typeof message.quantizeMax !== "number") return "quantizeMax: number expected"; + return null; + }; + + Weights.fromObject = function fromObject(object) { + if (object instanceof $root.Weights) return object; + let message = new $root.Weights(); + if (object.layerName != null) message.layerName = String(object.layerName); + if (object.weightName != null) message.weightName = String(object.weightName); + + if (object.shape) { + if (!Array.isArray(object.shape)) throw TypeError(".Weights.shape: array expected"); + message.shape = []; + + for (let i = 0; i < object.shape.length; ++i) message.shape[i] = object.shape[i] >>> 0; + } + + if (object.type != null) message.type = String(object.type); + if (object.data != null) if (typeof object.data === "string") $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);else if (object.data.length) message.data = object.data; + if (object.quantizeMin != null) message.quantizeMin = Number(object.quantizeMin); + if (object.quantizeMax != null) message.quantizeMax = Number(object.quantizeMax); + return message; + }; + + Weights.toObject = function toObject(message, options) { + if (!options) options = {}; + let object = {}; + if (options.arrays || options.defaults) object.shape = []; + + if (options.defaults) { + object.layerName = ""; + object.weightName = ""; + object.type = ""; + object.data = options.bytes === String ? "" : []; + object.quantizeMin = 0; + object.quantizeMax = 0; + } + + if (message.layerName != null && message.hasOwnProperty("layerName")) object.layerName = message.layerName; + if (message.weightName != null && message.hasOwnProperty("weightName")) object.weightName = message.weightName; + + if (message.shape && message.shape.length) { + object.shape = []; + + for (let j = 0; j < message.shape.length; ++j) object.shape[j] = message.shape[j]; + } + + if (message.type != null && message.hasOwnProperty("type")) object.type = message.type; + if (message.data != null && message.hasOwnProperty("data")) object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data; + if (message.quantizeMin != null && message.hasOwnProperty("quantizeMin")) object.quantizeMin = options.json && !isFinite(message.quantizeMin) ? String(message.quantizeMin) : message.quantizeMin; + if (message.quantizeMax != null && message.hasOwnProperty("quantizeMax")) object.quantizeMax = options.json && !isFinite(message.quantizeMax) ? String(message.quantizeMax) : message.quantizeMax; + return object; + }; + + Weights.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Weights; +})(); + +exports.Weights = Weights; + +const Model = $root.Model = (() => { + function Model(properties) { + this.modelWeights = []; + if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]]; + } + + Model.prototype.id = ""; + Model.prototype.name = ""; + Model.prototype.kerasVersion = ""; + Model.prototype.backend = ""; + Model.prototype.modelConfig = ""; + Model.prototype.modelWeights = $util.emptyArray; + + Model.create = function create(properties) { + return new Model(properties); + }; + + Model.encode = function encode(message, writer) { + if (!writer) writer = $Writer.create(); + if (message.id != null && message.hasOwnProperty("id")) writer.uint32(10).string(message.id); + if (message.name != null && message.hasOwnProperty("name")) writer.uint32(18).string(message.name); + if (message.kerasVersion != null && message.hasOwnProperty("kerasVersion")) writer.uint32(26).string(message.kerasVersion); + if (message.backend != null && message.hasOwnProperty("backend")) writer.uint32(34).string(message.backend); + if (message.modelConfig != null && message.hasOwnProperty("modelConfig")) writer.uint32(42).string(message.modelConfig); + if (message.modelWeights != null && message.modelWeights.length) for (let i = 0; i < message.modelWeights.length; ++i) $root.Weights.encode(message.modelWeights[i], writer.uint32(50).fork()).ldelim(); + return writer; + }; + + Model.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + Model.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, + message = new $root.Model(); + + while (reader.pos < end) { + let tag = reader.uint32(); + + switch (tag >>> 3) { + case 1: + message.id = reader.string(); + break; + + case 2: + message.name = reader.string(); + break; + + case 3: + message.kerasVersion = reader.string(); + break; + + case 4: + message.backend = reader.string(); + break; + + case 5: + message.modelConfig = reader.string(); + break; + + case 6: + if (!(message.modelWeights && message.modelWeights.length)) message.modelWeights = []; + message.modelWeights.push($root.Weights.decode(reader, reader.uint32())); + break; + + default: + reader.skipType(tag & 7); + break; + } + } + + return message; + }; + + Model.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + Model.verify = function verify(message) { + if (typeof message !== "object" || message === null) return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) if (!$util.isString(message.id)) return "id: string expected"; + if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; + if (message.kerasVersion != null && message.hasOwnProperty("kerasVersion")) if (!$util.isString(message.kerasVersion)) return "kerasVersion: string expected"; + if (message.backend != null && message.hasOwnProperty("backend")) if (!$util.isString(message.backend)) return "backend: string expected"; + if (message.modelConfig != null && message.hasOwnProperty("modelConfig")) if (!$util.isString(message.modelConfig)) return "modelConfig: string expected"; + + if (message.modelWeights != null && message.hasOwnProperty("modelWeights")) { + if (!Array.isArray(message.modelWeights)) return "modelWeights: array expected"; + + for (let i = 0; i < message.modelWeights.length; ++i) { + let error = $root.Weights.verify(message.modelWeights[i]); + if (error) return "modelWeights." + error; + } + } + + return null; + }; + + Model.fromObject = function fromObject(object) { + if (object instanceof $root.Model) return object; + let message = new $root.Model(); + if (object.id != null) message.id = String(object.id); + if (object.name != null) message.name = String(object.name); + if (object.kerasVersion != null) message.kerasVersion = String(object.kerasVersion); + if (object.backend != null) message.backend = String(object.backend); + if (object.modelConfig != null) message.modelConfig = String(object.modelConfig); + + if (object.modelWeights) { + if (!Array.isArray(object.modelWeights)) throw TypeError(".Model.modelWeights: array expected"); + message.modelWeights = []; + + for (let i = 0; i < object.modelWeights.length; ++i) { + if (typeof object.modelWeights[i] !== "object") throw TypeError(".Model.modelWeights: object expected"); + message.modelWeights[i] = $root.Weights.fromObject(object.modelWeights[i]); + } + } + + return message; + }; + + Model.toObject = function toObject(message, options) { + if (!options) options = {}; + let object = {}; + if (options.arrays || options.defaults) object.modelWeights = []; + + if (options.defaults) { + object.id = ""; + object.name = ""; + object.kerasVersion = ""; + object.backend = ""; + object.modelConfig = ""; + } + + if (message.id != null && message.hasOwnProperty("id")) object.id = message.id; + if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; + if (message.kerasVersion != null && message.hasOwnProperty("kerasVersion")) object.kerasVersion = message.kerasVersion; + if (message.backend != null && message.hasOwnProperty("backend")) object.backend = message.backend; + if (message.modelConfig != null && message.hasOwnProperty("modelConfig")) object.modelConfig = message.modelConfig; + + if (message.modelWeights && message.modelWeights.length) { + object.modelWeights = []; + + for (let j = 0; j < message.modelWeights.length; ++j) object.modelWeights[j] = $root.Weights.toObject(message.modelWeights[j], options); + } + + return object; + }; + + Model.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Model; +})(); + +exports.Model = Model; \ No newline at end of file diff --git a/lib/utils/tensorUtils.js b/lib/utils/tensorUtils.js new file mode 100644 index 0000000000..b2d81ffb1b --- /dev/null +++ b/lib/utils/tensorUtils.js @@ -0,0 +1,89 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.checkShape = checkShape; +exports.data3DLayoutForGL = data3DLayoutForGL; +exports.createIndicesFor2DReshaped = createIndicesFor2DReshaped; + +var _range2 = _interopRequireDefault(require("lodash/range")); + +var _ndarray = _interopRequireDefault(require("ndarray")); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function checkShape(data, shape) { + if (data.length && shape.length && data.length !== shape.reduce((a, b) => a * b, 1)) { + throw new Error('[Tensor] specified shape incompatible with data.'); + } +} + +function data3DLayoutForGL(typedarrayConstructor, arr, shape) { + const data = new typedarrayConstructor(arr.data.length); + const slice = (0, _ndarray.default)(new typedarrayConstructor(shape[0] * shape[1]), [shape[0], shape[1]]); + let offset = 0; + + for (let i = 0; i < shape[2]; i++) { + _ndarrayOps.default.assign(slice, arr.pick(null, null, i)); + + data.set(slice.data, offset); + offset += shape[0] * shape[1]; + } + + return data; +} + +function createIndicesFor2DReshaped(shape, square = false, axis = -1) { + const size = shape.reduce((a, b) => a * b, 1); + const indicesArr = (0, _ndarray.default)(new Int32Array(size), shape); + + if (square) { + const squareDim = Math.ceil(Math.sqrt(size)); + const indicesRowArrReshaped = (0, _ndarray.default)(new Int32Array(squareDim ** 2), [squareDim, squareDim]); + const indicesColArrReshaped = (0, _ndarray.default)(new Int32Array(squareDim ** 2), [squareDim, squareDim]); + const indicesArrReshaped = (0, _ndarray.default)(new Int32Array(squareDim ** 2), [squareDim, squareDim]); + + for (let i = 0; i < squareDim; i++) { + _ndarrayOps.default.assigns(indicesRowArrReshaped.pick(i, null), i); + } + + for (let j = 0; j < squareDim; j++) { + _ndarrayOps.default.assigns(indicesColArrReshaped.pick(null, j), j); + } + + _ndarrayOps.default.muls(indicesArrReshaped, indicesRowArrReshaped, squareDim); + + _ndarrayOps.default.addeq(indicesArrReshaped, indicesColArrReshaped); + + indicesArr.data.set(indicesArrReshaped.data.subarray(0, indicesArr.size)); + } else { + if (axis < 0) { + axis = shape.length + axis; + } + + const axisSize = shape[axis]; + const indicesRowArr = (0, _ndarray.default)(new Int32Array(size), shape); + const indicesColArr = (0, _ndarray.default)(new Int32Array(size), shape); + const otherAxes = [...shape.slice(0, axis), ...shape.slice(axis + 1)]; + const otherAxesSize = otherAxes.reduce((a, b) => a * b, 1); + const indicesRowArrSlice = (0, _ndarray.default)(new Int32Array((0, _range2.default)(otherAxesSize)), otherAxes); + const axisSlices = Array(shape.length).fill(null); + + for (let n = 0; n < axisSize; n++) { + axisSlices[axis] = n; + + _ndarrayOps.default.assign(indicesRowArr.pick(...axisSlices), indicesRowArrSlice); + + _ndarrayOps.default.assigns(indicesColArr.pick(...axisSlices), n); + } + + _ndarrayOps.default.muls(indicesArr, indicesRowArr, axisSize); + + _ndarrayOps.default.addeq(indicesArr, indicesColArr); + } + + return indicesArr; +} \ No newline at end of file diff --git a/lib/utils/testUtils.js b/lib/utils/testUtils.js new file mode 100644 index 0000000000..36e30b5d69 --- /dev/null +++ b/lib/utils/testUtils.js @@ -0,0 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.approxEquals = approxEquals; + +var _isFinite2 = _interopRequireDefault(require("lodash/isFinite")); + +var _flattenDeep2 = _interopRequireDefault(require("lodash/flattenDeep")); + +var _ndarrayUnpack = _interopRequireDefault(require("ndarray-unpack")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function approxEquals(ndarrayOut, dataExpected, tol = 0.0001) { + const a = (0, _flattenDeep2.default)((0, _ndarrayUnpack.default)(ndarrayOut)); + const b = dataExpected; + + if (a.length !== b.length) { + return false; + } + + for (let i = 0; i < a.length; i++) { + if (!(0, _isFinite2.default)(a[i])) { + return false; + } + + if (a[i] < b[i] - tol || a[i] > b[i] + tol) { + return false; + } + } + + return true; +} \ No newline at end of file diff --git a/lib/visualizations/CAM.js b/lib/visualizations/CAM.js new file mode 100644 index 0000000000..893ea2f6aa --- /dev/null +++ b/lib/visualizations/CAM.js @@ -0,0 +1,172 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Tensor = _interopRequireDefault(require("../Tensor")); + +var _WebGL = require("../WebGL2"); + +var _ndarrayOps = _interopRequireDefault(require("ndarray-ops")); + +var _ndarrayBlasLevel = require("ndarray-blas-level2"); + +var _ndarrayGemm = _interopRequireDefault(require("ndarray-gemm")); + +var _createGLSLProgram = _interopRequireDefault(require("../webgl/dynamic/createGLSLProgram")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +class CAM { + constructor(attrs = {}) { + this.modelLayersMap = attrs.modelLayersMap; + this.gpu = attrs.gpu; + + if (!this.modelLayersMap) { + throw new Error(`[CAM] modelLayersMap is required`); + } + } + + initialize() { + this.modelLayersMap.forEach(layer => { + if (layer.layerClass === 'GlobalAveragePooling2D') { + this.enabled = true; + this.poolLayer = layer; + } + }); + + if (this.enabled && !this.data) { + this.featureMaps = this.modelLayersMap.get(this.poolLayer.inbound[0]).output; + let weightsFound = false; + let finalLayerReached = false; + let traversingLayer = this.poolLayer; + + while (!weightsFound && !finalLayerReached) { + traversingLayer = this.modelLayersMap.get(traversingLayer.outbound[0]); + + if (traversingLayer.weights['kernel']) { + this.weights = traversingLayer.weights['kernel']; + weightsFound = true; + } else if (!traversingLayer.outbound.length) { + this.weights = this.poolLayer.output; + finalLayerReached = true; + } + } + + if (this.featureMaps.is2DReshaped) { + this.inputShape = this.featureMaps.originalShape.slice(0, 2); + } else { + this.inputShape = this.featureMaps.tensor.shape.slice(0, 2); + } + + if (this.weights.tensor.shape.length === 1) { + this.shape = this.inputShape; + } else { + const numOutputClasses = this.weights.tensor.shape[1]; + this.shape = [...this.inputShape, numOutputClasses]; + } + + this.data = new Float32Array(this.shape.reduce((a, b) => a * b, 1)); + } + } + + update() { + if (!this.enabled) return; + this.featureMaps = this.modelLayersMap.get(this.poolLayer.inbound[0]).output; + + if (this.gpu) { + this._updateGPU(); + } else { + this._updateCPU(); + } + + const outputMin = _ndarrayOps.default.inf(this.output.tensor); + + const outputMax = _ndarrayOps.default.sup(this.output.tensor); + + _ndarrayOps.default.divseq(_ndarrayOps.default.subseq(this.output.tensor, outputMin), outputMax - outputMin); + + this.data = this.output.tensor.data; + } + + _updateCPU() { + if (!this.featureMaps.is2DReshaped) { + this.featureMaps.reshapeTo2D(); + } + + if (this.weights.tensor.shape.length === 1) { + if (!this.output) { + this.output = new _Tensor.default([], this.shape); + } + + const matVec = new _Tensor.default([], [this.shape[0] * this.shape[1]]); + (0, _ndarrayBlasLevel.gemv)(1, this.featureMaps.tensor, this.weights.tensor, 1, matVec.tensor); + this.output.replaceTensorData(matVec.tensor.data); + } else { + if (!this.output) { + this.output = new _Tensor.default([], this.shape); + } + + this.output.reshapeTo2D(); + (0, _ndarrayGemm.default)(this.output.tensor, this.featureMaps.tensor, this.weights.tensor, 1, 1); + this.output.reshapeFrom2D(); + } + + _ndarrayOps.default.maxseq(this.output.tensor, 0); + + if (this.featureMaps.is2DReshaped) { + this.featureMaps.reshapeFrom2D(); + } + } + + _updateGPU() { + if (!this.output) { + this.output = new _Tensor.default([], this.shape); + } + + const isWeights1D = this.weights.is1D; + + if (!this.output.glTexture && isWeights1D) { + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } else { + this.output.reshapeTo2D(); + this.output.createGLTexture({ + type: '2d', + format: 'float' + }); + } + + const numFeatures = isWeights1D ? this.weights.glTextureShape[1] : this.weights.glTextureShape[0]; + + if (!this.program) { + const programSource = (0, _createGLSLProgram.default)('cam', this.output.glTextureShape, numFeatures, isWeights1D); + this.program = _WebGL.webgl2.compileProgram(programSource); + } + + _WebGL.webgl2.runProgram({ + program: this.program, + output: this.output, + inputs: [{ + input: this.featureMaps, + name: 'featureMaps' + }, { + input: this.weights, + name: 'weights' + }] + }); + + this.output.transferFromGLTexture(); + + if (this.output.is2DReshaped) { + this.output.reshapeFrom2D(); + } + } + +} + +exports.default = CAM; \ No newline at end of file diff --git a/lib/visualizations/index.js b/lib/visualizations/index.js new file mode 100644 index 0000000000..541e2e55a7 --- /dev/null +++ b/lib/visualizations/index.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "CAM", { + enumerable: true, + get: function () { + return _CAM.default; + } +}); + +var _CAM = _interopRequireDefault(require("./CAM")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/lib/warnings.js b/lib/warnings.js deleted file mode 100644 index 329b013fc1..0000000000 --- a/lib/warnings.js +++ /dev/null @@ -1,20 +0,0 @@ -const chalk = require('chalk') - -module.exports = { - v2SuffixTemplatesDeprecated (template, name) { - const initCommand = 'vue init ' + template.replace('-2.0', '') + ' ' + name - - console.log(chalk.red(' This template is deprecated, as the original template now uses Vue 2.0 by default.')) - console.log() - console.log(chalk.yellow(' Please use this command instead: ') + chalk.green(initCommand)) - console.log() - }, - v2BranchIsNowDefault (template, name) { - const vue1InitCommand = 'vue init ' + template + '#1.0' + ' ' + name - - console.log(chalk.green(' This will install Vue 2.x version of the template.')) - console.log() - console.log(chalk.yellow(' For Vue 1.x use: ') + chalk.green(vue1InitCommand)) - console.log() - } -} diff --git a/lib/webgl/dynamic/convolutional/conv2d.js b/lib/webgl/dynamic/convolutional/conv2d.js new file mode 100644 index 0000000000..764f64bb76 --- /dev/null +++ b/lib/webgl/dynamic/convolutional/conv2d.js @@ -0,0 +1,44 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = conv2d; + +function conv2d(outputShape, inputShape, indexMapShape, useBias, hasFragments) { + const addBias = useBias ? `sum += texelFetch(bias, ivec2(out_x, 0), 0).r;` : ''; + const adjustIndicesForFragments = hasFragments ? `int fragmentIndex = int(floor(float(rowIndex) / float(${inputShape[0]}))); + rowIndex = int(mod(float(rowIndex), float(${inputShape[0]}))); + colIndex += fragmentIndex * ${inputShape[1]};` : ''; + const source = `#version 300 es +precision highp float; +precision highp isampler2D; + +in vec2 outTex; +uniform sampler2D x; +uniform isampler2D indexMap; +uniform sampler2D kernel; +uniform sampler2D bias; +out vec4 outColor; + +void main() { + int out_y = int(float(${outputShape[0]}) * outTex.y); + int out_x = int(float(${outputShape[1]}) * outTex.x); + + float sum = 0.; + for (int i = 0; i < ${indexMapShape[1]}; ++i) { + int index = texelFetch(indexMap, ivec2(i, out_y), 0).r; + if (index != -1) { + int rowIndex = int(floor(float(index) / float(${inputShape[1]}))); + int colIndex = int(mod(float(index), float(${inputShape[1]}))); + ${adjustIndicesForFragments} + sum += texelFetch(x, ivec2(colIndex, rowIndex), 0).r * texelFetch(kernel, ivec2(out_x, i), 0).r; + } + } + + ${addBias} + outColor = vec4(sum); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/convolutional/conv2dTranspose.js b/lib/webgl/dynamic/convolutional/conv2dTranspose.js new file mode 100644 index 0000000000..fc9873be9a --- /dev/null +++ b/lib/webgl/dynamic/convolutional/conv2dTranspose.js @@ -0,0 +1,43 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = conv2dTranspose; + +function conv2dTranspose(outputShape, inputShape, indexMapShape, useBias, hasFragments) { + const addBias = useBias ? `sum += texelFetch(bias, ivec2(out_x, 0), 0).r;` : ''; + const adjustIndicesForFragments = hasFragments ? `int fragmentIndex = int(floor(float(rowIndex) / float(${inputShape[0]}))); + rowIndex = int(mod(float(rowIndex), float(${inputShape[0]}))); + colIndex += fragmentIndex * ${inputShape[1]};` : ''; + const source = `#version 300 es +precision highp float; +precision highp isampler2D; + +in vec2 outTex; +uniform sampler2D matMulResult; +uniform isampler2D indexMap; +uniform sampler2D bias; +out vec4 outColor; + +void main() { + int out_y = int(float(${outputShape[0]}) * outTex.y); + int out_x = int(float(${outputShape[1]}) * outTex.x); + + float sum = 0.; + for (int n = 0; n < ${indexMapShape[1]}; ++n) { + int index = texelFetch(indexMap, ivec2(n, out_y), 0).r; + if (index != -1) { + int rowIndex = int(floor(float(index) / float(${inputShape[1]}))); + int colIndex = int(mod(float(index), float(${inputShape[1]}))); + ${adjustIndicesForFragments} + sum += texelFetch(matMulResult, ivec2(colIndex + out_x, rowIndex), 0).r; + } + } + + ${addBias} + outColor = vec4(sum); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/createGLSLProgram.js b/lib/webgl/dynamic/createGLSLProgram.js new file mode 100644 index 0000000000..8273e5a7e5 --- /dev/null +++ b/lib/webgl/dynamic/createGLSLProgram.js @@ -0,0 +1,65 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = createGLSLProgram; + +var _add = _interopRequireDefault(require("./merge/add")); + +var _average = _interopRequireDefault(require("./merge/average")); + +var _concatenate = _interopRequireDefault(require("./merge/concatenate")); + +var _maximum = _interopRequireDefault(require("./merge/maximum")); + +var _minimum = _interopRequireDefault(require("./merge/minimum")); + +var _multiply = _interopRequireDefault(require("./merge/multiply")); + +var _subtract = _interopRequireDefault(require("./merge/subtract")); + +var _conv2d = _interopRequireDefault(require("./convolutional/conv2d")); + +var _conv2dTranspose = _interopRequireDefault(require("./convolutional/conv2dTranspose")); + +var _cam = _interopRequireDefault(require("./visualizations/cam")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function createGLSLProgram(program, ...args) { + switch (program) { + case 'add': + return (0, _add.default)(...args); + + case 'average': + return (0, _average.default)(...args); + + case 'concatenate': + return (0, _concatenate.default)(...args); + + case 'maximum': + return (0, _maximum.default)(...args); + + case 'minimum': + return (0, _minimum.default)(...args); + + case 'multiply': + return (0, _multiply.default)(...args); + + case 'subtract': + return (0, _subtract.default)(...args); + + case 'conv2d': + return (0, _conv2d.default)(...args); + + case 'conv2dTranspose': + return (0, _conv2dTranspose.default)(...args); + + case 'cam': + return (0, _cam.default)(...args); + + default: + throw new Error('GLSL program not found'); + } +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/add.js b/lib/webgl/dynamic/merge/add.js new file mode 100644 index 0000000000..2269359973 --- /dev/null +++ b/lib/webgl/dynamic/merge/add.js @@ -0,0 +1,28 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = add; + +var _range2 = _interopRequireDefault(require("lodash/range")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function add(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + outColor = vec4(${(0, _range2.default)(numInputs).map(i => `texelFetch(inputs[${i}], ivec2(out_x, out_y), 0).r`).join(' + ')}); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/average.js b/lib/webgl/dynamic/merge/average.js new file mode 100644 index 0000000000..0a96cf805c --- /dev/null +++ b/lib/webgl/dynamic/merge/average.js @@ -0,0 +1,28 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = average; + +var _range2 = _interopRequireDefault(require("lodash/range")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function average(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + outColor = vec4((${(0, _range2.default)(numInputs).map(i => `texelFetch(inputs[${i}], ivec2(out_x, out_y), 0).r`).join(' + ')}) / float(${numInputs})); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/concatenate.js b/lib/webgl/dynamic/merge/concatenate.js new file mode 100644 index 0000000000..791572e061 --- /dev/null +++ b/lib/webgl/dynamic/merge/concatenate.js @@ -0,0 +1,67 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = concatenate; + +var _take2 = _interopRequireDefault(require("lodash/take")); + +var _sum2 = _interopRequireDefault(require("lodash/sum")); + +var _range2 = _interopRequireDefault(require("lodash/range")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function concatenate(numInputs, inputShapes, outputShape, concatAxis) { + const dims = inputShapes.map(shape => shape[concatAxis]); + const offsets = (0, _range2.default)(numInputs + 1).map(i => (0, _sum2.default)((0, _take2.default)(dims, i))); + const outVar = concatAxis === 0 ? 'out_y' : 'out_x'; + let getOffset = ` + int n = 0; + int offset = 0; + if (${outVar} >= ${offsets[1]} && ${outVar} < ${offsets[2]}) { + n = 1; + offset = ${offsets[1]}; + }`; + + if (numInputs > 2) { + getOffset += `${(0, _range2.default)(2, numInputs).map(i => ` else if (${outVar} >= ${offsets[i]} && ${outVar} < ${offsets[i + 1]}) { + n = ${i}; + offset = ${offsets[i]}; + }`).join('')} +`; + } + + let outBlock = 'outColor = vec4(0.0);'; + + if (concatAxis === 0 || concatAxis === 1) { + const xCoord = i => `out_x${concatAxis === 1 ? ` - ${offsets[i]}` : ''}`; + + const yCoord = i => `out_y${concatAxis === 0 ? ` - ${offsets[i]}` : ''}`; + + outBlock = ` + if (n == 0) { + outColor = vec4(texelFetch(inputs[0], ivec2(out_x, out_y), 0).r); + }${(0, _range2.default)(1, numInputs).map(i => ` else if (n == ${i}) { + outColor = vec4(texelFetch(inputs[${i}], ivec2(${xCoord(i)}, ${yCoord(i)}), 0).r); + }`).join('')} +`; + } + + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${outputShape[0]}) * outTex.y); + int out_x = int(float(${outputShape[1]}) * outTex.x); +${getOffset} +${outBlock} +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/maximum.js b/lib/webgl/dynamic/merge/maximum.js new file mode 100644 index 0000000000..b6c70ab45c --- /dev/null +++ b/lib/webgl/dynamic/merge/maximum.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = maximum; + +function maximum(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + float val = texelFetch(inputs[0], ivec2(out_x, out_y), 0).r; + for (int i = 1; i < ${numInputs}; i++) { + val = max(val, texelFetch(inputs[i], ivec2(out_x, out_y), 0).r); + } + + outColor = vec4(val); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/minimum.js b/lib/webgl/dynamic/merge/minimum.js new file mode 100644 index 0000000000..b9c97e3005 --- /dev/null +++ b/lib/webgl/dynamic/merge/minimum.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = minimum; + +function minimum(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + float val = texelFetch(inputs[0], ivec2(out_x, out_y), 0).r; + for (int i = 1; i < ${numInputs}; i++) { + val = min(val, texelFetch(inputs[i], ivec2(out_x, out_y), 0).r); + } + + outColor = vec4(val); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/multiply.js b/lib/webgl/dynamic/merge/multiply.js new file mode 100644 index 0000000000..8a0b9e7cc5 --- /dev/null +++ b/lib/webgl/dynamic/merge/multiply.js @@ -0,0 +1,28 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = multiply; + +var _range2 = _interopRequireDefault(require("lodash/range")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function multiply(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[${numInputs}]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + outColor = vec4(${(0, _range2.default)(numInputs).map(i => `texelFetch(inputs[${i}], ivec2(out_x, out_y), 0).r`).join(' * ')}); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/merge/subtract.js b/lib/webgl/dynamic/merge/subtract.js new file mode 100644 index 0000000000..5c4b17395c --- /dev/null +++ b/lib/webgl/dynamic/merge/subtract.js @@ -0,0 +1,24 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = subtract; + +function subtract(numInputs, shape) { + const source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D inputs[2]; +out vec4 outColor; + +void main() { + int out_y = int(float(${shape[0]}) * outTex.y); + int out_x = int(float(${shape[1]}) * outTex.x); + + outColor = vec4(texelFetch(inputs[0], ivec2(out_x, out_y), 0).r - texelFetch(inputs[1], ivec2(out_x, out_y), 0).r); +} +`; + return source; +} \ No newline at end of file diff --git a/lib/webgl/dynamic/visualizations/cam.js b/lib/webgl/dynamic/visualizations/cam.js new file mode 100644 index 0000000000..123cbb08a5 --- /dev/null +++ b/lib/webgl/dynamic/visualizations/cam.js @@ -0,0 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = cam; + +function cam(outputShape, numFeatures, weightsIs1D) { + let source; + + if (weightsIs1D) { + source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D featureMaps; +uniform sampler2D weights; +out vec4 outColor; + +void main() { + int out_y = int(float(${outputShape[0]}) * outTex.y); + int out_x = int(float(${outputShape[1]}) * outTex.x); + + int featureMapsRow = out_x + ${outputShape[0]} * out_y; + + float sum = 0.; + for (int k = 0; k < ${numFeatures}; ++k) { + float f = texelFetch(featureMaps, ivec2(k, featureMapsRow), 0).r; + float w = texelFetch(weights, ivec2(k, 0), 0).r; + sum += f * w; + } + + outColor = vec4(max(sum, 0.0)); +} +`; + } else { + source = `#version 300 es +precision highp float; + +in vec2 outTex; +uniform sampler2D featureMaps; +uniform sampler2D weights; +out vec4 outColor; + +void main() { + int out_y = int(float(${outputShape[0]}) * outTex.y); + int out_x = int(float(${outputShape[1]}) * outTex.x); + + float sum = 0.; + for (int k = 0; k < ${numFeatures}; ++k) { + float f = texelFetch(featureMaps, ivec2(k, out_y), 0).r; + float w = texelFetch(weights, ivec2(out_x, k), 0).r; + sum += f * w; + } + + outColor = vec4(max(sum, 0.0)); +} +`; + } + + return source; +} \ No newline at end of file diff --git a/myproj/.babelrc b/myproj/.babelrc index 3419daeaef..9237a30ed3 100644 --- a/myproj/.babelrc +++ b/myproj/.babelrc @@ -3,9 +3,12 @@ ["env", { "modules": false }], - "stage-2" + // "stage-2" + {} + ], + "plugins": [ + "transform-runtime" ], - "plugins": ["transform-runtime"], "env": { "test": { "presets": ["env", "stage-2"], diff --git a/myproj/.eslintrc.js b/myproj/.eslintrc.js index bdc9487582..114106cc05 100644 --- a/myproj/.eslintrc.js +++ b/myproj/.eslintrc.js @@ -18,10 +18,16 @@ module.exports = { // add your custom rules here 'rules': { + // "indent": "off", + // "space-before-blocks": "off", + "spaced-comment" : "off", + + "space-before-function-paren" : "off", + // allow paren-less arrow functions 'arrow-parens': 0, // allow async-await diff --git a/myproj/build/webpack.base.conf.js b/myproj/build/webpack.base.conf.js index b69edc013a..fefd562b99 100644 --- a/myproj/build/webpack.base.conf.js +++ b/myproj/build/webpack.base.conf.js @@ -72,7 +72,14 @@ module.exports = { limit: 10000, name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } + }, + { + test: /\.glsl$/, + loader: 'webpack-glsl-loader' } ] + }, + node: { + fs: 'empty' } } diff --git a/myproj/index.html b/myproj/index.html index aa1bd0a242..67b56eb4c8 100644 --- a/myproj/index.html +++ b/myproj/index.html @@ -7,6 +7,6 @@
- + diff --git a/myproj/package-lock.json b/myproj/package-lock.json index e2056f072d..55d08f1da2 100644 --- a/myproj/package-lock.json +++ b/myproj/package-lock.json @@ -4,30 +4,93 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "@babel/polyfill": { + "version": "7.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0-beta.32.tgz", + "integrity": "sha512-VhAfJkk1c4wgpfjG/OBxUlq8QEUqsKWhttJI4nO0OHX+gyC2+7AbePbBWxmCKIoZSPAujcySx07/SxXihK0yEA==", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/inquire": "1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@std/esm": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@std/esm/-/esm-0.16.0.tgz", + "integrity": "sha512-JokzOdnTmxUWJ81VWp0OuSR+VZGuvM9lmnefiPoeTwrOH/wworkRvwkXMpSuso0zYQ0LcbGUKLEdkoKwkYyohg==", "dev": true }, + "@types/events": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz", + "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==" + }, + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + }, + "@types/node": { + "version": "8.0.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.54.tgz", + "integrity": "sha512-qetMdTv3Ytz9u9ESLdcYs45LPI0mczYZIbC184n7kY0jczOqPNQsabBfVCh+na3B2shAfvC459JqHV771A8Rxg==", + "requires": { + "@types/events": "1.1.0" + } + }, "accepts": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", @@ -41,8 +104,7 @@ "acorn": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", - "dev": true + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -61,23 +123,6 @@ } } }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -95,24 +140,6 @@ } } }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } - }, "ajv": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", @@ -126,16 +153,15 @@ } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, "requires": { "kind-of": "3.2.2", "longest": "1.0.1", @@ -152,12 +178,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true + "optional": true }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", "dev": true }, "ansi-html": { @@ -191,15 +217,6 @@ "normalize-path": "2.1.1" } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -224,12 +241,6 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "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-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -237,9 +248,9 @@ "dev": true }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", "dev": true }, "array-includes": { @@ -279,12 +290,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "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.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", @@ -305,30 +310,6 @@ "util": "0.10.3" } }, - "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.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", - "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", - "dev": true - }, - "ast-types": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", - "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", - "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": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -344,18 +325,6 @@ "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=", - "dev": true - }, "autoprefixer": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", @@ -370,17 +339,14 @@ "postcss-value-parser": "3.3.0" } }, - "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.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true + "axios": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", + "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", + "requires": { + "follow-redirects": "1.2.6", + "is-buffer": "1.1.6" + } }, "babel-code-frame": { "version": "6.26.0", @@ -447,6 +413,15 @@ "source-map": "0.5.7" }, "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" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -641,12 +616,6 @@ "babel-types": "6.26.0" } }, - "babel-helper-vue-jsx-merge-props": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.2.tgz", - "integrity": "sha1-rOscNzWIJ54nVeoc/TXCI5T9M/g=", - "dev": true - }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", @@ -722,29 +691,6 @@ "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", "dev": true }, - "babel-plugin-jsx-event-modifiers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz", - "integrity": "sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg==", - "dev": true - }, - "babel-plugin-jsx-v-model": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz", - "integrity": "sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "html-tags": "2.0.0", - "svg-tags": "1.0.0" - } - }, - "babel-plugin-jsx-vue-functional": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-vue-functional/-/babel-plugin-jsx-vue-functional-2.1.0.tgz", - "integrity": "sha1-VjCgyG/hkE0owwRl5r8c9xI1ojk=", - "dev": true - }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -781,12 +727,6 @@ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", @@ -1129,15 +1069,6 @@ "babel-types": "6.26.0" } }, - "babel-plugin-transform-vue-jsx": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.5.0.tgz", - "integrity": "sha512-5vCg8K7aiiLwrFJ45ZF/b4cIiFpGAoYL5uNZpbgiZFptBc5LkueBCQXTVexrd1IFlpTV7XndqFjtWjcJ54JGUQ==", - "dev": true, - "requires": { - "esutils": "2.0.2" - } - }, "babel-preset-env": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", @@ -1211,34 +1142,6 @@ "babel-plugin-transform-object-rest-spread": "6.26.0" } }, - "babel-preset-vue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/babel-preset-vue/-/babel-preset-vue-1.2.1.tgz", - "integrity": "sha512-a/Z+6SJ4GXyAoCMfYidDH6OzXnccPNJ5nEaPMjALqCkP9SJkqxz9V0uUS//sGuWszcD8kibdwJRzU+brl8DdFQ==", - "dev": true, - "requires": { - "babel-helper-vue-jsx-merge-props": "2.0.2", - "babel-plugin-jsx-event-modifiers": "2.0.5", - "babel-plugin-jsx-v-model": "2.0.3", - "babel-plugin-jsx-vue-functional": "2.1.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-vue-jsx": "3.5.0" - } - }, - "babel-preset-vue-app": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/babel-preset-vue-app/-/babel-preset-vue-app-1.3.2.tgz", - "integrity": "sha512-PLyyyVdrvgL4szMF7D5SuUhy85aBzy0+s5MO2QhpTwVqfW0qVaPFJi6K3d25CKz1nOV437JgpVvPj1W6tLGJ5g==", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.6.1", - "babel-preset-vue": "1.2.1", - "babel-runtime": "6.26.0" - } - }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", @@ -1292,6 +1195,23 @@ "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } } }, "babel-types": { @@ -1330,16 +1250,6 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1352,10 +1262,20 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "blueimp-load-image": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-2.17.1.tgz", + "integrity": "sha512-kE6VA2rSBXbFAc9M9laaMD2oOssSopUwLPsjYlFDj4qLY5T1v9ieDi6rAon6fLKTYzlXbIEnxzyCYS/uD2U3NQ==", "dev": true }, "bn.js": { @@ -1380,6 +1300,17 @@ "qs": "6.5.1", "raw-body": "2.3.2", "type-is": "1.6.15" + }, + "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" + } + } } }, "bonjour": { @@ -1394,29 +1325,6 @@ "dns-txt": "2.0.2", "multicast-dns": "6.2.1", "multicast-dns-service-types": "1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "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 - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.0" } }, "brace-expansion": { @@ -1446,29 +1354,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "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 - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", @@ -1549,15 +1434,6 @@ "electron-to-chromium": "1.3.27" } }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "dev": true, - "requires": { - "node-int64": "0.4.0" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -1614,21 +1490,10 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "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.3.2", - "upper-case": "1.1.3" - } - }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "camelcase-keys": { "version": "2.1.0", @@ -1684,32 +1549,15 @@ "integrity": "sha1-McGKSozUl4LrswXI6Kk+azs+TxM=", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, "requires": { "align-text": "0.1.4", "lazy-cache": "1.0.4" } }, - "chai-nightwatch": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz", - "integrity": "sha1-HKVt52jTwIaP5/wvTTLC/olOa+k=", - "dev": true, - "requires": { - "assertion-error": "1.0.0", - "deep-eql": "0.1.3" - } - }, "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", @@ -1721,6 +1569,12 @@ "supports-color": "4.5.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1737,23 +1591,10 @@ "readdirp": "2.1.0" } }, - "chromedriver": { - "version": "2.33.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.33.2.tgz", - "integrity": "sha512-etnQeM8Mqiys50ZB4IiuNqeB1WS2/EKFhVXwkPQ1qjzKMMAJUyrLjaRUcoZoHrbjGscnhBrWkRR+p3zcTGMhDg==", - "dev": true, - "requires": { - "del": "3.0.0", - "extract-zip": "1.6.6", - "kew": "0.7.0", - "mkdirp": "0.5.1", - "request": "2.83.0" - } - }, - "ci-info": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", - "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "chroma-js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.3.4.tgz", + "integrity": "sha1-k6fBnyh5YChcw/3rsgW46hoPBPk=", "dev": true }, "cipher-base": { @@ -1808,38 +1649,15 @@ } } }, - "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", - "dev": true, - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "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": "1.0.1" + "restore-cursor": "2.0.0" } }, - "cli-spinners": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", - "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", - "dev": true - }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -1850,7 +1668,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, "requires": { "center-align": "0.1.3", "right-align": "0.1.3", @@ -1860,8 +1677,7 @@ "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } }, @@ -1950,21 +1766,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1993,7 +1794,18 @@ "on-headers": "1.0.1", "safe-buffer": "5.1.1", "vary": "1.1.2" - } + }, + "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" + } + } + } }, "concat-map": { "version": "0.0.1", @@ -2005,34 +1817,12 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3", "typedarray": "0.0.6" } }, - "condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-whitespace": "0.3.0", - "kind-of": "3.2.2" - } - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "dev": true, - "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" - } - }, "connect-history-api-fallback": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", @@ -2081,12 +1871,6 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", - "dev": true - }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -2105,59 +1889,20 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "copy-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-cL/Wl3Y1QmmKThl/mWeGB+HH3YH+25tn8nhqEGsZda4Yn7GqGnDZ+TbeKJ7A6zvrxyNhhuviYAxn/tCyyAqh8Q==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "glob": "7.1.2", - "is-glob": "4.0.0", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "minimatch": "3.0.4" - }, - "dependencies": { - "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-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" - } - }, - "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.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, "core-js": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" }, "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=", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", "dev": true }, "cosmiconfig": { @@ -2230,26 +1975,6 @@ "which": "1.3.0" } }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -2269,6 +1994,35 @@ "randomfill": "1.0.3" } }, + "css-color-function": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/css-color-function/-/css-color-function-1.3.3.tgz", + "integrity": "sha1-jtJMLAIFBzM5+voAS8jBQfzLKC4=", + "dev": true, + "requires": { + "balanced-match": "0.1.0", + "color": "0.11.4", + "debug": "3.1.0", + "rgb": "0.1.0" + }, + "dependencies": { + "balanced-match": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", + "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -2359,30 +2113,6 @@ } } }, - "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.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - }, - "dependencies": { - "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.1.0", - "domelementtype": "1.3.0" - } - } - } - }, "css-selector-tokenizer": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", @@ -2407,10 +2137,10 @@ } } }, - "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=", + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", "dev": true }, "cssesc": { @@ -2563,21 +2293,6 @@ } } }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2587,6 +2302,69 @@ "array-find-index": "1.0.2" } }, + "cwise": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", + "integrity": "sha1-JO7mBy69/WuMb12tsXCQtkmxK+8=", + "requires": { + "cwise-compiler": "1.1.3", + "cwise-parser": "1.0.3", + "static-module": "1.5.0", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "cwise-compiler": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", + "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", + "requires": { + "uniq": "1.0.1" + } + }, + "cwise-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", + "integrity": "sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4=", + "requires": { + "esprima": "1.2.5", + "uniq": "1.0.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=" + } + } + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -2596,21 +2374,6 @@ "es5-ext": "0.10.37" } }, - "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-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", - "dev": true - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2624,9 +2387,9 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -2635,17 +2398,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - } + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "deep-equal": { "version": "1.0.1", @@ -2659,15 +2412,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -2684,25 +2428,6 @@ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.10.1", - "escodegen": "1.9.0", - "esprima": "3.1.3" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -2725,12 +2450,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -2768,12 +2487,6 @@ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", "dev": true }, - "diff": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true - }, "diffie-hellman": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", @@ -2799,14 +2512,6 @@ "requires": { "ip": "1.1.5", "safe-buffer": "5.1.1" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - } } }, "dns-txt": { @@ -2827,23 +2532,6 @@ "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.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", @@ -2893,43 +2581,59 @@ "domelementtype": "1.3.0" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" }, - "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, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "requires": { - "jsbn": "0.1.1" + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } } }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", + "ecstatic": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-2.2.1.tgz", + "integrity": "sha512-ztE4WqheoWLh3wv+HQwy7dACnvNY620coWpa+XqY6R2cVWgaAT2lUISU1Uf7JpdLLJCURktJOaA9av2AOzsyYQ==", "dev": true, "requires": { - "bluebird": "3.5.1", - "commander": "2.12.2", - "lru-cache": "3.2.0", - "semver": "5.4.1", - "sigmund": "1.0.1" + "he": "1.1.1", + "mime": "1.3.6", + "minimist": "1.2.0", + "url-join": "2.0.2" }, "dependencies": { - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, - "requires": { - "pseudomap": "1.0.2" - } + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -2939,12 +2643,6 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "ejs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.3.tgz", - "integrity": "sha1-24qsR/+Ap9+CtMgsEm/olwhwYm8=", - "dev": true - }, "electron-to-chromium": { "version": "1.3.27", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", @@ -3014,15 +2712,6 @@ "is-arrayish": "0.2.1" } }, - "error-stack-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.1.tgz", - "integrity": "sha1-oyArj7AxFKqbQKDjZp5IsrZaAQo=", - "dev": true, - "requires": { - "stackframe": "1.0.4" - } - }, "es-abstract": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", @@ -3129,38 +2818,10 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", - "dev": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.5.7" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { "es6-map": "0.1.5", @@ -3170,78 +2831,80 @@ } }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.12.1.tgz", + "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==", "dev": true, "requires": { + "ajv": "5.5.0", "babel-code-frame": "6.26.0", - "chalk": "1.1.3", + "chalk": "2.3.0", "concat-stream": "1.6.0", - "debug": "2.6.9", + "cross-spawn": "5.1.0", + "debug": "3.1.0", "doctrine": "2.0.2", - "escope": "3.6.0", + "eslint-scope": "3.7.1", "espree": "3.5.2", "esquery": "1.0.0", "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "9.18.0", + "globals": "11.0.1", "ignore": "3.3.7", "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", + "inquirer": "3.3.0", "is-resolvable": "1.0.0", - "js-yaml": "3.7.0", - "json-stable-stringify": "1.0.1", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.4", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", + "pluralize": "7.0.0", + "progress": "2.0.0", "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", + "semver": "5.4.1", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "table": "4.0.2", + "text-table": "0.2.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "argparse": "1.0.9", + "esprima": "4.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 - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "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" + } } } }, @@ -3305,6 +2968,17 @@ "requires": { "debug": "2.6.9", "resolve": "1.5.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" + } + } } }, "eslint-loader": { @@ -3330,6 +3004,15 @@ "pkg-dir": "1.0.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" + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -3361,13 +3044,12 @@ } }, "eslint-plugin-html": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.2.tgz", - "integrity": "sha512-sSuafathF6ImPrzF2vUKEJY6Llq06d/riMTMzlsruDRDhNsQMYp2viUKo+jx+JRr1QevskeUpQcuptp2gN1XVQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.1.tgz", + "integrity": "sha512-w8mmUJQjtDMUNbw3NOa4+PjOH/r4W5T+RN2nCmYgXv+QHx+NiBodnbPHXmJFJgo7Dr0Yk4G/2LCIRhfKceNmNA==", "dev": true, "requires": { - "htmlparser2": "3.9.2", - "semver": "5.4.1" + "htmlparser2": "3.9.2" } }, "eslint-plugin-import": { @@ -3388,6 +3070,15 @@ "read-pkg-up": "2.0.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" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -3480,6 +3171,16 @@ "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", "dev": true }, + "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.2.0", + "estraverse": "4.2.0" + } + }, "espree": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", @@ -3564,12 +3265,6 @@ "original": "1.0.0" } }, - "eventsource-polyfill": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", - "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", - "dev": true - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -3580,15 +3275,6 @@ "safe-buffer": "5.1.1" } }, - "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", - "dev": true, - "requires": { - "merge": "1.2.0" - } - }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -3604,12 +3290,6 @@ "strip-eof": "1.0.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -3628,20 +3308,6 @@ "fill-range": "2.2.3" } }, - "expect": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", - "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "jest-diff": "21.2.1", - "jest-get-type": "21.2.0", - "jest-matcher-utils": "21.2.1", - "jest-message-util": "21.2.1", - "jest-regex-util": "21.2.0" - } - }, "express": { "version": "4.16.2", "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", @@ -3680,17 +3346,20 @@ "vary": "1.1.2" }, "dependencies": { - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true + "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" + } } } }, @@ -3700,13 +3369,15 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { - "is-extendable": "0.1.1" + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" } }, "extglob": { @@ -3730,35 +3401,24 @@ "webpack-sources": "1.1.0" } }, - "extract-zip": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", - "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", - "dev": true, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", "requires": { - "concat-stream": "1.6.0", - "debug": "2.6.9", - "mkdirp": "0.5.0", - "yauzl": "2.4.1" + "acorn": "5.2.1", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" }, "dependencies": { - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, - "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": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -3792,32 +3452,13 @@ "websocket-driver": "0.7.0" } }, - "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" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "1.2.0" - } - }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "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", - "object-assign": "4.1.1" + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -3830,44 +3471,12 @@ "object-assign": "4.1.1" } }, - "file-loader": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", - "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", - "dev": true - }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", @@ -3896,24 +3505,17 @@ "unpipe": "1.0.0" }, "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true + "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" + } } } }, - "find-babel-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", - "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", - "dev": true, - "requires": { - "json5": "0.5.1", - "path-exists": "3.0.0" - } - }, "find-cache-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", @@ -3983,6 +3585,24 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "follow-redirects": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.6.tgz", + "integrity": "sha512-FrMqZ/FONtHnbqO651UPpfRUVukIEwJhXMfdr/JWAmrDbeYBu773b1J6gdWDyRIj4hvvzQEHoEOTrdR8o6KLYA==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "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" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4001,25 +3621,7 @@ "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.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forwarded": { "version": "0.1.2", @@ -4033,43 +3635,11 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "friendly-errors-webpack-plugin": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.6.1.tgz", - "integrity": "sha1-4yeBxHIvVGoGqbXXp8+ihSA3XXA=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "error-stack-parser": "2.0.1", - "string-length": "1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", + "dev": true }, "fs.realpath": { "version": "1.0.0", @@ -4077,63 +3647,17 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.14", - "xregexp": "2.0.0" - }, - "dependencies": { - "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.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "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 }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -4152,29 +3676,6 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, - "get-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", - "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "1.2.0", - "debug": "2.6.9", - "extend": "3.0.1", - "file-uri-to-path": "1.0.0", - "ftp": "0.3.10", - "readable-stream": "2.3.3" - } - }, - "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", @@ -4209,9 +3710,9 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.0.1.tgz", + "integrity": "sha1-Eqh7sBDlFUOWrMU14eQ/x1Ow5eg=", "dev": true }, "globby": { @@ -4233,123 +3734,16 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "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 - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, "handle-thing": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", "dev": true }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "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.5.0", - "har-schema": "2.0.0" - } - }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, "requires": { "function-bind": "1.1.1" } @@ -4394,18 +3788,6 @@ "minimalistic-assert": "1.0.0" } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -4423,12 +3805,6 @@ "minimalistic-crypto-utils": "1.0.1" } }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", - "dev": true - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -4463,71 +3839,12 @@ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", "dev": true }, - "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.3" - } - }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "dev": true }, - "html-minifier": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", - "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.12.2", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.2.0" - } - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.7", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "pretty-error": "2.1.1", - "toposort": "1.0.6" - }, - "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.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, "htmlparser2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", @@ -4557,7 +3874,15 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } } }, "http-parser-js": { @@ -4576,17 +3901,6 @@ "requires-port": "1.0.0" } }, - "http-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, "http-proxy-middleware": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", @@ -4616,15 +3930,28 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-server": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.10.0.tgz", + "integrity": "sha1-sqRGsWqduH7TxiK6m+sbCFsSNKc=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "colors": "1.0.3", + "corser": "2.0.1", + "ecstatic": "2.2.1", + "http-proxy": "1.16.2", + "opener": "1.4.3", + "optimist": "0.6.1", + "portfinder": "1.0.13", + "union": "0.4.6" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } } }, "https-browserify": { @@ -4633,17 +3960,6 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -4727,60 +4043,60 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", "cli-width": "2.2.0", - "figures": "1.7.0", + "external-editor": "2.1.0", + "figures": "2.0.0", "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", "through": "2.3.8" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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 + }, + "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": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "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" + } } } }, @@ -4814,10 +4130,15 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "iota-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", + "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" + }, "ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", - "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, "ipaddr.js": { @@ -4850,8 +4171,7 @@ "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 + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -4868,15 +4188,6 @@ "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", "dev": true }, - "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "dev": true, - "requires": { - "ci-info": "1.1.2" - } - }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", @@ -4943,18 +4254,6 @@ "is-extglob": "1.0.0" } }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -5006,10 +4305,10 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "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": { @@ -5051,24 +4350,12 @@ "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-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", - "dev": true - }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -5078,8 +4365,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -5087,6 +4373,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isnumeric": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/isnumeric/-/isnumeric-0.2.0.tgz", + "integrity": "sha1-ojR7o2DeGeM9D/1ZD933dVy/LmQ=", + "dev": true + }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -5096,50 +4388,16 @@ "isarray": "1.0.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", "dev": true }, - "istanbul-api": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", - "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", - "dev": true, - "requires": { - "async": "2.6.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", - "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { "babel-generator": "6.26.0", @@ -5151,451 +4409,12 @@ "semver": "5.4.1" } }, - "istanbul-lib-report": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", - "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", - "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", - "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", - "dev": true, - "requires": { - "handlebars": "4.0.11" - } - }, - "jest": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", - "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", - "dev": true, - "requires": { - "jest-cli": "21.2.1" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "jest-cli": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", - "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "is-ci": "1.0.10", - "istanbul-api": "1.2.1", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-source-maps": "1.2.2", - "jest-changed-files": "21.2.0", - "jest-config": "21.2.1", - "jest-environment-jsdom": "21.2.1", - "jest-haste-map": "21.2.0", - "jest-message-util": "21.2.1", - "jest-regex-util": "21.2.0", - "jest-resolve-dependencies": "21.2.0", - "jest-runner": "21.2.1", - "jest-runtime": "21.2.1", - "jest-snapshot": "21.2.1", - "jest-util": "21.2.1", - "micromatch": "2.3.11", - "node-notifier": "5.1.2", - "pify": "3.0.0", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.3.0", - "worker-farm": "1.5.2", - "yargs": "9.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "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" - } - }, - "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" - } - } - } - }, - "jest-changed-files": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", - "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", - "dev": true, - "requires": { - "throat": "4.1.0" - } - }, - "jest-config": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", - "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "glob": "7.1.2", - "jest-environment-jsdom": "21.2.1", - "jest-environment-node": "21.2.1", - "jest-get-type": "21.2.0", - "jest-jasmine2": "21.2.1", - "jest-regex-util": "21.2.0", - "jest-resolve": "21.2.0", - "jest-util": "21.2.1", - "jest-validate": "21.2.1", - "pretty-format": "21.2.1" - } - }, - "jest-diff": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", - "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "diff": "3.4.0", - "jest-get-type": "21.2.0", - "pretty-format": "21.2.1" - } - }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - }, - "jest-environment-jsdom": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", - "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", - "dev": true, - "requires": { - "jest-mock": "21.2.0", - "jest-util": "21.2.1", - "jsdom": "9.12.0" - } - }, - "jest-environment-node": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", - "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", - "dev": true, - "requires": { - "jest-mock": "21.2.0", - "jest-util": "21.2.1" - } - }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", - "dev": true - }, - "jest-haste-map": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", - "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", - "dev": true, - "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "21.2.0", - "micromatch": "2.3.11", - "sane": "2.2.0", - "worker-farm": "1.5.2" - } - }, - "jest-jasmine2": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", - "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "expect": "21.2.1", - "graceful-fs": "4.1.11", - "jest-diff": "21.2.1", - "jest-matcher-utils": "21.2.1", - "jest-message-util": "21.2.1", - "jest-snapshot": "21.2.1", - "p-cancelable": "0.3.0" - } - }, - "jest-matcher-utils": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", - "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "jest-get-type": "21.2.0", - "pretty-format": "21.2.1" - } - }, - "jest-message-util": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", - "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "micromatch": "2.3.11", - "slash": "1.0.0" - } - }, - "jest-mock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", - "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", - "dev": true - }, - "jest-regex-util": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", - "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", - "dev": true - }, - "jest-resolve": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", - "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.3.0", - "is-builtin-module": "1.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", - "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", - "dev": true, - "requires": { - "jest-regex-util": "21.2.0" - } - }, - "jest-runner": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", - "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", - "dev": true, - "requires": { - "jest-config": "21.2.1", - "jest-docblock": "21.2.0", - "jest-haste-map": "21.2.0", - "jest-jasmine2": "21.2.1", - "jest-message-util": "21.2.1", - "jest-runtime": "21.2.1", - "jest-util": "21.2.1", - "pify": "3.0.0", - "throat": "4.1.0", - "worker-farm": "1.5.2" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "jest-runtime": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", - "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-jest": "21.2.0", - "babel-plugin-istanbul": "4.1.5", - "chalk": "2.3.0", - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "jest-config": "21.2.1", - "jest-haste-map": "21.2.0", - "jest-regex-util": "21.2.0", - "jest-resolve": "21.2.0", - "jest-util": "21.2.1", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "9.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "jest-serializer-vue": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-0.3.0.tgz", - "integrity": "sha512-Id1x3XabYu2r6BnmTfGk2tY172BEqR+vAzSvPk4VF8HyVqwebxZQbqiZ/giAtCnRSqi6lzxuyvzQbwQ6bo6Hbg==", - "dev": true, - "requires": { - "pretty": "2.0.0" - } - }, - "jest-snapshot": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", - "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "jest-diff": "21.2.1", - "jest-matcher-utils": "21.2.1", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "21.2.1" - } - }, - "jest-util": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", - "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", - "dev": true, - "requires": { - "callsites": "2.0.0", - "chalk": "2.3.0", - "graceful-fs": "4.1.11", - "jest-message-util": "21.2.1", - "jest-mock": "21.2.0", - "jest-validate": "21.2.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "jest-get-type": "21.2.0", - "leven": "2.1.0", - "pretty-format": "21.2.1" - } - }, "js-base64": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", "dev": true }, - "js-beautify": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.4.tgz", - "integrity": "sha512-6YX1g+lIl0/JDxjFFbgj7fz6i0bWFa2Hdc7PfGqFhynaEiYe1NJ3R1nda0VGaRiGU82OllR+EGDoWFpGr3k5Kg==", - "dev": true, - "requires": { - "config-chain": "1.1.11", - "editorconfig": "0.13.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6" - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5612,48 +4431,6 @@ "esprima": "2.7.3" } }, - "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": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "dev": true, - "requires": { - "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.9.0", - "html-encoding-sniffer": "1.0.2", - "nwmatcher": "1.4.3", - "parse5": "1.5.1", - "request": "2.83.0", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.3", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -5666,31 +4443,16 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "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.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "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=", + "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 }, "json3": { @@ -5705,36 +4467,6 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "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" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, "killable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", @@ -5745,26 +4477,14 @@ "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.6" } }, - "last-call-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", - "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", - "dev": true, - "requires": { - "lodash": "4.17.4", - "webpack-sources": "1.1.0" - } - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { "version": "1.0.0", @@ -5775,12 +4495,6 @@ "invert-kv": "1.0.0" } }, - "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", @@ -5848,213 +4562,61 @@ "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.1.2" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "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.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._arrayeach": "3.0.0", - "lodash._baseassign": "3.2.0", - "lodash._basefor": "3.0.3", - "lodash.isarray": "3.0.4", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._stack": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz", - "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", - "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=", - "dev": true, - "requires": { - "lodash._baseclone": "3.3.0", - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9" + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } } }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, - "lodash.defaultsdeep": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz", - "integrity": "sha1-bBpYbmxWR7DmTi15gUG4g2FYvoo=", + "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": { - "lodash._baseclone": "4.5.7", - "lodash._stack": "4.1.3", - "lodash.isplainobject": "4.0.6", - "lodash.keysin": "4.2.0", - "lodash.mergewith": "4.6.0", - "lodash.rest": "4.0.5" - }, - "dependencies": { - "lodash._baseclone": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", - "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", - "dev": true - } + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.keysin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz", - "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=", + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, "lodash.memoize": { @@ -6063,17 +4625,24 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.mergewith": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", - "dev": true + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } }, - "lodash.rest": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", - "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", - "dev": true + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } }, "lodash.uniq": { "version": "4.5.0", @@ -6081,53 +4650,21 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "loglevel": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", "dev": true }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { "version": "1.3.1", @@ -6148,12 +4685,6 @@ "signal-exit": "3.0.2" } }, - "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.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -6187,15 +4718,6 @@ } } }, - "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.4" - } - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -6281,12 +4803,6 @@ } } }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -6381,8 +4897,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", @@ -6393,97 +4908,10 @@ "minimist": "0.0.8" } }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - }, - "mocha-nightwatch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz", - "integrity": "sha1-kby5s73gV912d8eBJeSR5Y1mZHw=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.5", - "glob": "7.0.5", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.1", @@ -6502,9 +4930,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "natural-compare": { @@ -6513,101 +4941,130 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "ncname": { + "ndarray": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.18.tgz", + "integrity": "sha1-tg06cyJOxVXQ+qeXEeUCRI/T95M=", + "requires": { + "iota-array": "1.0.0", + "is-buffer": "1.1.6" + } + }, + "ndarray-blas-level1": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ndarray-blas-level1/-/ndarray-blas-level1-1.1.3.tgz", + "integrity": "sha1-7BXPrO2BmH1lGgizcf+3u929eYI=" + }, + "ndarray-blas-level2": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ndarray-blas-level2/-/ndarray-blas-level2-1.1.0.tgz", + "integrity": "sha1-s6YUC5oj/qOg+KE6klwpzP6qzkw=", + "requires": { + "ndarray-blas-level1": "1.1.3" + } + }, + "ndarray-concat-rows": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-concat-rows/-/ndarray-concat-rows-1.0.1.tgz", + "integrity": "sha1-1/h3kmXvw6mniLsU4pf6Hh8CF8M=", + "requires": { + "ndarray-ops": "1.2.2", + "ndarray-scratch": "1.2.0", + "util-extend": "1.0.3" + } + }, + "ndarray-fft": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ndarray-fft/-/ndarray-fft-1.0.3.tgz", + "integrity": "sha1-3Fu6GOOrgsmXrbrrt455+CyToio=", + "requires": { + "bit-twiddle": "1.0.2", + "cwise": "1.0.10", + "ndarray": "1.0.18", + "ndarray-ops": "1.2.2", + "typedarray-pool": "1.1.0" + } + }, + "ndarray-gemm": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, + "resolved": "https://registry.npmjs.org/ndarray-gemm/-/ndarray-gemm-1.0.0.tgz", + "integrity": "sha1-POWbMc9eIkPIZfBpQ/e0cUz7se4=" + }, + "ndarray-ops": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", + "integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=", "requires": { - "xml-char-classes": "1.0.0" + "cwise-compiler": "1.1.3" } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "ndarray-resample": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-resample/-/ndarray-resample-1.0.1.tgz", + "integrity": "sha1-Qrsz9qS3OMV/9zxgzCINTPx1gh0=", + "requires": { + "cwise": "1.0.10", + "ndarray-fft": "1.0.3", + "ndarray-ops": "1.2.2", + "ndarray-scratch": "1.2.0" + } }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true + "ndarray-scratch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz", + "integrity": "sha1-YwRjbWLrqT20cnrBPGkzQdulDgE=", + "requires": { + "ndarray": "1.0.18", + "ndarray-ops": "1.2.2", + "typedarray-pool": "1.1.0" + } }, - "nightwatch": { - "version": "0.9.16", - "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.16.tgz", - "integrity": "sha1-xKw+xxGw/wR8PcqcZVc2XuI2UZ8=", - "dev": true, + "ndarray-squeeze": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ndarray-squeeze/-/ndarray-squeeze-1.0.2.tgz", + "integrity": "sha1-diXGnGcMv0YHkuigEd6NBHKU02w=", "requires": { - "chai-nightwatch": "0.1.1", - "ejs": "0.8.3", - "lodash.clone": "3.0.3", - "lodash.defaultsdeep": "4.3.2", - "minimatch": "3.0.3", - "mkpath": "1.0.0", - "mocha-nightwatch": "3.2.2", - "optimist": "0.6.1", - "proxy-agent": "2.0.0", - "q": "1.4.1" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - } + "ndarray": "1.0.18" } }, - "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, + "ndarray-tile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ndarray-tile/-/ndarray-tile-1.0.3.tgz", + "integrity": "sha1-eibjlGz43xieqTXHVnmB7Ma4IPo=", "requires": { - "lower-case": "1.1.4" + "ndarray-ops": "1.2.2", + "ndarray-scratch": "1.2.0" } }, - "node-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.1.1.tgz", - "integrity": "sha1-CFJGRe5AOd7cPcwd18a5eeBhnkQ=", - "dev": true, + "ndarray-unpack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-unpack/-/ndarray-unpack-1.0.0.tgz", + "integrity": "sha1-S1PHZzAKXjkJuLUiWrVcbohtkdw=", "requires": { - "clone": "2.1.1", - "lodash": "4.17.4" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - } + "cwise": "1.0.10", + "dup": "1.0.0" + } + }, + "ndarray-unsqueeze": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ndarray-unsqueeze/-/ndarray-unsqueeze-1.0.3.tgz", + "integrity": "sha1-3DqNoZx7meukGYgDbeX88pPIqwg=", + "requires": { + "ndarray": "1.0.18" } }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, "node-forge": { "version": "0.6.33", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", "dev": true }, - "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", @@ -6639,27 +5096,6 @@ "vm-browserify": "0.0.4" } }, - "node-notifier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", - "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", - "dev": true, - "requires": { - "growly": "1.3.0", - "semver": "5.4.1", - "shellwords": "0.1.1", - "which": "1.3.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.1" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -6708,15 +5144,6 @@ "path-key": "2.0.1" } }, - "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" - } - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -6729,18 +5156,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "nwmatcher": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", - "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", - "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", @@ -6753,11 +5168,15 @@ "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg==", "dev": true }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object.omit": { "version": "2.0.1", @@ -6799,12 +5218,21 @@ "wrappy": "1.0.2" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "onecolor": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.5.tgz", + "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", "dev": true }, + "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.1.0" + } + }, "opener": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", @@ -6838,16 +5266,6 @@ } } }, - "optimize-css-assets-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==", - "dev": true, - "requires": { - "cssnano": "3.10.0", - "last-call-webpack-plugin": "2.1.2" - } - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -6862,73 +5280,6 @@ "wordwrap": "1.0.0" } }, - "ora": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", - "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "2.1.0", - "cli-spinners": "1.1.0", - "log-symbols": "1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "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" - } - }, - "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.1.0" - } - }, - "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.1", - "signal-exit": "3.0.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "original": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", @@ -6979,12 +5330,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -7012,59 +5357,12 @@ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, - "pac-proxy-agent": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", - "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1", - "get-uri": "2.0.1", - "http-proxy-agent": "1.0.0", - "https-proxy-agent": "1.0.0", - "pac-resolver": "2.0.0", - "raw-body": "2.3.2", - "socks-proxy-agent": "2.1.1" - } - }, - "pac-resolver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz", - "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=", - "dev": true, - "requires": { - "co": "3.0.6", - "degenerator": "1.0.4", - "ip": "1.0.1", - "netmask": "1.0.6", - "thunkify": "2.1.2" - }, - "dependencies": { - "co": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", - "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=", - "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 }, - "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.3.2" - } - }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -7099,18 +5397,18 @@ "error-ex": "1.3.1" } }, - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "dev": true - }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, + "path": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", + "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -7177,17 +5475,10 @@ "sha.js": "2.4.9" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", @@ -7210,6 +5501,17 @@ "pinkie": "2.0.4" } }, + "pixrem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pixrem/-/pixrem-4.0.1.tgz", + "integrity": "sha1-LaSh3m7EQjxfw3lOkwuB1EkOxoY=", + "dev": true, + "requires": { + "browserslist": "2.9.1", + "postcss": "6.0.14", + "reduce-css-calc": "1.3.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -7219,10 +5521,20 @@ "find-up": "2.1.0" } }, + "pleeease-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-4.0.0.tgz", + "integrity": "sha1-ZjKy+wVkjSdY2GU4T7zteeHMrsc=", + "dev": true, + "requires": { + "onecolor": "3.0.5", + "postcss": "6.0.14" + } + }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "portfinder": { @@ -7241,6 +5553,15 @@ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true + }, + "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" + } } } }, @@ -7255,6 +5576,35 @@ "supports-color": "4.5.0" } }, + "postcss-apply": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/postcss-apply/-/postcss-apply-0.8.0.tgz", + "integrity": "sha1-FOVEu7XLbxweBIhXll15rgZrE0M=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "balanced-match": "0.4.2", + "postcss": "6.0.14" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-2.0.0.tgz", + "integrity": "sha1-lNxCLI+QmX8WvTOjZUu77AhJY7Q=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-selector-parser": "2.2.3" + } + }, "postcss-calc": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", @@ -7328,6 +5678,161 @@ } } }, + "postcss-color-function": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-4.0.1.tgz", + "integrity": "sha1-QCs/LOvD9pR+YY+2vjZU++zvZEQ=", + "dev": true, + "requires": { + "css-color-function": "1.3.3", + "postcss": "6.0.14", + "postcss-message-helpers": "2.0.0", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-color-gray": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-4.0.0.tgz", + "integrity": "sha1-aBvzBQl91mv+8OHmKC1dmbWsyV0=", + "dev": true, + "requires": { + "color": "1.0.3", + "postcss": "6.0.14", + "postcss-message-helpers": "2.0.0", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz", + "integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=", + "dev": true, + "requires": { + "color-convert": "1.9.1", + "color-string": "1.5.2" + } + }, + "color-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", + "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", + "dev": true, + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + } + } + }, + "postcss-color-hex-alpha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz", + "integrity": "sha1-HlPmyKyyN5Vej9CLfs2xuLgwn5U=", + "dev": true, + "requires": { + "color": "1.0.3", + "postcss": "6.0.14", + "postcss-message-helpers": "2.0.0" + }, + "dependencies": { + "color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz", + "integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=", + "dev": true, + "requires": { + "color-convert": "1.9.1", + "color-string": "1.5.2" + } + }, + "color-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", + "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", + "dev": true, + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + } + } + }, + "postcss-color-hsl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hsl/-/postcss-color-hsl-2.0.0.tgz", + "integrity": "sha1-EnA2ZvoxBDDj8wpFTawThjF9WEQ=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0", + "units-css": "0.4.0" + } + }, + "postcss-color-hwb": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hwb/-/postcss-color-hwb-3.0.0.tgz", + "integrity": "sha1-NAKxnvTYSXVAwftQcr6YY8qVVx4=", + "dev": true, + "requires": { + "color": "1.0.3", + "postcss": "6.0.14", + "postcss-message-helpers": "2.0.0", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz", + "integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=", + "dev": true, + "requires": { + "color-convert": "1.9.1", + "color-string": "1.5.2" + } + }, + "color-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", + "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", + "dev": true, + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + } + } + }, + "postcss-color-rebeccapurple": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-3.0.0.tgz", + "integrity": "sha1-7rrwPTY7QwC5Z5K9MIHBntZlE9M=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-color-rgb": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rgb/-/postcss-color-rgb-2.0.0.tgz", + "integrity": "sha1-FFOcinExSUtILg3RzCZf9lFLUmM=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-color-rgba-fallback": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-3.0.0.tgz", + "integrity": "sha1-N9XJNToHoJJwkSqCYGu0Kg1wLAQ=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0", + "rgb-hex": "2.1.0" + } + }, "postcss-colormin": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", @@ -7456,23 +5961,127 @@ "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-cssnext": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-cssnext/-/postcss-cssnext-3.0.2.tgz", + "integrity": "sha512-jA6kGdcUMZqLUgw6MdpyNWGFhk0LIITVhC/jTnLRZLoXSTR88qT2cFOn3LbY06udt1PVdTCHDG3plBjxVKf8BQ==", + "dev": true, + "requires": { + "autoprefixer": "7.1.6", + "caniuse-api": "2.0.0", + "chalk": "2.3.0", + "pixrem": "4.0.1", + "pleeease-filters": "4.0.0", + "postcss": "6.0.14", + "postcss-apply": "0.8.0", + "postcss-attribute-case-insensitive": "2.0.0", + "postcss-calc": "6.0.1", + "postcss-color-function": "4.0.1", + "postcss-color-gray": "4.0.0", + "postcss-color-hex-alpha": "3.0.0", + "postcss-color-hsl": "2.0.0", + "postcss-color-hwb": "3.0.0", + "postcss-color-rebeccapurple": "3.0.0", + "postcss-color-rgb": "2.0.0", + "postcss-color-rgba-fallback": "3.0.0", + "postcss-custom-media": "6.0.0", + "postcss-custom-properties": "6.2.0", + "postcss-custom-selectors": "4.0.1", + "postcss-font-family-system-ui": "2.1.1", + "postcss-font-variant": "3.0.0", + "postcss-image-set-polyfill": "0.3.5", + "postcss-initial": "2.0.0", + "postcss-media-minmax": "3.0.0", + "postcss-nesting": "4.2.1", + "postcss-pseudo-class-any-link": "4.0.0", + "postcss-pseudoelements": "5.0.0", + "postcss-replace-overflow-wrap": "2.0.0", + "postcss-selector-matches": "3.0.1", + "postcss-selector-not": "3.0.1" + }, + "dependencies": { + "caniuse-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-2.0.0.tgz", + "integrity": "sha1-sd21pZZrFvSNxJmERNS7xsfZ2DQ=", + "dev": true, + "requires": { + "browserslist": "2.9.1", + "caniuse-lite": "1.0.30000777", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + } + }, + "postcss-calc": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-6.0.1.tgz", + "integrity": "sha1-PSQXG79udinUIqQ26/5t2VEfQzA=", + "dev": true, + "requires": { + "css-unit-converter": "1.1.1", + "postcss": "6.0.14", + "postcss-selector-parser": "2.2.3", + "reduce-css-calc": "2.1.3" + } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "reduce-css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.3.tgz", + "integrity": "sha1-Y8TGMl/7v06mwj8dTetHw5U/O4E=", "dev": true, "requires": { - "has-flag": "1.0.0" + "css-unit-converter": "1.1.1", + "postcss-value-parser": "3.3.0" } } } }, + "postcss-custom-media": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz", + "integrity": "sha1-vlMnhBEOyylQRPtTlaGABushpzc=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "postcss-custom-properties": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.2.0.tgz", + "integrity": "sha512-eNR2h9T9ciKMoQEORrPjH33XeN/nuvVuxArOKmHtsFbGbNss631tgTrKou3/pmjAZbA4QQkhLIkPQkIk3WW+8w==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "postcss": "6.0.14" + } + }, + "postcss-custom-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-4.0.1.tgz", + "integrity": "sha1-eBOC+UxS5yfvXKR3bqKt9JphE4I=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-selector-matches": "3.0.1" + } + }, "postcss-discard-comments": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", @@ -7901,6 +6510,37 @@ } } }, + "postcss-font-family-system-ui": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-2.1.1.tgz", + "integrity": "sha512-AOAn553wVmMDx2nph0axVDXJwhsd9x4MjKHRH9SOXL4YdiqsYFxyTVTWnlka9iNB70Pb3Idxmj79bIXxq38b/w==", + "dev": true, + "requires": { + "@std/esm": "0.16.0", + "lodash": "4.17.4", + "postcss": "6.0.14", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-font-variant": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-3.0.0.tgz", + "integrity": "sha1-CMzIj2BQuoLtjvLMdsDGprQfGD4=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "postcss-image-set-polyfill": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/postcss-image-set-polyfill/-/postcss-image-set-polyfill-0.3.5.tgz", + "integrity": "sha1-Dxk0E3AM8fgr05Bm7wFtZaShgYE=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-media-query-parser": "0.2.3" + } + }, "postcss-import": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", @@ -7913,6 +6553,16 @@ "resolve": "1.5.0" } }, + "postcss-initial": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-2.0.0.tgz", + "integrity": "sha1-cnFfczbgu3k1HZnuZcSiU6hEG6Q=", + "dev": true, + "requires": { + "lodash.template": "4.4.0", + "postcss": "6.0.14" + } + }, "postcss-load-config": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", @@ -7957,6 +6607,21 @@ "schema-utils": "0.3.0" } }, + "postcss-media-minmax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-3.0.0.tgz", + "integrity": "sha1-Z1JWA3pD70C8Twdgv9BtTcadSNI=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, "postcss-merge-idents": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", @@ -8524,6 +7189,15 @@ "postcss": "6.0.14" } }, + "postcss-nesting": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-4.2.1.tgz", + "integrity": "sha512-IkyWXICwagCnlaviRexi7qOdwPw3+xVVjgFfGsxmztvRVaNxAlrypOIKqDE5mxY+BVxnId1rnUKBRQoNE2VDaA==", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, "postcss-normalize-charset": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", @@ -8741,6 +7415,25 @@ } } }, + "postcss-pseudo-class-any-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz", + "integrity": "sha1-kVKgYT00UHIFE+iJKFS65C0O5o4=", + "dev": true, + "requires": { + "postcss": "6.0.14", + "postcss-selector-parser": "2.2.3" + } + }, + "postcss-pseudoelements": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudoelements/-/postcss-pseudoelements-5.0.0.tgz", + "integrity": "sha1-7vGU6NUkZFylIKlJ6V5RjoEkAss=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, "postcss-reduce-idents": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", @@ -8957,6 +7650,51 @@ } } }, + "postcss-replace-overflow-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz", + "integrity": "sha1-eU22+qVPjbEAhUOSqTr0V2i04ls=", + "dev": true, + "requires": { + "postcss": "6.0.14" + } + }, + "postcss-selector-matches": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-3.0.1.tgz", + "integrity": "sha1-5WNAEeE5UIgYYbvdWMLQER/8lqs=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "postcss": "6.0.14" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "postcss-selector-not": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-3.0.1.tgz", + "integrity": "sha1-Lk2y8JZTNsAefOx9tsYN/3ZzNdk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "postcss": "6.0.14" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, "postcss-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", @@ -9218,45 +7956,6 @@ "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", "dev": true }, - "pretty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", - "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", - "dev": true, - "requires": { - "condense-newlines": "0.2.1", - "extend-shallow": "2.0.1", - "js-beautify": "1.7.4" - } - }, - "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.0" - } - }, - "pretty-format": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", - "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.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 - } - } - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -9272,20 +7971,33 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "protobufjs": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.3.tgz", + "integrity": "sha512-/iQhTYnSniRNmdRF9Kvw8odMSokwNOWVDOmMJjW64+EVE6igcdj/82Op/4MJ/WimgMRNac7gChlSVX4Gep/tHg==", + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.0.54", + "long": "3.2.0" + } }, "proxy-addr": { "version": "2.0.2", @@ -9297,30 +8009,6 @@ "ipaddr.js": "1.5.2" } }, - "proxy-agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz", - "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1", - "http-proxy-agent": "1.0.0", - "https-proxy-agent": "1.0.0", - "lru-cache": "2.6.5", - "pac-proxy-agent": "1.1.0", - "socks-proxy-agent": "2.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", - "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=", - "dev": true - } - } - }, "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", @@ -9392,6 +8080,15 @@ "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", "dev": true }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", + "requires": { + "minimist": "0.0.8", + "through2": "0.4.2" + } + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -9525,7 +8222,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -9548,26 +8244,6 @@ "set-immediate-shim": "1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.5.0" - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -9623,8 +8299,7 @@ "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" }, "regenerator-transform": { "version": "0.10.1", @@ -9654,119 +8329,38 @@ "requires": { "regenerate": "1.3.3", "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "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.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.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.3.0" - } - }, - "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.3.0" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" - } - }, - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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=", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "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 + }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", @@ -9776,8 +8370,7 @@ "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 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -9788,36 +8381,6 @@ "is-finite": "1.0.2" } }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "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", - "hawk": "6.0.2", - "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", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9885,20 +8448,31 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "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": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, + "rgb": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/rgb/-/rgb-0.1.0.tgz", + "integrity": "sha1-vieykej+/+rBvZlylyG/pA/AN7U=", + "dev": true + }, + "rgb-hex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-2.1.0.tgz", + "integrity": "sha1-x3PF/iJoolV42SU5qCp6XOU77aY=", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, "requires": { "align-text": "0.1.4" } @@ -9923,49 +8497,34 @@ } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "1.4.0" + "is-promise": "2.1.0" } }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, - "sane": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz", - "integrity": "sha512-OSJxhHO0CgPUw3lUm3GhfREAfza45smvEI9ozuFrxKG10GHVo0ryW9FK5VYlLvxj0SV7HVKHW0voYJIRu27GWg==", + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "anymatch": "1.3.2", - "exec-sh": "0.2.1", - "fb-watchman": "2.0.0", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.18.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "rx-lite": "4.0.8" } }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -9987,12 +8546,6 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selenium-server": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.7.1.tgz", - "integrity": "sha512-yoJ32HBfAspt1PXpzVUBIaxuWcoLMv2Gmz2ZdrmsM1cfZH9pGHZ5jF4nEtrjLPN9wbcx9z/6q6aWBabJTrzlow==", - "dev": true - }, "selfsigned": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", @@ -10029,17 +8582,20 @@ "statuses": "1.3.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" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true } } }, @@ -10056,6 +8612,17 @@ "http-errors": "1.6.2", "mime-types": "2.1.17", "parseurl": "1.3.2" + }, + "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" + } + } } }, "serve-static": { @@ -10089,9 +8656,9 @@ "dev": true }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { @@ -10104,6 +8671,11 @@ "safe-buffer": "5.1.1" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -10119,35 +8691,29 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "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 }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.1.tgz", + "integrity": "sha1-wt/DhquqDD4zxI2z/ocFnmkGXv0=", + "dev": true + } + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -10155,24 +8721,20 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "hoek": "4.2.0" + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "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 + } } }, "sockjs": { @@ -10183,14 +8745,6 @@ "requires": { "faye-websocket": "0.10.0", "uuid": "2.0.3" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } } }, "sockjs-client": { @@ -10207,6 +8761,15 @@ "url-parse": "1.2.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" + } + }, "faye-websocket": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", @@ -10218,35 +8781,6 @@ } } }, - "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - } - } - }, - "socks-proxy-agent": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", - "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "extend": "3.0.1", - "socks": "1.1.10" - } - }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -10265,8 +8799,7 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.4.18", @@ -10318,6 +8851,17 @@ "safe-buffer": "5.1.1", "select-hose": "2.0.0", "spdy-transport": "2.0.20" + }, + "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" + } + } } }, "spdy-transport": { @@ -10333,6 +8877,17 @@ "readable-stream": "2.3.3", "safe-buffer": "5.1.1", "wbuf": "1.7.2" + }, + "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" + } + } } }, "sprintf-js": { @@ -10341,32 +8896,116 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "escodegen": "0.0.28" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "requires": { + "esprima": "1.0.4", + "estraverse": "1.3.2", + "source-map": "0.6.1" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + } } }, - "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", - "dev": true + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", + "requires": { + "concat-stream": "1.6.0", + "duplexer2": "0.0.2", + "escodegen": "1.3.3", + "falafel": "2.1.0", + "has": "1.0.1", + "object-inspect": "0.4.0", + "quote-stream": "0.0.0", + "readable-stream": "1.0.34", + "shallow-copy": "0.0.1", + "static-eval": "0.2.4", + "through2": "0.4.2" + }, + "dependencies": { + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true }, "stream-browserify": { @@ -10398,15 +9037,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true, - "requires": { - "strip-ansi": "3.0.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -10422,17 +9052,10 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10472,6 +9095,16 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "style-loader": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", + "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + } + }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -10481,12 +9114,6 @@ "has-flag": "2.0.0" } }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, "svgo": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", @@ -10502,61 +9129,26 @@ "whet.extend": "0.9.9" } }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", + "ajv": "5.5.0", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", "lodash": "4.17.4", - "slice-ansi": "0.0.4", + "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "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": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, "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", @@ -10571,24 +9163,16 @@ "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" - }, - "dependencies": { - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "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" + } } } }, @@ -10617,23 +9201,56 @@ "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 }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + } + } }, "thunky": { "version": "0.1.0", @@ -10656,11 +9273,14 @@ "setimmediate": "1.0.5" } }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true + "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" + } }, "to-arraybuffer": { "version": "1.0.1", @@ -10674,27 +9294,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "toposort": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", - "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -10713,48 +9312,12 @@ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "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.1.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", @@ -10764,12 +9327,6 @@ "prelude-ls": "1.1.2" } }, - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -10783,24 +9340,21 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "uglify-js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.0.tgz", - "integrity": "sha512-L98DlTshoPGnZGF8pr3MoE+CCo6n9joktHNHMPkckeBV8xTVc4CWtC0kGGhQsIvnX2Ug4nXFTAeE7SpTrPX2tg==", - "dev": true, + "typedarray-pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.1.0.tgz", + "integrity": "sha1-0RT0hIAUifU+yrXoCIqiMET0mNk=", "requires": { - "commander": "2.12.2", - "source-map": "0.6.1" + "bit-twiddle": "1.0.2", + "dup": "1.0.0" } }, "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, "optional": true }, "uglifyjs-webpack-plugin": { @@ -10845,17 +9399,27 @@ } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "union": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/union/-/union-0.4.6.tgz", + "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", + "dev": true, + "requires": { + "qs": "2.3.3" + }, + "dependencies": { + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", + "dev": true + } + } }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "uniqid": { "version": "4.1.1", @@ -10872,18 +9436,22 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "units-css": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/units-css/-/units-css-0.4.0.tgz", + "integrity": "sha1-1iKGU6UZg9fBb/KPi53Dsf/tOgc=", + "dev": true, + "requires": { + "isnumeric": "0.2.0", + "viewport-dimensions": "0.2.0" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "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 - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -10902,14 +9470,29 @@ } } }, + "url-join": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.2.tgz", + "integrity": "sha1-wHJ1aWetJLi1nldBVRyqx49QuLc=", + "dev": true + }, "url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "dev": true, "requires": { "loader-utils": "1.1.0", - "mime": "1.3.6" + "mime": "1.6.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } } }, "url-parse": { @@ -10930,15 +9513,6 @@ } } }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -10959,14 +9533,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true + "util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" }, "utils-merge": { "version": "1.0.1", @@ -10975,9 +9547,9 @@ "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", "dev": true }, "validate-npm-package-license": { @@ -11002,16 +9574,11 @@ "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", "dev": true }, - "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.3.0" - } + "viewport-dimensions": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz", + "integrity": "sha1-3nQHR9tTh/0XJfUXXpG6x2r982w=", + "dev": true }, "vm-browserify": { "version": "0.0.4", @@ -11025,7 +9592,8 @@ "vue": { "version": "2.5.9", "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.9.tgz", - "integrity": "sha512-9B9XBpCtj8y5eJFrspIcKxIWt+lG9FMdF8qgyOlUeOIvcS4xSAvcARygbzHA6Pi0KWFj4BvxjtWbuPVWRx/wuA==" + "integrity": "sha512-9B9XBpCtj8y5eJFrspIcKxIWt+lG9FMdF8qgyOlUeOIvcS4xSAvcARygbzHA6Pi0KWFj4BvxjtWbuPVWRx/wuA==", + "dev": true }, "vue-hot-reload-api": { "version": "2.2.4", @@ -11033,33 +9601,6 @@ "integrity": "sha512-e+ThJMYmZg4D9UnrLcr6LQxGu6YlcxkrmZGPCyIN4malcNhdeGGKxmFuM5y6ICMJJxQywLfT8MM1rYZr4LpeLw==", "dev": true }, - "vue-jest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-1.2.0.tgz", - "integrity": "sha512-5uFOKROZIg3meZXbmmh/XnpVdrdqHEAYUFvJbUxcBoLRD9Y21eXmUEP4VTQ9qeGZ4Bb56ExWqisUPVRpVqgRUg==", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-preset-vue-app": "1.3.2", - "chalk": "2.3.0", - "convert-source-map": "1.5.1", - "find-babel-config": "1.1.0", - "js-beautify": "1.7.4", - "node-cache": "4.1.1", - "object-assign": "4.1.1", - "source-map": "0.5.7", - "tsconfig": "7.0.0", - "vue-template-es2015-compiler": "1.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "vue-loader": { "version": "13.5.0", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.5.0.tgz", @@ -11084,7 +9625,8 @@ "vue-router": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", - "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" + "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==", + "dev": true }, "vue-style-loader": { "version": "3.0.3", @@ -11112,32 +9654,11 @@ "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", "dev": true }, - "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.11" - } - }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "0.2.1", - "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 - } - } + "vuetify": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-0.17.3.tgz", + "integrity": "sha512-oaq5KQsQNxYn559vBmbQmROX/yHEUcrQHkpNfmLlAhTJmRdrB6ky2CZbvQ6YC/kRrZ5Past3Nddd5oBVViEkhA==", + "dev": true }, "watchpack": { "version": "1.4.0", @@ -11159,12 +9680,6 @@ "minimalistic-assert": "1.0.0" } }, - "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": "3.9.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.9.1.tgz", @@ -11320,76 +9835,24 @@ }, "yargs": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.1.tgz", - "integrity": "sha512-a+UcvlsXvCmclNgfThT8PVyuJKd029By7CxkYEbNNCfs0Lqj9gagjkdv3S3MBvCIKBaUGYs8l4UpiVI0bFoh2Q==", - "dev": true, - "requires": { - "acorn": "5.2.1", - "chalk": "1.1.3", - "commander": "2.12.2", - "ejs": "2.5.7", - "express": "4.16.2", - "filesize": "3.5.11", - "gzip-size": "3.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "opener": "1.4.3", - "ws": "3.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" } - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, @@ -11447,94 +9910,16 @@ "supports-color": "4.5.0", "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } } }, - "webpack-merge": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "webpack-glsl-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", + "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", "dev": true, "requires": { - "lodash": "4.17.4" + "fs": "0.0.2", + "path": "0.11.14" } }, "webpack-sources": { @@ -11563,33 +9948,6 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.19" - } - }, - "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", - "dev": true, - "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - } - } - }, "whet.extend": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", @@ -11614,8 +9972,7 @@ "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "wordwrap": { "version": "1.0.0", @@ -11623,16 +9980,6 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "worker-farm": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", - "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", - "dev": true, - "requires": { - "errno": "0.1.4", - "xtend": "4.0.1" - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -11658,46 +10005,6 @@ "mkdirp": "0.5.1" } }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "ws": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.2.tgz", - "integrity": "sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ==", - "dev": true, - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" - } - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -11717,36 +10024,30 @@ "dev": true }, "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { - "camelcase": "4.1.0", + "camelcase": "3.0.0", "cliui": "3.2.0", "decamelize": "1.2.0", "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "yargs-parser": "4.2.1" }, "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 - }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, "cliui": { @@ -11758,95 +10059,31 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" - }, - "dependencies": { - "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" } }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "lcid": "1.0.0" } }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "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 - }, - "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" - } - } + "camelcase": "3.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 } } }, @@ -11866,15 +10103,6 @@ "dev": true } } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "1.0.1" - } } } } diff --git a/myproj/package.json b/myproj/package.json index 6686c0140a..a46b15d3f7 100644 --- a/myproj/package.json +++ b/myproj/package.json @@ -5,7 +5,7 @@ "author": "Bruce Lao", "private": true, "scripts": { - "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "dev": "webpack-dev-server --inline --progress --config webpack.config.js", "start": "npm run dev", "unit": "jest --config test/unit/jest.conf.js --coverage", "e2e": "node test/e2e/runner.js", @@ -14,11 +14,25 @@ "build": "node build/build.js" }, "dependencies": { - "vue": "^2.5.2", - "vue-router": "^3.0.1" + "@babel/polyfill": "7.0.0-beta.32", + "axios": "^0.17.1", + "bluebird": "^3.5.1", + "cwise": "^1.0.10", + "lodash": "^4.17.4", + "ndarray": "^1.0.18", + "ndarray-blas-level2": "^1.1.0", + "ndarray-concat-rows": "^1.0.1", + "ndarray-gemm": "^1.0.0", + "ndarray-ops": "^1.2.2", + "ndarray-resample": "^1.0.1", + "ndarray-squeeze": "^1.0.2", + "ndarray-tile": "^1.0.3", + "ndarray-unpack": "^1.0.0", + "ndarray-unsqueeze": "^1.0.3", + "performance-now": "^2.1.0", + "protobufjs": "^6.8.1" }, "devDependencies": { - "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-eslint": "^7.1.1", "babel-jest": "^21.0.2", @@ -29,47 +43,33 @@ "babel-preset-env": "^1.3.2", "babel-preset-stage-2": "^6.22.0", "babel-register": "^6.22.0", - "chalk": "^2.0.1", - "chromedriver": "^2.27.2", - "copy-webpack-plugin": "^4.0.1", - "cross-spawn": "^5.0.1", - "css-loader": "^0.28.0", - "eslint": "^3.19.0", + "blueimp-load-image": "^2.17.1", + "chroma-js": "^1.3.4", + "css-loader": "^0.28.7", + "eslint": "^4.12.0", "eslint-config-standard": "^10.2.1", "eslint-friendly-formatter": "^3.0.0", - "eslint-loader": "^1.7.1", - "eslint-plugin-html": "^3.0.0", + "eslint-loader": "^1.9.0", + "eslint-plugin-html": "^4.0.1", "eslint-plugin-import": "^2.7.0", "eslint-plugin-node": "^5.2.0", "eslint-plugin-promise": "^3.4.0", "eslint-plugin-standard": "^3.0.1", - "eventsource-polyfill": "^0.9.6", - "extract-text-webpack-plugin": "^3.0.0", - "file-loader": "^1.1.4", - "friendly-errors-webpack-plugin": "^1.6.1", - "html-webpack-plugin": "^2.30.1", - "jest": "^21.2.0", - "jest-serializer-vue": "^0.3.0", - "nightwatch": "^0.9.12", - "node-notifier": "^5.1.2", - "optimize-css-assets-webpack-plugin": "^3.2.0", - "ora": "^1.2.0", - "portfinder": "^1.0.13", + "extract-text-webpack-plugin": "^3.0.2", + "http-server": "^0.10.0", + "postcss-cssnext": "^3.0.2", "postcss-import": "^11.0.0", - "postcss-loader": "^2.0.8", - "rimraf": "^2.6.0", - "selenium-server": "^3.0.1", - "semver": "^5.3.0", - "shelljs": "^0.7.6", - "url-loader": "^0.5.8", - "vue-jest": "^1.0.2", - "vue-loader": "^13.3.0", - "vue-style-loader": "^3.0.1", - "vue-template-compiler": "^2.5.2", - "webpack": "^3.6.0", - "webpack-bundle-analyzer": "^2.9.0", + "postcss-loader": "^2.0.9", + "style-loader": "^0.19.0", + "url-loader": "^0.6.2", + "vue": "^2.5.9", + "vue-loader": "^13.5.0", + "vue-router": "^3.0.1", + "vue-template-compiler": "^2.5.9", + "vuetify": "^0.17.3", + "webpack": "^3.8.1", "webpack-dev-server": "^2.9.5", - "webpack-merge": "^4.1.0" + "webpack-glsl-loader": "^1.0.1" }, "engines": { "node": ">= 4.0.0", diff --git a/myproj/postcss.config.js b/myproj/postcss.config.js new file mode 100644 index 0000000000..f2c68821a9 --- /dev/null +++ b/myproj/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('postcss-import')(), require('postcss-cssnext')()] +} diff --git a/myproj/src/App.vue b/myproj/src/App.vue deleted file mode 100644 index 35f32805fe..0000000000 --- a/myproj/src/App.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/myproj/src/App2.vue b/myproj/src/App2.vue new file mode 100644 index 0000000000..1dc32e4794 --- /dev/null +++ b/myproj/src/App2.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/myproj/src/assets/logo-V.png b/myproj/src/assets/logo-V.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 + + + + + + + + + + + + + diff --git a/myproj/src/components/Home.vue b/myproj/src/components/Home.vue index d3a3d7f810..c33194a6c9 100644 --- a/myproj/src/components/Home.vue +++ b/myproj/src/components/Home.vue @@ -1,6 +1,6 @@

Mi~hPOV+x#EVsJzbhy^wu7M08yqq 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�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 Ok-e>SE8~X#SN^Yh;QNJ3+lI&m@vfq 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 +