From 3a125edbb5effc9f56430ccfcc89fd1b101a8375 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:08:07 +0100 Subject: [PATCH 1/9] Use webpack instead of Grunt --- .babelrc | 3 + .gitignore | 1 + .webpack/webpack.config.common.js | 20 + .webpack/webpack.config.dev.js | 7 + .webpack/webpack.config.prod.js | 6 + Gruntfile.js | 32 - assets/gaussholder.js | 2 + assets/gaussholder.min.js | 1 - package-lock.json | 3084 ++++++++++++++++++++++++----- package.json | 14 +- 10 files changed, 2621 insertions(+), 549 deletions(-) create mode 100644 .babelrc create mode 100644 .webpack/webpack.config.common.js create mode 100644 .webpack/webpack.config.dev.js create mode 100644 .webpack/webpack.config.prod.js delete mode 100644 Gruntfile.js delete mode 100644 assets/gaussholder.min.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..1320b9a --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/.gitignore b/.gitignore index 24742b4..8cf7790 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ # Composer /vendor /node_modules +/dist diff --git a/.webpack/webpack.config.common.js b/.webpack/webpack.config.common.js new file mode 100644 index 0000000..fedb29d --- /dev/null +++ b/.webpack/webpack.config.common.js @@ -0,0 +1,20 @@ +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); + +module.exports = { + entry: [ './assets/gaussholder.js' ], + output: { + filename: 'gaussholder.min.js', + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules)/, + loader: 'babel-loader', + }, + ], + }, + plugins: [ + new CleanWebpackPlugin(), + ], +}; diff --git a/.webpack/webpack.config.dev.js b/.webpack/webpack.config.dev.js new file mode 100644 index 0000000..b717089 --- /dev/null +++ b/.webpack/webpack.config.dev.js @@ -0,0 +1,7 @@ +const common = require( './webpack.config.common' ); + +module.exports = { + ...common, + mode: 'development', + devtool: 'cheap-module-source-map', +}; diff --git a/.webpack/webpack.config.prod.js b/.webpack/webpack.config.prod.js new file mode 100644 index 0000000..22c5103 --- /dev/null +++ b/.webpack/webpack.config.prod.js @@ -0,0 +1,6 @@ +const common = require( './webpack.config.common' ); + +module.exports = { + ...common, + mode: 'production', +}; diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 56ce399..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = function(grunt) { - - // Project configuration. - grunt.initConfig({ - // pkg: grunt.file.readJSON('package.json'), - uglify: { - options: { - compress: { - dead_code: true, - sequences: true, - }, - // beautify: true, - // mangleProperties: true, - // mangle: { - // except: ['Gaussholder'], - // }, - // wrap: 'G' - }, - build: { - src: [ 'assets/stackblur.js', 'assets/gaussholder.js' ], - dest: 'assets/gaussholder.min.js' - } - } - }); - - // Load the plugin that provides the "uglify" task. - grunt.loadNpmTasks('grunt-contrib-uglify'); - - // Default task(s). - grunt.registerTask('default', ['uglify']); - -}; \ No newline at end of file diff --git a/assets/gaussholder.js b/assets/gaussholder.js index 3cad36c..6bfdd2f 100644 --- a/assets/gaussholder.js +++ b/assets/gaussholder.js @@ -1,3 +1,5 @@ +import './stackblur'; + window.Gaussholder = (function (header) { // Fade duration in ms when the image loads in. var fadeDuration = 800; diff --git a/assets/gaussholder.min.js b/assets/gaussholder.min.js deleted file mode 100644 index c24b542..0000000 --- a/assets/gaussholder.min.js +++ /dev/null @@ -1 +0,0 @@ -var StackBlur=function(){function a(a,b,c,d,e){if("string"==typeof a)var a=document.getElementById(a);else if(!a instanceof HTMLCanvasElement)return;var f,g=a.getContext("2d");try{f=g.getImageData(b,c,d,e)}catch(a){throw new Error("unable to access image data: "+a)}return f}function b(b,d,e,f,g,h){if(!(isNaN(h)||h<1)){h|=0;var i=a(b,d,e,f,g);i=c(i,d,e,f,g,h),b.getContext("2d").putImageData(i,d,e)}}function c(a,b,c,g,h,i){var j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D=a.data,E=i+i+1,F=g-1,G=h-1,H=i+1,I=H*(H+1)/2,J=new d,K=J;for(l=1;l>P,D[o+1]=r*O>>P,D[o+2]=s*O>>P,q-=t,r-=u,s-=v,t-=M.r,u-=M.g,v-=M.b,m=p+((m=j+i+1)>P,D[m+1]=r*O>>P,D[m+2]=s*O>>P,q-=t,r-=u,s-=v,t-=M.r,u-=M.g,v-=M.b,m=j+((m=k+H)>8&255,h[a.height_offset+1]=255&f,h[a.length_offset]=e>>8&255,h[a.length_offset+1]=255&e,c(h)},e=function(b,c,e,f){var g=b.getContext("2d"),h=parseInt(e[0]),i=parseInt(e[1]),j=parseInt(e[2]);g.mozImageSmoothingEnabled=!1,g.webkitImageSmoothingEnabled=!1,g.msImageSmoothingEnabled=!1,g.imageSmoothingEnabled=!1;var k=new Image;k.src="data:image/jpg;base64,"+d(a,c),k.onload=function(){b.width=h,b.height=i,g.drawImage(k,0,0,h,i),StackBlur.canvasRGB(b,0,0,h,i,j),f()}},f=function(a){if("gaussholder"in a.dataset){var b=document.createElement("canvas"),c=a.dataset.gaussholderSize.split(",");a.style.width=c[0]+"px",a.style.height=c[1]+"px";var d=[c[0],c[1]];a.widthb)return a.style[c]="",a.style.clipPath="",void(a.style.webkitClipPath="");var i=d*(1-h/b);a.style[c]="blur("+.5*i+"px)",window.requestAnimationFrame(g)};window.requestAnimationFrame(g)}}},h=[],i=1200,j=0,k=null,l=function(){var a=Date.now();if(j+40>a){if(k)return;return void(k=window.setTimeout(l,40))}j=a,k&&(k=null);for(var b=[],c=h.length-1;c>=0;c--){var d=h[c],e=d.getBoundingClientRect().top<=window.innerHeight+i;e?g(d):b.push(d)}h=b,h.length<1&&window.removeEventListener("scroll",l)},m=function(){for(var a=document.getElementsByTagName("img"),b=a.length-1;b>=0;b--){var c=a[b];c.complete?f(c):c.onload=function(){f(this)}}h=a,l(),h.length>0&&window.addEventListener("scroll",l)};return m}(window.GaussholderHeader); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fc39ddd..a1521d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,54 +4,1724 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz", + "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==", + "dev": true + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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 + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", + "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/eslint": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.5.tgz", + "integrity": "sha512-Dc6ar9x16BdaR3NSxSF7T4IjL9gxxViJq8RmFd+2UAyA+K6ck2W+gUwfgpG/y9TPyUuBL35109bbULpEynvltA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "14.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz", + "integrity": "sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/webpack": { + "version": "4.41.25", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", + "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "@types/webpack-sources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", + "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "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 + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "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.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "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.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "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-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "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-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.22.0", + "babel-template": "^6.24.1" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "babel-loader": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.1.tgz", + "integrity": "sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "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.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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": { - "sprintf-js": "~1.0.2" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "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-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.6" + } } } }, - "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 + "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.4.0", + "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.8", + "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" + } }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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": { @@ -60,6 +1730,12 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -70,22 +1746,41 @@ "concat-map": "0.0.1" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "browserslist": { + "version": "4.14.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", + "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001157", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.591", + "escalade": "^3.1.1", + "node-releases": "^1.1.66" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "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=", + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001158", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001158.tgz", + "integrity": "sha512-s5loVYY+yKpuVA3HyW8BarzrtJvwHReuzugQXlv1iR3LKSReoFXRm86mT6hT7PEF5RxW+XQZg+6nYjlywYzQ+g==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -97,11 +1792,24 @@ "supports-color": "^5.3.0" } }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } }, "color-convert": { "version": "1.9.3", @@ -118,10 +1826,10 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, "commander": { @@ -130,137 +1838,241 @@ "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "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 }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-compat": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.7.0.tgz", + "integrity": "sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg==", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "browserslist": "^4.14.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "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" + } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "object-keys": "^1.0.12" } }, - "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 + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "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.0" + } }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "electron-to-chromium": { + "version": "1.3.597", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.597.tgz", + "integrity": "sha512-VJI21MucKaqyFw0oe3j9BIg+nDF4MHzUZAmUwZzrxho+s8zPCD13Fds07Rgu+MTtAadO4tYTKFdAUksKYUyIJw==", "dev": true }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "enhanced-resolve": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", + "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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 + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "glob": "~5.0.0" + "estraverse": "^5.2.0" }, "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "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=", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } }, "glob": { "version": "7.0.6", @@ -276,119 +2088,44 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", - "dev": true, - "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" - }, - "dependencies": { - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "grunt-contrib-uglify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.1.tgz", - "integrity": "sha512-dwf8/+4uW1+7pH72WButOEnzErPGmtUvc8p08B0eQS/6ON0WdeQu0+WFeafaPTbbY1GqtS25lsHWaDeiTQNWPg==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "maxmin": "^2.1.0", - "uglify-js": "^3.5.0", - "uri-path": "^1.0.0" - } - }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" - } + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "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=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "duplexer": "^0.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -406,34 +2143,20 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "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": { - "repeating": "^2.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "inflight": { @@ -452,11 +2175,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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 + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } }, "is-finite": { "version": "1.0.2", @@ -467,39 +2193,132 @@ "number-is-nan": "^1.0.0" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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 + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, - "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=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "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 + } } }, "lodash": { @@ -508,77 +2327,52 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "maxmin": { + "make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", - "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^3.0.0", - "pretty-bytes": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.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.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "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=", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "mime-db": "1.44.0" } }, "minimatch": { @@ -613,26 +2407,23 @@ } } }, - "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" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "dev": true }, "number-is-nan": { "version": "1.0.1", @@ -646,6 +2437,24 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -655,47 +2464,60 @@ "wrappy": "1" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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-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-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "error-ex": "^1.2.0" + "p-try": "^2.0.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "p-limit": "^2.0.0" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "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-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "path-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-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -717,46 +2539,68 @@ "pinkie": "^2.0.0" } }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } + "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 }, - "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=", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "safe-buffer": "^5.1.0" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "regenerate": "^1.4.0" } }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -766,15 +2610,6 @@ "is-finite": "^1.0.0" } }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -800,22 +2635,54 @@ } } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -824,44 +2691,78 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "source-map-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.2.tgz", + "integrity": "sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -871,24 +2772,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-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" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -898,63 +2781,242 @@ "has-flag": "^3.0.0" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "tapable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.1.1.tgz", + "integrity": "sha512-Wib1S8m2wdpLbmQz0RBEVosIyvb/ykfKXf3ZIDqvWoMg/zTNm6G/tDSuUM61J1kNCDXWJrLHGSFeMhAG+gAGpQ==", "dev": true }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "terser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.4.0.tgz", + "integrity": "sha512-3dZunFLbCJis9TAF2VnX+VrQLctRUmt1p3W2kCsJuZE4ZgWqh//+1MZ62EanewrqKoUf4zIaDGZAvml4UDc0OQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==", "dev": true, "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "jest-worker": "^26.6.1", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.8" + }, + "dependencies": { + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "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 + }, + "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 + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, - "uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "punycode": "^2.1.0" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "watchpack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz", + "integrity": "sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-gyr7VE8zXJP81ZvS8+5dDphS2kaE0r8bpVWX6SxkBlzlX3hYfBS96kaltuf2cYK/BKJlUw5Aex/fKC34HUn+hA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.3.1", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^4.2.0", + "schema-utils": "^3.0.0", + "tapable": "^2.0.0", + "terser-webpack-plugin": "^5.0.3", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", "dev": true, "requires": { - "isexe": "^2.0.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" } }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index f78a2f9..2d9fc1f 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "gaussholder", "version": "1.1.3", "description": "Quick and beautiful image placeholders using Gaussian blur.", - "main": "Gruntfile.js", + "main": "index.js", "scripts": { - "build": "grunt", - "test": "echo \"Error: no test specified\" && exit 1" + "build": "webpack --config=./.webpack/webpack.config.prod.js", + "start": "webpack --watch --config=./.webpack/webpack.config.prod.js" }, "repository": { "type": "git", @@ -18,7 +18,11 @@ }, "homepage": "https://github.com/humanmade/Gaussholder#readme", "devDependencies": { - "grunt": "^1.0.4", - "grunt-contrib-uglify": "^4.0.1" + "@babel/preset-env": "^7.12.1", + "babel-core": "^6.26.3", + "babel-loader": "^8.2.1", + "clean-webpack-plugin": "^3.0.0", + "source-map-loader": "^1.1.2", + "webpack": "^5.5.0" } } From 0430f5b954b569da8e15dce03817a3068b7724f4 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:19:55 +0100 Subject: [PATCH 2/9] Add inline webpack source maps --- .webpack/webpack.config.dev.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.webpack/webpack.config.dev.js b/.webpack/webpack.config.dev.js index b717089..e894ef0 100644 --- a/.webpack/webpack.config.dev.js +++ b/.webpack/webpack.config.dev.js @@ -3,5 +3,5 @@ const common = require( './webpack.config.common' ); module.exports = { ...common, mode: 'development', - devtool: 'cheap-module-source-map', + devtool: 'inline-source-map', }; From a14ebef56aa60908a45de168a09315deac012870 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:20:13 +0100 Subject: [PATCH 3/9] Enqueue Gaussholder from teh dist folder --- inc/frontend/namespace.php | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/inc/frontend/namespace.php b/inc/frontend/namespace.php index 7403923..96c4cef 100644 --- a/inc/frontend/namespace.php +++ b/inc/frontend/namespace.php @@ -19,18 +19,6 @@ function bootstrap() { * Output the Gaussholder script onto the page. */ function output_script() { - // Inline for performance - if ( SCRIPT_DEBUG ) { - $files = array( - Gaussholder\PLUGIN_DIR . '/assets/stackblur.js', - Gaussholder\PLUGIN_DIR . '/assets/gaussholder.js', - ); - } else { - $files = array( - Gaussholder\PLUGIN_DIR . '/assets/gaussholder.min.js', - ); - } - echo ''; From 6b8b32f48c2b34250cadce6bf632efccda2345a1 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:20:34 +0100 Subject: [PATCH 4/9] Fix development script in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d9fc1f..1df684e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "build": "webpack --config=./.webpack/webpack.config.prod.js", - "start": "webpack --watch --config=./.webpack/webpack.config.prod.js" + "start": "webpack --watch --config=./.webpack/webpack.config.dev.js" }, "repository": { "type": "git", From 028cb8fd11cfaa832a926ab75acffe0832d78a41 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:29:58 +0100 Subject: [PATCH 5/9] Export StackBluur as it wasn't imported properly in gaussholder.js --- assets/gaussholder.js | 2 +- assets/stackblur.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/gaussholder.js b/assets/gaussholder.js index 6bfdd2f..7405f37 100644 --- a/assets/gaussholder.js +++ b/assets/gaussholder.js @@ -1,4 +1,4 @@ -import './stackblur'; +import StackBlur from './stackblur'; window.Gaussholder = (function (header) { // Fade duration in ms when the image loads in. diff --git a/assets/stackblur.js b/assets/stackblur.js index 07d6bfa..299aa0b 100644 --- a/assets/stackblur.js +++ b/assets/stackblur.js @@ -335,4 +335,6 @@ var StackBlur = (function () { return { canvasRGB: processCanvasRGB }; -})(); +}); + +export default StackBlur; From d9ed4db1190193f81d9060e8ef4ed0ba3ebe301e Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 17:47:44 +0100 Subject: [PATCH 6/9] Use ES6 modules for a better code organization --- .webpack/webpack.config.common.js | 2 +- assets/gaussholder.js | 233 ------------------------- assets/index.js | 3 + assets/src/gaussholder.js | 169 ++++++++++++++++++ assets/src/reconstitute-image.js | 32 ++++ assets/src/render-image-into-canvas.js | 37 ++++ assets/{ => src}/stackblur.js | 0 7 files changed, 242 insertions(+), 234 deletions(-) delete mode 100644 assets/gaussholder.js create mode 100644 assets/index.js create mode 100644 assets/src/gaussholder.js create mode 100644 assets/src/reconstitute-image.js create mode 100644 assets/src/render-image-into-canvas.js rename assets/{ => src}/stackblur.js (100%) diff --git a/.webpack/webpack.config.common.js b/.webpack/webpack.config.common.js index fedb29d..c99890c 100644 --- a/.webpack/webpack.config.common.js +++ b/.webpack/webpack.config.common.js @@ -1,7 +1,7 @@ const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { - entry: [ './assets/gaussholder.js' ], + entry: [ './assets/index.js' ], output: { filename: 'gaussholder.min.js', }, diff --git a/assets/gaussholder.js b/assets/gaussholder.js deleted file mode 100644 index 7405f37..0000000 --- a/assets/gaussholder.js +++ /dev/null @@ -1,233 +0,0 @@ -import StackBlur from './stackblur'; - -window.Gaussholder = (function (header) { - // Fade duration in ms when the image loads in. - var fadeDuration = 800; - - var arrayBufferToBase64 = function( buffer ) { - var binary = ''; - var bytes = new Uint8Array( buffer ); - var len = bytes.byteLength; - for (var i = 0; i < len; i++) { - binary += String.fromCharCode( bytes[ i ] ); - } - return window.btoa( binary ); - }; - - var reconstituteImage = function (header, image) { - var image_data = image[0], - width = parseInt( image[1] ), - height = parseInt( image[2] ); - - var full = atob( header.header ) + atob( image_data ); - var bytes = new Uint8Array( full.length ); - for (var i = 0; i < full.length; i++) { - bytes[i] = full.charCodeAt(i); - } - - // Poke the bits. - bytes[ header.height_offset ] = ( (height >> 8) & 0xFF); - bytes[ header.height_offset + 1 ] = (height & 0xFF); - bytes[ header.length_offset ] = ( (width >> 8) & 0xFF); - bytes[ header.length_offset + 1] = (width & 0xFF); - - // Back to a full JPEG now. - return arrayBufferToBase64( bytes ); - }; - - /** - * Render an image into a Canvas - * - * @param {HTMLCanvasElement} canvas Canvas element to render into - * @param {list} image 3-tuple of base64-encoded image data, width, height - * @param {list} final Final width and height - */ - var render = function (canvas, image, final, cb) { - var ctx = canvas.getContext('2d'), - width = parseInt( final[0] ), - height = parseInt( final[1] ), - radius = parseInt( final[2] ); - - // Ensure smoothing is off - ctx.mozImageSmoothingEnabled = false; - ctx.webkitImageSmoothingEnabled = false; - ctx.msImageSmoothingEnabled = false; - ctx.imageSmoothingEnabled = false; - - var img = new Image(); - img.src = 'data:image/jpg;base64,' + reconstituteImage(header, image); - img.onload = function () { - canvas.width = width; - canvas.height = height; - - ctx.drawImage(img, 0, 0, width, height); - StackBlur.canvasRGB( canvas, 0, 0, width, height, radius ); - cb(); - }; - }; - - /** - * Render placeholder for an image - * - * @param {HTMLImageElement} element Element to render placeholder for - */ - var handleElement = function (element) { - if ( ! ( 'gaussholder' in element.dataset ) ) { - return; - } - - var canvas = document.createElement('canvas'); - var final = element.dataset.gaussholderSize.split(','); - - // Set the dimensions... - element.style.width = final[0] + 'px'; - element.style.height = final[1] + 'px'; - - // ...then recalculate based on what it actually renders as - var original = [ final[0], final[1] ]; - if ( element.width < final[0] ) { - // Rescale, keeping the aspect ratio - final[0] = element.width; - final[1] = final[1] * ( final[0] / original[0] ); - } else if ( element.height < final[1] ) { - // Rescale, keeping the aspect ratio - final[1] = element.height; - final[0] = final[0] * ( final[1] / original[1] ); - } - - // Set dimensions, _again_ - element.style.width = final[0] + 'px'; - element.style.height = final[1] + 'px'; - - render(canvas, element.dataset.gaussholder.split(','), final, function () { - // Load in as our background image - element.style.backgroundImage = 'url("' + canvas.toDataURL() + '")'; - element.style.backgroundRepeat = 'no-repeat'; - }); - }; - - var loadOriginal = function (element) { - if ( ! ( 'originalsrc' in element.dataset ) && ! ( 'originalsrcset' in element.dataset ) ) { - return; - } - - var data = element.dataset.gaussholderSize.split(','), - radius = parseInt( data[2] ); - - // Load our image now - var img = new Image(); - - if ( element.dataset.originalsrc ) { - img.src = element.dataset.originalsrc; - } - if ( element.dataset.originalsrcset ) { - img.srcset = element.dataset.originalsrcset; - } - - img.onload = function () { - // Filter property to use - var filterProp = ( 'webkitFilter' in element.style ) ? 'webkitFilter' : 'filter'; - element.style[ filterProp ] = 'blur(' + radius * 0.5 + 'px)'; - - // Ensure blur doesn't bleed past image border - element.style.clipPath = 'url(#gaussclip)'; // Current FF - element.style.clipPath = 'inset(0)'; // Standard - element.style.webkitClipPath = 'inset(0)'; // WebKit - - // Set the actual source - element.src = img.src; - element.srcset = img.srcset; - - // Cleaning source - element.dataset.originalsrc = ''; - element.dataset.originalsrcset = ''; - - // Clear placeholder temporary image - // (We do this after setting the source, as doing it before can - // cause a tiny flicker) - element.style.backgroundImage = ''; - element.style.backgroundRepeat = ''; - - var start = 0; - var anim = function (ts) { - if ( ! start ) start = ts; - var diff = ts - start; - if ( diff > fadeDuration ) { - element.style[ filterProp ] = ''; - element.style.clipPath = ''; - element.style.webkitClipPath = ''; - return; - } - - var effectiveRadius = radius * ( 1 - ( diff / fadeDuration ) ); - - element.style[ filterProp ] = 'blur(' + effectiveRadius * 0.5 + 'px)'; - window.requestAnimationFrame(anim); - }; - window.requestAnimationFrame(anim); - }; - }; - - var loadLazily = []; - var threshold = 1200; - var lastRun = 0, - loopTimeout = null; - - var scrollHandler = function () { - var now = Date.now(); - if ( ( lastRun + 40 ) > now ) { - if ( loopTimeout ) { - return; - } - loopTimeout = window.setTimeout(scrollHandler, 40); - return; - } - lastRun = now; - loopTimeout && (loopTimeout = null); - - var next = []; - for (var i = loadLazily.length - 1; i >= 0; i--) { - var img = loadLazily[i]; - var shouldShow = img.getBoundingClientRect().top <= ( window.innerHeight + threshold ); - if ( ! shouldShow ) { - next.push(img); - continue; - } - - loadOriginal(img); - } - loadLazily = next; - if (loadLazily.length < 1) { - window.removeEventListener('scroll', scrollHandler); - } - }; - - /** - * Render all placeholders on the page - */ - var handleAll = function () { - var images = document.getElementsByTagName('img'); - - for (var i = images.length - 1; i >= 0; i--) { - var img = images[i]; - - // Ensure the blank GIF has loaded first - if ( img.complete ) { - handleElement(img); - } else { - img.onload = function () { - handleElement(this); - } - } - } - - loadLazily = images; - scrollHandler(); - - if (loadLazily.length > 0) { - window.addEventListener('scroll', scrollHandler); - } - }; - - return handleAll; -})(window.GaussholderHeader); diff --git a/assets/index.js b/assets/index.js new file mode 100644 index 0000000..f576967 --- /dev/null +++ b/assets/index.js @@ -0,0 +1,3 @@ +import Gaussholder from './src/gaussholder'; + +window.Gaussholder = Gaussholder(); diff --git a/assets/src/gaussholder.js b/assets/src/gaussholder.js new file mode 100644 index 0000000..c99e3f6 --- /dev/null +++ b/assets/src/gaussholder.js @@ -0,0 +1,169 @@ +import renderImageIntoCanvas from './render-image-into-canvas'; + +// Fade duration in ms when the image loads in. +const FADE_DURATION = 800; + +export default function () { + /** + * Render placeholder for an image + * + * @param {HTMLImageElement} element Element to render placeholder for + */ + let handleElement = function ( element ) { + if ( ! ( 'gaussholder' in element.dataset ) ) { + return; + } + + let canvas = document.createElement( 'canvas' ); + let final = element.dataset.gaussholderSize.split( ',' ); + + // Set the dimensions... + element.style.width = final[0] + 'px'; + element.style.height = final[1] + 'px'; + + // ...then recalculate based on what it actually renders as + let original = [ final[0], final[1] ]; + if ( element.width < final[0] ) { + // Rescale, keeping the aspect ratio + final[0] = element.width; + final[1] = final[1] * ( final[0] / original[0] ); + } else if ( element.height < final[1] ) { + // Rescale, keeping the aspect ratio + final[1] = element.height; + final[0] = final[0] * ( final[1] / original[1] ); + } + + // Set dimensions, _again_ + element.style.width = final[0] + 'px'; + element.style.height = final[1] + 'px'; + + renderImageIntoCanvas( canvas, element.dataset.gaussholder.split( ',' ), final, function () { + // Load in as our background image + element.style.backgroundImage = 'url("' + canvas.toDataURL() + '")'; + element.style.backgroundRepeat = 'no-repeat'; + } ); + }; + + let loadOriginal = function ( element ) { + if ( ! ( 'originalsrc' in element.dataset ) && ! ( 'originalsrcset' in element.dataset ) ) { + return; + } + + let data = element.dataset.gaussholderSize.split( ',' ), + radius = parseInt( data[2] ); + + // Load our image now + let img = new Image(); + + if ( element.dataset.originalsrc ) { + img.src = element.dataset.originalsrc; + } + if ( element.dataset.originalsrcset ) { + img.srcset = element.dataset.originalsrcset; + } + + img.onload = function () { + // Filter property to use + let filterProp = ( 'webkitFilter' in element.style ) ? 'webkitFilter' : 'filter'; + element.style[ filterProp ] = 'blur(' + radius * 0.5 + 'px)'; + + // Ensure blur doesn't bleed past image border + element.style.clipPath = 'url(#gaussclip)'; // Current FF + element.style.clipPath = 'inset(0)'; // Standard + element.style.webkitClipPath = 'inset(0)'; // WebKit + + // Set the actual source + element.src = img.src; + element.srcset = img.srcset; + + // Cleaning source + element.dataset.originalsrc = ''; + element.dataset.originalsrcset = ''; + + // Clear placeholder temporary image + // (We do this after setting the source, as doing it before can + // cause a tiny flicker) + element.style.backgroundImage = ''; + element.style.backgroundRepeat = ''; + + let start = 0; + var anim = function ( ts ) { + if ( ! start ) start = ts; + let diff = ts - start; + if ( diff > FADE_DURATION ) { + element.style[ filterProp ] = ''; + element.style.clipPath = ''; + element.style.webkitClipPath = ''; + return; + } + + let effectiveRadius = radius * ( 1 - ( diff / FADE_DURATION ) ); + + element.style[ filterProp ] = 'blur(' + effectiveRadius * 0.5 + 'px)'; + window.requestAnimationFrame( anim ); + }; + window.requestAnimationFrame( anim ); + }; + }; + + let loadLazily = []; + let threshold = 1200; + let lastRun = 0, + loopTimeout = null; + + var scrollHandler = function () { + let now = Date.now(); + if ( ( lastRun + 40 ) > now ) { + if ( loopTimeout ) { + return; + } + loopTimeout = window.setTimeout( scrollHandler, 40 ); + return; + } + lastRun = now; + loopTimeout && ( loopTimeout = null ); + + let next = []; + for ( let i = loadLazily.length - 1; i >= 0; i-- ) { + let img = loadLazily[i]; + let shouldShow = img.getBoundingClientRect().top <= ( window.innerHeight + threshold ); + if ( ! shouldShow ) { + next.push( img ); + continue; + } + + loadOriginal( img ); + } + loadLazily = next; + if ( loadLazily.length < 1 ) { + window.removeEventListener( 'scroll', scrollHandler ); + } + }; + + /** + * Render all placeholders on the page + */ + return function () { + let images = document.getElementsByTagName( 'img' ); + + for ( let i = images.length - 1; i >= 0; i-- ) { + let img = images[i]; + + // Ensure the blank GIF has loaded first + if ( img.complete ) { + handleElement( img ); + } else { + img.onload = function () { + handleElement( this ); + }; + } + } + + loadLazily = images; + scrollHandler(); + + if ( loadLazily.length > 0 ) { + window.addEventListener( 'scroll', scrollHandler ); + } + }; +} diff --git a/assets/src/reconstitute-image.js b/assets/src/reconstitute-image.js new file mode 100644 index 0000000..1f0afb2 --- /dev/null +++ b/assets/src/reconstitute-image.js @@ -0,0 +1,32 @@ +function arrayBufferToBase64( buffer ) { + let binary = ''; + let bytes = new Uint8Array( buffer ); + let len = bytes.byteLength; + for ( let i = 0; i < len; i++ ) { + binary += String.fromCharCode( bytes[ i ] ); + } + return window.btoa( binary ); +} + +function reconstituteImage( header, image ) { + let image_data = image[0], + width = parseInt( image[1] ), + height = parseInt( image[2] ); + + let full = atob( header.header ) + atob( image_data ); + let bytes = new Uint8Array( full.length ); + for ( let i = 0; i < full.length; i++ ) { + bytes[i] = full.charCodeAt( i ); + } + + // Poke the bits. + bytes[ header.height_offset ] = ( ( height >> 8 ) & 0xFF ); + bytes[ header.height_offset + 1 ] = ( height & 0xFF ); + bytes[ header.length_offset ] = ( ( width >> 8 ) & 0xFF ); + bytes[ header.length_offset + 1] = ( width & 0xFF ); + + // Back to a full JPEG now. + return arrayBufferToBase64( bytes ); +} + +export default reconstituteImage; diff --git a/assets/src/render-image-into-canvas.js b/assets/src/render-image-into-canvas.js new file mode 100644 index 0000000..c3ebae6 --- /dev/null +++ b/assets/src/render-image-into-canvas.js @@ -0,0 +1,37 @@ +import reconstituteImage from './reconstitute-image'; +import StackBlur from './stackblur'; + +const { GaussholderHeader } = window; + +/** + * Render an image into a Canvas + * + * @param {HTMLCanvasElement} canvas Canvas element to render into + * @param {list} image 3-tuple of base64-encoded image data, width, height + * @param {list} final Final width and height + */ +function renderImageIntoCanvas( canvas, image, final, cb ) { + let ctx = canvas.getContext( '2d' ), + width = parseInt( final[0] ), + height = parseInt( final[1] ), + radius = parseInt( final[2] ); + + // Ensure smoothing is off + ctx.mozImageSmoothingEnabled = false; + ctx.webkitImageSmoothingEnabled = false; + ctx.msImageSmoothingEnabled = false; + ctx.imageSmoothingEnabled = false; + + let img = new Image(); + img.src = 'data:image/jpg;base64,' + reconstituteImage( GaussholderHeader, image ); + img.onload = function () { + canvas.width = width; + canvas.height = height; + + ctx.drawImage( img, 0, 0, width, height ); + StackBlur.canvasRGB( canvas, 0, 0, width, height, radius ); + cb(); + }; +} + +export default renderImageIntoCanvas; diff --git a/assets/stackblur.js b/assets/src/stackblur.js similarity index 100% rename from assets/stackblur.js rename to assets/src/stackblur.js From 44cbfe98798c56e3a77c24788743f40f01796679 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Tue, 17 Nov 2020 19:06:44 +0100 Subject: [PATCH 7/9] Unignore dist folder --- .gitignore | 1 - dist/gaussholder.min.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 dist/gaussholder.min.js diff --git a/.gitignore b/.gitignore index 8cf7790..24742b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ # Composer /vendor /node_modules -/dist diff --git a/dist/gaussholder.min.js b/dist/gaussholder.min.js new file mode 100644 index 0000000..167d227 --- /dev/null +++ b/dist/gaussholder.min.js @@ -0,0 +1 @@ +!function(t){var e={};function n(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return t[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";n.r(e);var r=function(t,e){for(var n=e[0],r=parseInt(e[1]),a=parseInt(e[2]),i=atob(t.header)+atob(n),o=new Uint8Array(i.length),s=0;s>8&255,o[t.height_offset+1]=255&a,o[t.length_offset]=r>>8&255,o[t.length_offset+1]=255&r,function(t){for(var e="",n=new Uint8Array(t),r=n.byteLength,a=0;a>H,j[h+1]=m*z>>H,j[h+2]=v*z>>H,b-=w,m-=y,v-=x,w-=F.r,y-=F.g,x-=F.b,d=p+((d=u+l+1)>H,j[d+1]=m*z>>H,j[d+2]=v*z>>H,b-=w,m-=y,v-=x,w-=F.r,y-=F.g,x-=F.b,d=u+((d=c+B)800)return t.style[e]="",t.style.clipPath="",void(t.style.webkitClipPath="");var s=n*(1-o/800);t.style[e]="blur("+.5*s+"px)",window.requestAnimationFrame(r)}))}}},l=[],u=0,c=null,g=function t(){var e=Date.now();if(u+40>e){if(c)return;c=window.setTimeout(t,40)}else{u=e,c&&(c=null);for(var n=[],r=l.length-1;r>=0;r--){var a=l[r];a.getBoundingClientRect().top<=window.innerHeight+1200?s(a):n.push(a)}(l=n).length<1&&window.removeEventListener("scroll",t)}},function(){for(var t=document.getElementsByTagName("img"),e=t.length-1;e>=0;e--){var n=t[e];n.complete?o(n):n.onload=function(){o(this)}}l=t,g(),l.length>0&&window.addEventListener("scroll",g)})}]); \ No newline at end of file From 2e1c270f240fa498177a8521ede17fbad00cd2c0 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Wed, 18 Nov 2020 10:31:37 +0100 Subject: [PATCH 8/9] bundle rebuild --- dist/gaussholder.min.js | 656 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 655 insertions(+), 1 deletion(-) diff --git a/dist/gaussholder.min.js b/dist/gaussholder.min.js index 167d227..1e67cbb 100644 --- a/dist/gaussholder.min.js +++ b/dist/gaussholder.min.js @@ -1 +1,655 @@ -!function(t){var e={};function n(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return t[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";n.r(e);var r=function(t,e){for(var n=e[0],r=parseInt(e[1]),a=parseInt(e[2]),i=atob(t.header)+atob(n),o=new Uint8Array(i.length),s=0;s>8&255,o[t.height_offset+1]=255&a,o[t.length_offset]=r>>8&255,o[t.length_offset+1]=255&r,function(t){for(var e="",n=new Uint8Array(t),r=n.byteLength,a=0;a>H,j[h+1]=m*z>>H,j[h+2]=v*z>>H,b-=w,m-=y,v-=x,w-=F.r,y-=F.g,x-=F.b,d=p+((d=u+l+1)>H,j[d+1]=m*z>>H,j[d+2]=v*z>>H,b-=w,m-=y,v-=x,w-=F.r,y-=F.g,x-=F.b,d=u+((d=c+B)800)return t.style[e]="",t.style.clipPath="",void(t.style.webkitClipPath="");var s=n*(1-o/800);t.style[e]="blur("+.5*s+"px)",window.requestAnimationFrame(r)}))}}},l=[],u=0,c=null,g=function t(){var e=Date.now();if(u+40>e){if(c)return;c=window.setTimeout(t,40)}else{u=e,c&&(c=null);for(var n=[],r=l.length-1;r>=0;r--){var a=l[r];a.getBoundingClientRect().top<=window.innerHeight+1200?s(a):n.push(a)}(l=n).length<1&&window.removeEventListener("scroll",t)}},function(){for(var t=document.getElementsByTagName("img"),e=t.length-1;e>=0;e--){var n=t[e];n.complete?o(n):n.onload=function(){o(this)}}l=t,g(),l.length>0&&window.addEventListener("scroll",g)})}]); \ No newline at end of file +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./assets/index.js": +/*!*************************!*\ + !*** ./assets/index.js ***! + \*************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _src_gaussholder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/gaussholder */ "./assets/src/gaussholder.js"); + +window.Gaussholder = Object(_src_gaussholder__WEBPACK_IMPORTED_MODULE_0__["default"])(); + +/***/ }), + +/***/ "./assets/src/gaussholder.js": +/*!***********************************!*\ + !*** ./assets/src/gaussholder.js ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _render_image_into_canvas__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-image-into-canvas */ "./assets/src/render-image-into-canvas.js"); + // Fade duration in ms when the image loads in. + +var FADE_DURATION = 800; +/* harmony default export */ __webpack_exports__["default"] = (function () { + /** + * Render placeholder for an image + * + * @param {HTMLImageElement} element Element to render placeholder for + */ + var handleElement = function handleElement(element) { + if (!('gaussholder' in element.dataset)) { + return; + } + + var canvas = document.createElement('canvas'); + var final = element.dataset.gaussholderSize.split(','); // Set the dimensions... + + element.style.width = final[0] + 'px'; + element.style.height = final[1] + 'px'; // ...then recalculate based on what it actually renders as + + var original = [final[0], final[1]]; + + if (element.width < final[0]) { + // Rescale, keeping the aspect ratio + final[0] = element.width; + final[1] = final[1] * (final[0] / original[0]); + } else if (element.height < final[1]) { + // Rescale, keeping the aspect ratio + final[1] = element.height; + final[0] = final[0] * (final[1] / original[1]); + } // Set dimensions, _again_ + + + element.style.width = final[0] + 'px'; + element.style.height = final[1] + 'px'; + Object(_render_image_into_canvas__WEBPACK_IMPORTED_MODULE_0__["default"])(canvas, element.dataset.gaussholder.split(','), final, function () { + // Load in as our background image + element.style.backgroundImage = 'url("' + canvas.toDataURL() + '")'; + element.style.backgroundRepeat = 'no-repeat'; + }); + }; + + var loadOriginal = function loadOriginal(element) { + if (!('originalsrc' in element.dataset) && !('originalsrcset' in element.dataset)) { + return; + } + + var data = element.dataset.gaussholderSize.split(','), + radius = parseInt(data[2]); // Load our image now + + var img = new Image(); + + if (element.dataset.originalsrc) { + img.src = element.dataset.originalsrc; + } + + if (element.dataset.originalsrcset) { + img.srcset = element.dataset.originalsrcset; + } + + img.onload = function () { + // Filter property to use + var filterProp = 'webkitFilter' in element.style ? 'webkitFilter' : 'filter'; + element.style[filterProp] = 'blur(' + radius * 0.5 + 'px)'; // Ensure blur doesn't bleed past image border + + element.style.clipPath = 'url(#gaussclip)'; // Current FF + + element.style.clipPath = 'inset(0)'; // Standard + + element.style.webkitClipPath = 'inset(0)'; // WebKit + // Set the actual source + + element.src = img.src; + element.srcset = img.srcset; // Cleaning source + + element.dataset.originalsrc = ''; + element.dataset.originalsrcset = ''; // Clear placeholder temporary image + // (We do this after setting the source, as doing it before can + // cause a tiny flicker) + + element.style.backgroundImage = ''; + element.style.backgroundRepeat = ''; + var start = 0; + + var anim = function anim(ts) { + if (!start) start = ts; + var diff = ts - start; + + if (diff > FADE_DURATION) { + element.style[filterProp] = ''; + element.style.clipPath = ''; + element.style.webkitClipPath = ''; + return; + } + + var effectiveRadius = radius * (1 - diff / FADE_DURATION); + element.style[filterProp] = 'blur(' + effectiveRadius * 0.5 + 'px)'; + window.requestAnimationFrame(anim); + }; + + window.requestAnimationFrame(anim); + }; + }; + + var loadLazily = []; + var threshold = 1200; + var lastRun = 0, + loopTimeout = null; + + var scrollHandler = function scrollHandler() { + var now = Date.now(); + + if (lastRun + 40 > now) { + if (loopTimeout) { + return; + } + + loopTimeout = window.setTimeout(scrollHandler, 40); + return; + } + + lastRun = now; + loopTimeout && (loopTimeout = null); + var next = []; + + for (var i = loadLazily.length - 1; i >= 0; i--) { + var img = loadLazily[i]; + var shouldShow = img.getBoundingClientRect().top <= window.innerHeight + threshold; + + if (!shouldShow) { + next.push(img); + continue; + } + + loadOriginal(img); + } + + loadLazily = next; + + if (loadLazily.length < 1) { + window.removeEventListener('scroll', scrollHandler); + } + }; + /** + * Render all placeholders on the page + */ + + + return function () { + var images = document.getElementsByTagName('img'); + + for (var i = images.length - 1; i >= 0; i--) { + var img = images[i]; // Ensure the blank GIF has loaded first + + if (img.complete) { + handleElement(img); + } else { + img.onload = function () { + handleElement(this); + }; + } + } + + loadLazily = images; + scrollHandler(); + + if (loadLazily.length > 0) { + window.addEventListener('scroll', scrollHandler); + } + }; +}); + +/***/ }), + +/***/ "./assets/src/reconstitute-image.js": +/*!******************************************!*\ + !*** ./assets/src/reconstitute-image.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +function arrayBufferToBase64(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + + return window.btoa(binary); +} + +function reconstituteImage(header, image) { + var image_data = image[0], + width = parseInt(image[1]), + height = parseInt(image[2]); + var full = atob(header.header) + atob(image_data); + var bytes = new Uint8Array(full.length); + + for (var i = 0; i < full.length; i++) { + bytes[i] = full.charCodeAt(i); + } // Poke the bits. + + + bytes[header.height_offset] = height >> 8 & 0xFF; + bytes[header.height_offset + 1] = height & 0xFF; + bytes[header.length_offset] = width >> 8 & 0xFF; + bytes[header.length_offset + 1] = width & 0xFF; // Back to a full JPEG now. + + return arrayBufferToBase64(bytes); +} + +/* harmony default export */ __webpack_exports__["default"] = (reconstituteImage); + +/***/ }), + +/***/ "./assets/src/render-image-into-canvas.js": +/*!************************************************!*\ + !*** ./assets/src/render-image-into-canvas.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _reconstitute_image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reconstitute-image */ "./assets/src/reconstitute-image.js"); +/* harmony import */ var _stackblur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stackblur */ "./assets/src/stackblur.js"); + + +var _window = window, + GaussholderHeader = _window.GaussholderHeader; +/** + * Render an image into a Canvas + * + * @param {HTMLCanvasElement} canvas Canvas element to render into + * @param {list} image 3-tuple of base64-encoded image data, width, height + * @param {list} final Final width and height + */ + +function renderImageIntoCanvas(canvas, image, final, cb) { + var ctx = canvas.getContext('2d'), + width = parseInt(final[0]), + height = parseInt(final[1]), + radius = parseInt(final[2]); // Ensure smoothing is off + + ctx.mozImageSmoothingEnabled = false; + ctx.webkitImageSmoothingEnabled = false; + ctx.msImageSmoothingEnabled = false; + ctx.imageSmoothingEnabled = false; + var img = new Image(); + img.src = 'data:image/jpg;base64,' + Object(_reconstitute_image__WEBPACK_IMPORTED_MODULE_0__["default"])(GaussholderHeader, image); + + img.onload = function () { + canvas.width = width; + canvas.height = height; + ctx.drawImage(img, 0, 0, width, height); + _stackblur__WEBPACK_IMPORTED_MODULE_1__["default"].canvasRGB(canvas, 0, 0, width, height, radius); + cb(); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (renderImageIntoCanvas); + +/***/ }), + +/***/ "./assets/src/stackblur.js": +/*!*********************************!*\ + !*** ./assets/src/stackblur.js ***! + \*********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + StackBlur - a fast almost Gaussian Blur For Canvas + + Version: 0.5 + Author: Mario Klingemann + Contact: mario@quasimondo.com + Website: http://www.quasimondo.com/StackBlurForCanvas + Twitter: @quasimondo + + In case you find this class useful - especially in commercial projects - + I am not totally unhappy for a small donation to my PayPal account + mario@quasimondo.de + + Or support me on flattr: + https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript + + Copyright (c) 2010 Mario Klingemann + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +var StackBlur = function StackBlur() { + var mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; + var shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; + + function getImageDataFromCanvas(canvas, top_x, top_y, width, height) { + if (typeof canvas == 'string') var canvas = document.getElementById(canvas);else if (!canvas instanceof HTMLCanvasElement) return; + var context = canvas.getContext('2d'); + var imageData; + + try { + // try { + imageData = context.getImageData(top_x, top_y, width, height); + /*} catch(e) { + // NOTE: this part is supposedly only needed if you want to work with local files + // so it might be okay to remove the whole try/catch block and just use + // imageData = context.getImageData(top_x, top_y, width, height); + try { + netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); + imageData = context.getImageData(top_x, top_y, width, height); + } catch(e) { + alert("Cannot access local image"); + throw new Error("unable to access local image data: " + e); + return; + } + }*/ + } catch (e) { + throw new Error("unable to access image data: " + e); + } + + return imageData; + } + + function processCanvasRGB(canvas, top_x, top_y, width, height, radius) { + if (isNaN(radius) || radius < 1) return; + radius |= 0; + var imageData = getImageDataFromCanvas(canvas, top_x, top_y, width, height); + imageData = processImageDataRGB(imageData, top_x, top_y, width, height, radius); + canvas.getContext('2d').putImageData(imageData, top_x, top_y); + } + + function processImageDataRGB(imageData, top_x, top_y, width, height, radius) { + var pixels = imageData.data; + var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, r_out_sum, g_out_sum, b_out_sum, r_in_sum, g_in_sum, b_in_sum, pr, pg, pb, rbs; + var div = radius + radius + 1; + var w4 = width << 2; + var widthMinus1 = width - 1; + var heightMinus1 = height - 1; + var radiusPlus1 = radius + 1; + var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; + var stackStart = new BlurStack(); + var stack = stackStart; + + for (i = 1; i < div; i++) { + stack = stack.next = new BlurStack(); + if (i == radiusPlus1) var stackEnd = stack; + } + + stack.next = stackStart; + var stackIn = null; + var stackOut = null; + yw = yi = 0; + var mul_sum = mul_table[radius]; + var shg_sum = shg_table[radius]; + + for (y = 0; y < height; y++) { + r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + + for (i = 0; i < radiusPlus1; i++) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + + for (i = 1; i < radiusPlus1; i++) { + p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); + r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = pg = pixels[p + 1]) * rbs; + b_sum += (stack.b = pb = pixels[p + 2]) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + } + + stackIn = stackStart; + stackOut = stackEnd; + + for (x = 0; x < width; x++) { + pixels[yi] = r_sum * mul_sum >> shg_sum; + pixels[yi + 1] = g_sum * mul_sum >> shg_sum; + pixels[yi + 2] = b_sum * mul_sum >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2; + r_in_sum += stackIn.r = pixels[p]; + g_in_sum += stackIn.g = pixels[p + 1]; + b_in_sum += stackIn.b = pixels[p + 2]; + r_sum += r_in_sum; + g_sum += g_in_sum; + b_sum += b_in_sum; + stackIn = stackIn.next; + r_out_sum += pr = stackOut.r; + g_out_sum += pg = stackOut.g; + b_out_sum += pb = stackOut.b; + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += 4; + } + + yw += width; + } + + for (x = 0; x < width; x++) { + g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; + yi = x << 2; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + + for (i = 0; i < radiusPlus1; i++) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + + yp = width; + + for (i = 1; i <= radius; i++) { + yi = yp + x << 2; + r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = pg = pixels[yi + 1]) * rbs; + b_sum += (stack.b = pb = pixels[yi + 2]) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + + if (i < heightMinus1) { + yp += width; + } + } + + yi = x; + stackIn = stackStart; + stackOut = stackEnd; + + for (y = 0; y < height; y++) { + p = yi << 2; + pixels[p] = r_sum * mul_sum >> shg_sum; + pixels[p + 1] = g_sum * mul_sum >> shg_sum; + pixels[p + 2] = b_sum * mul_sum >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2; + r_sum += r_in_sum += stackIn.r = pixels[p]; + g_sum += g_in_sum += stackIn.g = pixels[p + 1]; + b_sum += b_in_sum += stackIn.b = pixels[p + 2]; + stackIn = stackIn.next; + r_out_sum += pr = stackOut.r; + g_out_sum += pg = stackOut.g; + b_out_sum += pb = stackOut.b; + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += width; + } + } + + return imageData; + } + + function BlurStack() { + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 0; + this.next = null; + } + + return { + canvasRGB: processCanvasRGB + }; +}; + +/* harmony default export */ __webpack_exports__["default"] = (StackBlur); + +/***/ }), + +/***/ 0: +/*!*******************************!*\ + !*** multi ./assets/index.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./assets/index.js */"./assets/index.js"); + + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZ2F1c3Nob2xkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9yZWNvbnN0aXR1dGUtaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9yZW5kZXItaW1hZ2UtaW50by1jYW52YXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9zdGFja2JsdXIuanMiXSwibmFtZXMiOlsid2luZG93IiwiR2F1c3Nob2xkZXIiLCJGQURFX0RVUkFUSU9OIiwiaGFuZGxlRWxlbWVudCIsImVsZW1lbnQiLCJkYXRhc2V0IiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmluYWwiLCJnYXVzc2hvbGRlclNpemUiLCJzcGxpdCIsInN0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJvcmlnaW5hbCIsInJlbmRlckltYWdlSW50b0NhbnZhcyIsImdhdXNzaG9sZGVyIiwiYmFja2dyb3VuZEltYWdlIiwidG9EYXRhVVJMIiwiYmFja2dyb3VuZFJlcGVhdCIsImxvYWRPcmlnaW5hbCIsImRhdGEiLCJyYWRpdXMiLCJwYXJzZUludCIsImltZyIsIkltYWdlIiwib3JpZ2luYWxzcmMiLCJzcmMiLCJvcmlnaW5hbHNyY3NldCIsInNyY3NldCIsIm9ubG9hZCIsImZpbHRlclByb3AiLCJjbGlwUGF0aCIsIndlYmtpdENsaXBQYXRoIiwic3RhcnQiLCJhbmltIiwidHMiLCJkaWZmIiwiZWZmZWN0aXZlUmFkaXVzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibG9hZExhemlseSIsInRocmVzaG9sZCIsImxhc3RSdW4iLCJsb29wVGltZW91dCIsInNjcm9sbEhhbmRsZXIiLCJub3ciLCJEYXRlIiwic2V0VGltZW91dCIsIm5leHQiLCJpIiwibGVuZ3RoIiwic2hvdWxkU2hvdyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvcCIsImlubmVySGVpZ2h0IiwicHVzaCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJpbWFnZXMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImNvbXBsZXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImFycmF5QnVmZmVyVG9CYXNlNjQiLCJidWZmZXIiLCJiaW5hcnkiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJsZW4iLCJieXRlTGVuZ3RoIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYnRvYSIsInJlY29uc3RpdHV0ZUltYWdlIiwiaGVhZGVyIiwiaW1hZ2UiLCJpbWFnZV9kYXRhIiwiZnVsbCIsImF0b2IiLCJjaGFyQ29kZUF0IiwiaGVpZ2h0X29mZnNldCIsImxlbmd0aF9vZmZzZXQiLCJHYXVzc2hvbGRlckhlYWRlciIsImNiIiwiY3R4IiwiZ2V0Q29udGV4dCIsIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIsIndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCIsIm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwiZHJhd0ltYWdlIiwiU3RhY2tCbHVyIiwiY2FudmFzUkdCIiwibXVsX3RhYmxlIiwic2hnX3RhYmxlIiwiZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyIsInRvcF94IiwidG9wX3kiLCJnZXRFbGVtZW50QnlJZCIsIkhUTUxDYW52YXNFbGVtZW50IiwiY29udGV4dCIsImltYWdlRGF0YSIsImdldEltYWdlRGF0YSIsImUiLCJFcnJvciIsInByb2Nlc3NDYW52YXNSR0IiLCJpc05hTiIsInByb2Nlc3NJbWFnZURhdGFSR0IiLCJwdXRJbWFnZURhdGEiLCJwaXhlbHMiLCJ4IiwieSIsInAiLCJ5cCIsInlpIiwieXciLCJyX3N1bSIsImdfc3VtIiwiYl9zdW0iLCJyX291dF9zdW0iLCJnX291dF9zdW0iLCJiX291dF9zdW0iLCJyX2luX3N1bSIsImdfaW5fc3VtIiwiYl9pbl9zdW0iLCJwciIsInBnIiwicGIiLCJyYnMiLCJkaXYiLCJ3NCIsIndpZHRoTWludXMxIiwiaGVpZ2h0TWludXMxIiwicmFkaXVzUGx1czEiLCJzdW1GYWN0b3IiLCJzdGFja1N0YXJ0IiwiQmx1clN0YWNrIiwic3RhY2siLCJzdGFja0VuZCIsInN0YWNrSW4iLCJzdGFja091dCIsIm11bF9zdW0iLCJzaGdfc3VtIiwiciIsImciLCJiIiwiYSJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUFBO0FBQUE7QUFFQUEsTUFBTSxDQUFDQyxXQUFQLEdBQXFCQSxnRUFBVyxFQUFoQyxDOzs7Ozs7Ozs7Ozs7QUNGQTtBQUFBO0NBRUE7O0FBQ0EsSUFBTUMsYUFBYSxHQUFHLEdBQXRCO0FBRWUsMkVBQVk7QUFDMUI7Ozs7O0FBS0EsTUFBSUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUFXQyxPQUFYLEVBQXFCO0FBQ3hDLFFBQUssRUFBSSxpQkFBaUJBLE9BQU8sQ0FBQ0MsT0FBN0IsQ0FBTCxF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LEdBQVluQyxNQUFNLENBQUNHLENBQUMsR0FBQyxDQUFILENBQXpDO0FBQ0FNLGFBQUssSUFBS00sUUFBUSxJQUFLZSxPQUFPLENBQUNNLENBQVIsR0FBWXBDLE1BQU0sQ0FBQ0csQ0FBQyxHQUFDLENBQUgsQ0FBekM7QUFFQTJCLGVBQU8sR0FBR0EsT0FBTyxDQUFDekYsSUFBbEI7QUFFQXFFLGlCQUFTLElBQUtNLEVBQUUsR0FBR2UsUUFBUSxDQUFDRyxDQUE1QjtBQUNBdkIsaUJBQVMsSUFBS00sRUFBRSxHQUFHYyxRQUFRLENBQUNJLENBQTVCO0FBQ0F2QixpQkFBUyxJQUFLTSxFQUFFLEdBQUdhLFFBQVEsQ0FBQ0ssQ0FBNUI7QUFFQXZCLGdCQUFRLElBQUlHLEVBQVo7QUFDQUYsZ0JBQVEsSUFBSUcsRUFBWjtBQUNBRixnQkFBUSxJQUFJRyxFQUFaO0FBRUFhLGdCQUFRLEdBQUdBLFFBQVEsQ0FBQzFGLElBQXBCO0FBRUFnRSxVQUFFLElBQUlwRyxLQUFOO0FBQ0g7QUFDSjs7QUFFRCxXQUFPdUYsU0FBUDtBQUNIOztBQUVELFdBQVNtQyxTQUFULEdBQ0E7QUFDSSxTQUFLTyxDQUFMLEdBQVMsQ0FBVDtBQUNBLFNBQUtDLENBQUwsR0FBUyxDQUFUO0FBQ0EsU0FBS0MsQ0FBTCxHQUFTLENBQVQ7QUFDQSxTQUFLQyxDQUFMLEdBQVMsQ0FBVDtBQUNBLFNBQUtoRyxJQUFMLEdBQVksSUFBWjtBQUNIOztBQUVELFNBQU87QUFDSDBDLGFBQVMsRUFBRWE7QUFEUixHQUFQO0FBR0EsQ0F6U0Q7O0FBMlNlZCx3RUFBZixFIiwiZmlsZSI6ImdhdXNzaG9sZGVyLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsImltcG9ydCBHYXVzc2hvbGRlciBmcm9tICcuL3NyYy9nYXVzc2hvbGRlcic7XG5cbndpbmRvdy5HYXVzc2hvbGRlciA9IEdhdXNzaG9sZGVyKCk7XG4iLCJpbXBvcnQgcmVuZGVySW1hZ2VJbnRvQ2FudmFzIGZyb20gJy4vcmVuZGVyLWltYWdlLWludG8tY2FudmFzJztcblxuLy8gRmFkZSBkdXJhdGlvbiBpbiBtcyB3aGVuIHRoZSBpbWFnZSBsb2FkcyBpbi5cbmNvbnN0IEZBREVfRFVSQVRJT04gPSA4MDA7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcblx0LyoqXG5cdCAqIFJlbmRlciBwbGFjZWhvbGRlciBmb3IgYW4gaW1hZ2Vcblx0ICpcblx0ICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdG8gcmVuZGVyIHBsYWNlaG9sZGVyIGZvclxuXHQgKi9cblx0bGV0IGhhbmRsZUVsZW1lbnQgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0aWYgKCAhICggJ2dhdXNzaG9sZGVyJyBpbiBlbGVtZW50LmRhdGFzZXQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTtcblx0XHRsZXQgZmluYWwgPSBlbGVtZW50LmRhdGFzZXQuZ2F1c3Nob2xkZXJTaXplLnNwbGl0KCAnLCcgKTtcblxuXHRcdC8vIFNldCB0aGUgZGltZW5zaW9ucy4uLlxuXHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSBmaW5hbFswXSArICdweCc7XG5cdFx0ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBmaW5hbFsxXSArICdweCc7XG5cblx0XHQvLyAuLi50aGVuIHJlY2FsY3VsYXRlIGJhc2VkIG9uIHdoYXQgaXQgYWN0dWFsbHkgcmVuZGVycyBhc1xuXHRcdGxldCBvcmlnaW5hbCA9IFsgZmluYWxbMF0sIGZpbmFsWzFdIF07XG5cdFx0aWYgKCBlbGVtZW50LndpZHRoIDwgZmluYWxbMF0gKSB7XG5cdFx0XHQvLyBSZXNjYWxlLCBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW9cblx0XHRcdGZpbmFsWzBdID0gZWxlbWVudC53aWR0aDtcblx0XHRcdGZpbmFsWzFdID0gZmluYWxbMV0gKiAoIGZpbmFsWzBdIC8gb3JpZ2luYWxbMF0gKTtcblx0XHR9IGVsc2UgaWYgKCBlbGVtZW50LmhlaWdodCA8IGZpbmFsWzFdICkge1xuXHRcdFx0Ly8gUmVzY2FsZSwga2VlcGluZyB0aGUgYXNwZWN0IHJhdGlvXG5cdFx0XHRmaW5hbFsxXSA9IGVsZW1lbnQuaGVpZ2h0O1xuXHRcdFx0ZmluYWxbMF0gPSBmaW5hbFswXSAqICggZmluYWxbMV0gLyBvcmlnaW5hbFsxXSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCBkaW1lbnNpb25zLCBfYWdhaW5fXG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IGZpbmFsWzBdICsgJ3B4Jztcblx0XHRlbGVtZW50LnN0eWxlLmhlaWdodCA9IGZpbmFsWzFdICsgJ3B4JztcblxuXHRcdHJlbmRlckltYWdlSW50b0NhbnZhcyggY2FudmFzLCBlbGVtZW50LmRhdGFzZXQuZ2F1c3Nob2xkZXIuc3BsaXQoICcsJyApLCBmaW5hbCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gTG9hZCBpbiBhcyBvdXIgYmFja2dyb3VuZCBpbWFnZVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIGNhbnZhcy50b0RhdGFVUkwoKSArICdcIiknO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kUmVwZWF0ID0gJ25vLXJlcGVhdCc7XG5cdFx0fSApO1xuXHR9O1xuXG5cdGxldCBsb2FkT3JpZ2luYWwgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0aWYgKCAhICggJ29yaWdpbmFsc3JjJyBpbiBlbGVtZW50LmRhdGFzZXQgKSAmJiAhICggJ29yaWdpbmFsc3Jjc2V0JyBpbiBlbGVtZW50LmRhdGFzZXQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgZGF0YSA9IGVsZW1lbnQuZGF0YXNldC5nYXVzc2hvbGRlclNpemUuc3BsaXQoICcsJyApLFxuXHRcdFx0cmFkaXVzID0gcGFyc2VJbnQoIGRhdGFbMl0gKTtcblxuXHRcdC8vIExvYWQgb3VyIGltYWdlIG5vd1xuXHRcdGxldCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuXHRcdGlmICggZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3JjICkge1xuXHRcdFx0aW1nLnNyYyA9IGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbHNyYztcblx0XHR9XG5cdFx0aWYgKCBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxzcmNzZXQgKSB7XG5cdFx0XHRpbWcuc3Jjc2V0ID0gZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3Jjc2V0O1xuXHRcdH1cblxuXHRcdGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBGaWx0ZXIgcHJvcGVydHkgdG8gdXNlXG5cdFx0XHRsZXQgZmlsdGVyUHJvcCA9ICggJ3dlYmtpdEZpbHRlcicgaW4gZWxlbWVudC5zdHlsZSApID8gJ3dlYmtpdEZpbHRlcicgOiAnZmlsdGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGVbIGZpbHRlclByb3AgXSA9ICdibHVyKCcgKyByYWRpdXMgKiAwLjUgKyAncHgpJztcblxuXHRcdFx0Ly8gRW5zdXJlIGJsdXIgZG9lc24ndCBibGVlZCBwYXN0IGltYWdlIGJvcmRlclxuXHRcdFx0ZWxlbWVudC5zdHlsZS5jbGlwUGF0aCA9ICd1cmwoI2dhdXNzY2xpcCknOyAvLyBDdXJyZW50IEZGXG5cdFx0XHRlbGVtZW50LnN0eWxlLmNsaXBQYXRoID0gJ2luc2V0KDApJzsgLy8gU3RhbmRhcmRcblx0XHRcdGVsZW1lbnQuc3R5bGUud2Via2l0Q2xpcFBhdGggPSAnaW5zZXQoMCknOyAvLyBXZWJLaXRcblxuXHRcdFx0Ly8gU2V0IHRoZSBhY3R1YWwgc291cmNlXG5cdFx0XHRlbGVtZW50LnNyYyA9IGltZy5zcmM7XG5cdFx0XHRlbGVtZW50LnNyY3NldCA9IGltZy5zcmNzZXQ7XG5cblx0XHRcdC8vIENsZWFuaW5nIHNvdXJjZVxuXHRcdFx0ZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3JjID0gJyc7XG5cdFx0XHRlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxzcmNzZXQgPSAnJztcblxuXHRcdFx0Ly8gQ2xlYXIgcGxhY2Vob2xkZXIgdGVtcG9yYXJ5IGltYWdlXG5cdFx0XHQvLyAoV2UgZG8gdGhpcyBhZnRlciBzZXR0aW5nIHRoZSBzb3VyY2UsIGFzIGRvaW5nIGl0IGJlZm9yZSBjYW5cblx0XHRcdC8vIGNhdXNlIGEgdGlueSBmbGlja2VyKVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJztcblx0XHRcdGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICcnO1xuXG5cdFx0XHRsZXQgc3RhcnQgPSAwO1xuXHRcdFx0dmFyIGFuaW0gPSBmdW5jdGlvbiAoIHRzICkge1xuXHRcdFx0XHRpZiAoICEgc3RhcnQgKSBzdGFydCA9IHRzO1xuXHRcdFx0XHRsZXQgZGlmZiA9IHRzIC0gc3RhcnQ7XG5cdFx0XHRcdGlmICggZGlmZiA+IEZBREVfRFVSQVRJT04gKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZVsgZmlsdGVyUHJvcCBdID0gJyc7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5jbGlwUGF0aCA9ICcnO1xuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUud2Via2l0Q2xpcFBhdGggPSAnJztcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgZWZmZWN0aXZlUmFkaXVzID0gcmFkaXVzICogKCAxIC0gKCBkaWZmIC8gRkFERV9EVVJBVElPTiApICk7XG5cblx0XHRcdFx0ZWxlbWVudC5zdHlsZVsgZmlsdGVyUHJvcCBdID0gJ2JsdXIoJyArIGVmZmVjdGl2ZVJhZGl1cyAqIDAuNSArICdweCknO1xuXHRcdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltICk7XG5cdFx0XHR9O1xuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbSApO1xuXHRcdH07XG5cdH07XG5cblx0bGV0IGxvYWRMYXppbHkgPSBbXTtcblx0bGV0IHRocmVzaG9sZCA9IDEyMDA7XG5cdGxldCBsYXN0UnVuID0gMCxcblx0XHRsb29wVGltZW91dCA9IG51bGw7XG5cblx0dmFyIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0bGV0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0aWYgKCAoIGxhc3RSdW4gKyA0MCApID4gbm93ICkge1xuXHRcdFx0aWYgKCBsb29wVGltZW91dCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bG9vcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggc2Nyb2xsSGFuZGxlciwgNDAgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGFzdFJ1biA9IG5vdztcblx0XHRsb29wVGltZW91dCAmJiAoIGxvb3BUaW1lb3V0ID0gbnVsbCApO1xuXG5cdFx0bGV0IG5leHQgPSBbXTtcblx0XHRmb3IgKCBsZXQgaSA9IGxvYWRMYXppbHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG5cdFx0XHRsZXQgaW1nID0gbG9hZExhemlseVtpXTtcblx0XHRcdGxldCBzaG91bGRTaG93ID0gaW1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSAoIHdpbmRvdy5pbm5lckhlaWdodCArIHRocmVzaG9sZCApO1xuXHRcdFx0aWYgKCAhIHNob3VsZFNob3cgKSB7XG5cdFx0XHRcdG5leHQucHVzaCggaW1nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsb2FkT3JpZ2luYWwoIGltZyApO1xuXHRcdH1cblx0XHRsb2FkTGF6aWx5ID0gbmV4dDtcblx0XHRpZiAoIGxvYWRMYXppbHkubGVuZ3RoIDwgMSApIHtcblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgc2Nyb2xsSGFuZGxlciApO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVuZGVyIGFsbCBwbGFjZWhvbGRlcnMgb24gdGhlIHBhZ2Vcblx0ICovXG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0bGV0IGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAnaW1nJyApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBpbWFnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG5cdFx0XHRsZXQgaW1nID0gaW1hZ2VzW2ldO1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGJsYW5rIEdJRiBoYXMgbG9hZGVkIGZpcnN0XG5cdFx0XHRpZiAoIGltZy5jb21wbGV0ZSApIHtcblx0XHRcdFx0aGFuZGxlRWxlbWVudCggaW1nICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhhbmRsZUVsZW1lbnQoIHRoaXMgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsb2FkTGF6aWx5ID0gaW1hZ2VzO1xuXHRcdHNjcm9sbEhhbmRsZXIoKTtcblxuXHRcdGlmICggbG9hZExhemlseS5sZW5ndGggPiAwICkge1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyICk7XG5cdFx0fVxuXHR9O1xufVxuIiwiZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NCggYnVmZmVyICkge1xuXHRsZXQgYmluYXJ5ID0gJyc7XG5cdGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KCBidWZmZXIgKTtcblx0bGV0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBieXRlc1sgaSBdICk7XG5cdH1cblx0cmV0dXJuIHdpbmRvdy5idG9hKCBiaW5hcnkgKTtcbn1cblxuZnVuY3Rpb24gcmVjb25zdGl0dXRlSW1hZ2UoIGhlYWRlciwgaW1hZ2UgKSB7XG5cdGxldCBpbWFnZV9kYXRhID0gaW1hZ2VbMF0sXG5cdFx0d2lkdGggPSBwYXJzZUludCggaW1hZ2VbMV0gKSxcblx0XHRoZWlnaHQgPSBwYXJzZUludCggaW1hZ2VbMl0gKTtcblxuXHRsZXQgZnVsbCA9IGF0b2IoIGhlYWRlci5oZWFkZXIgKSArIGF0b2IoIGltYWdlX2RhdGEgKTtcblx0bGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoIGZ1bGwubGVuZ3RoICk7XG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGZ1bGwubGVuZ3RoOyBpKysgKSB7XG5cdFx0Ynl0ZXNbaV0gPSBmdWxsLmNoYXJDb2RlQXQoIGkgKTtcblx0fVxuXG5cdC8vIFBva2UgdGhlIGJpdHMuXG5cdGJ5dGVzWyBoZWFkZXIuaGVpZ2h0X29mZnNldCBdID0gKCAoIGhlaWdodCA+PiA4ICkgJiAweEZGICk7XG5cdGJ5dGVzWyBoZWFkZXIuaGVpZ2h0X29mZnNldCArIDEgXSA9ICggaGVpZ2h0ICYgMHhGRiApO1xuXHRieXRlc1sgaGVhZGVyLmxlbmd0aF9vZmZzZXQgXSA9ICggKCB3aWR0aCA+PiA4ICkgJiAweEZGICk7XG5cdGJ5dGVzWyBoZWFkZXIubGVuZ3RoX29mZnNldCArIDFdID0gKCB3aWR0aCAmIDB4RkYgKTtcblxuXHQvLyBCYWNrIHRvIGEgZnVsbCBKUEVHIG5vdy5cblx0cmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjQoIGJ5dGVzICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlY29uc3RpdHV0ZUltYWdlO1xuIiwiaW1wb3J0IHJlY29uc3RpdHV0ZUltYWdlIGZyb20gJy4vcmVjb25zdGl0dXRlLWltYWdlJztcbmltcG9ydCBTdGFja0JsdXIgZnJvbSAnLi9zdGFja2JsdXInO1xuXG5jb25zdCB7IEdhdXNzaG9sZGVySGVhZGVyIH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVuZGVyIGFuIGltYWdlIGludG8gYSBDYW52YXNcbiAqXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgQ2FudmFzIGVsZW1lbnQgdG8gcmVuZGVyIGludG9cbiAqIEBwYXJhbSB7bGlzdH0gaW1hZ2UgMy10dXBsZSBvZiBiYXNlNjQtZW5jb2RlZCBpbWFnZSBkYXRhLCB3aWR0aCwgaGVpZ2h0XG4gKiBAcGFyYW0ge2xpc3R9IGZpbmFsIEZpbmFsIHdpZHRoIGFuZCBoZWlnaHRcbiAqL1xuZnVuY3Rpb24gcmVuZGVySW1hZ2VJbnRvQ2FudmFzKCBjYW52YXMsIGltYWdlLCBmaW5hbCwgY2IgKSB7XG5cdGxldCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApLFxuXHRcdHdpZHRoID0gcGFyc2VJbnQoIGZpbmFsWzBdICksXG5cdFx0aGVpZ2h0ID0gcGFyc2VJbnQoIGZpbmFsWzFdICksXG5cdFx0cmFkaXVzID0gcGFyc2VJbnQoIGZpbmFsWzJdICk7XG5cblx0Ly8gRW5zdXJlIHNtb290aGluZyBpcyBvZmZcblx0Y3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRjdHgud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cdGN0eC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0bGV0IGltZyA9IG5ldyBJbWFnZSgpO1xuXHRpbWcuc3JjID0gJ2RhdGE6aW1hZ2UvanBnO2Jhc2U2NCwnICsgcmVjb25zdGl0dXRlSW1hZ2UoIEdhdXNzaG9sZGVySGVhZGVyLCBpbWFnZSApO1xuXHRpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuXHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRjdHguZHJhd0ltYWdlKCBpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHRTdGFja0JsdXIuY2FudmFzUkdCKCBjYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIHJhZGl1cyApO1xuXHRcdGNiKCk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlbmRlckltYWdlSW50b0NhbnZhcztcbiIsIi8qXG4gICAgU3RhY2tCbHVyIC0gYSBmYXN0IGFsbW9zdCBHYXVzc2lhbiBCbHVyIEZvciBDYW52YXNcblxuICAgIFZlcnNpb246ICAgICAwLjVcbiAgICBBdXRob3I6ICAgICAgICBNYXJpbyBLbGluZ2VtYW5uXG4gICAgQ29udGFjdDogICAgIG1hcmlvQHF1YXNpbW9uZG8uY29tXG4gICAgV2Vic2l0ZTogICAgaHR0cDovL3d3dy5xdWFzaW1vbmRvLmNvbS9TdGFja0JsdXJGb3JDYW52YXNcbiAgICBUd2l0dGVyOiAgICBAcXVhc2ltb25kb1xuXG4gICAgSW4gY2FzZSB5b3UgZmluZCB0aGlzIGNsYXNzIHVzZWZ1bCAtIGVzcGVjaWFsbHkgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyAtXG4gICAgSSBhbSBub3QgdG90YWxseSB1bmhhcHB5IGZvciBhIHNtYWxsIGRvbmF0aW9uIHRvIG15IFBheVBhbCBhY2NvdW50XG4gICAgbWFyaW9AcXVhc2ltb25kby5kZVxuXG4gICAgT3Igc3VwcG9ydCBtZSBvbiBmbGF0dHI6XG4gICAgaHR0cHM6Ly9mbGF0dHIuY29tL3RoaW5nLzcyNzkxL1N0YWNrQmx1ci1hLWZhc3QtYWxtb3N0LUdhdXNzaWFuLUJsdXItRWZmZWN0LWZvci1DYW52YXNKYXZhc2NyaXB0XG5cbiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgTWFyaW8gS2xpbmdlbWFublxuXG4gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvblxuICAgIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dFxuICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLFxuICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmdcbiAgICBjb25kaXRpb25zOlxuXG4gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTXG4gICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLFxuICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1JcbiAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gICAgKi9cblxudmFyIFN0YWNrQmx1ciA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBtdWxfdGFibGUgPSBbXG5cdCAgICA1MTIsNTEyLDQ1Niw1MTIsMzI4LDQ1NiwzMzUsNTEyLDQwNSwzMjgsMjcxLDQ1NiwzODgsMzM1LDI5Miw1MTIsXG5cdCAgICA0NTQsNDA1LDM2NCwzMjgsMjk4LDI3MSw0OTYsNDU2LDQyMCwzODgsMzYwLDMzNSwzMTIsMjkyLDI3Myw1MTIsXG5cdCAgICA0ODIsNDU0LDQyOCw0MDUsMzgzLDM2NCwzNDUsMzI4LDMxMiwyOTgsMjg0LDI3MSwyNTksNDk2LDQ3NSw0NTYsXG5cdCAgICA0MzcsNDIwLDQwNCwzODgsMzc0LDM2MCwzNDcsMzM1LDMyMywzMTIsMzAyLDI5MiwyODIsMjczLDI2NSw1MTIsXG5cdCAgICA0OTcsNDgyLDQ2OCw0NTQsNDQxLDQyOCw0MTcsNDA1LDM5NCwzODMsMzczLDM2NCwzNTQsMzQ1LDMzNywzMjgsXG5cdCAgICAzMjAsMzEyLDMwNSwyOTgsMjkxLDI4NCwyNzgsMjcxLDI2NSwyNTksNTA3LDQ5Niw0ODUsNDc1LDQ2NSw0NTYsXG5cdCAgICA0NDYsNDM3LDQyOCw0MjAsNDEyLDQwNCwzOTYsMzg4LDM4MSwzNzQsMzY3LDM2MCwzNTQsMzQ3LDM0MSwzMzUsXG5cdCAgICAzMjksMzIzLDMxOCwzMTIsMzA3LDMwMiwyOTcsMjkyLDI4NywyODIsMjc4LDI3MywyNjksMjY1LDI2MSw1MTIsXG5cdCAgICA1MDUsNDk3LDQ4OSw0ODIsNDc1LDQ2OCw0NjEsNDU0LDQ0Nyw0NDEsNDM1LDQyOCw0MjIsNDE3LDQxMSw0MDUsXG5cdCAgICAzOTksMzk0LDM4OSwzODMsMzc4LDM3MywzNjgsMzY0LDM1OSwzNTQsMzUwLDM0NSwzNDEsMzM3LDMzMiwzMjgsXG5cdCAgICAzMjQsMzIwLDMxNiwzMTIsMzA5LDMwNSwzMDEsMjk4LDI5NCwyOTEsMjg3LDI4NCwyODEsMjc4LDI3NCwyNzEsXG5cdCAgICAyNjgsMjY1LDI2MiwyNTksMjU3LDUwNyw1MDEsNDk2LDQ5MSw0ODUsNDgwLDQ3NSw0NzAsNDY1LDQ2MCw0NTYsXG5cdCAgICA0NTEsNDQ2LDQ0Miw0MzcsNDMzLDQyOCw0MjQsNDIwLDQxNiw0MTIsNDA4LDQwNCw0MDAsMzk2LDM5MiwzODgsXG5cdCAgICAzODUsMzgxLDM3NywzNzQsMzcwLDM2NywzNjMsMzYwLDM1NywzNTQsMzUwLDM0NywzNDQsMzQxLDMzOCwzMzUsXG5cdCAgICAzMzIsMzI5LDMyNiwzMjMsMzIwLDMxOCwzMTUsMzEyLDMxMCwzMDcsMzA0LDMwMiwyOTksMjk3LDI5NCwyOTIsXG5cdCAgICAyODksMjg3LDI4NSwyODIsMjgwLDI3OCwyNzUsMjczLDI3MSwyNjksMjY3LDI2NSwyNjMsMjYxLDI1OV07XG5cblxuXHR2YXIgc2hnX3RhYmxlID0gW1xuXHQgICAgOSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNyxcblx0ICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LFxuXHQgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsXG5cdCAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSxcblx0ICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLFxuXHQgICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG5cdCAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMixcblx0ICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLFxuXHQgICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG5cdCAgICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMyxcblx0ICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLFxuXHQgICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG5cdCAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcblx0ICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxuXHQgICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG5cdCAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0IF07XG5cblxuXHRmdW5jdGlvbiBnZXRJbWFnZURhdGFGcm9tQ2FudmFzKGNhbnZhcywgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KVxuXHR7XG5cdCAgICBpZiAodHlwZW9mKGNhbnZhcykgPT0gJ3N0cmluZycpXG5cdCAgICAgICAgdmFyIGNhbnZhcyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYW52YXMpO1xuXHQgICAgZWxzZSBpZiAoIWNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KVxuXHQgICAgICAgIHJldHVybjtcblxuXHQgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblx0ICAgIHZhciBpbWFnZURhdGE7XG5cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gdHJ5IHtcblx0ICAgICAgICAgICAgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEodG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgICAvKn0gY2F0Y2goZSkge1xuXG5cdCAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgcGFydCBpcyBzdXBwb3NlZGx5IG9ubHkgbmVlZGVkIGlmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBsb2NhbCBmaWxlc1xuXHQgICAgICAgICAgICAvLyBzbyBpdCBtaWdodCBiZSBva2F5IHRvIHJlbW92ZSB0aGUgd2hvbGUgdHJ5L2NhdGNoIGJsb2NrIGFuZCBqdXN0IHVzZVxuXHQgICAgICAgICAgICAvLyBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSh0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoXCJVbml2ZXJzYWxCcm93c2VyUmVhZFwiKTtcblx0ICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuXHQgICAgICAgICAgICAgICAgYWxlcnQoXCJDYW5ub3QgYWNjZXNzIGxvY2FsIGltYWdlXCIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBsb2NhbCBpbWFnZSBkYXRhOiBcIiArIGUpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSovXG5cdCAgICB9IGNhdGNoKGUpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gYWNjZXNzIGltYWdlIGRhdGE6IFwiICsgZSk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBpbWFnZURhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm9jZXNzQ2FudmFzUkdCKGNhbnZhcywgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpXG5cdHtcblx0ICAgIGlmIChpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEpIHJldHVybjtcblx0ICAgIHJhZGl1cyB8PSAwO1xuXG5cdCAgICB2YXIgaW1hZ2VEYXRhID0gZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyhjYW52YXMsIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICBpbWFnZURhdGEgPSBwcm9jZXNzSW1hZ2VEYXRhUkdCKGltYWdlRGF0YSwgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpO1xuXG5cdCAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB0b3BfeCwgdG9wX3kpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc0ltYWdlRGF0YVJHQihpbWFnZURhdGEsIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKVxuXHR7XG5cdCAgICB2YXIgcGl4ZWxzID0gaW1hZ2VEYXRhLmRhdGE7XG5cblx0ICAgIHZhciB4LCB5LCBpLCBwLCB5cCwgeWksIHl3LCByX3N1bSwgZ19zdW0sIGJfc3VtLFxuXHQgICAgICAgIHJfb3V0X3N1bSwgZ19vdXRfc3VtLCBiX291dF9zdW0sXG5cdCAgICAgICAgcl9pbl9zdW0sIGdfaW5fc3VtLCBiX2luX3N1bSxcblx0ICAgICAgICBwciwgcGcsIHBiLCByYnM7XG5cblx0ICAgIHZhciBkaXYgPSByYWRpdXMgKyByYWRpdXMgKyAxO1xuXHQgICAgdmFyIHc0ID0gd2lkdGggPDwgMjtcblx0ICAgIHZhciB3aWR0aE1pbnVzMSAgPSB3aWR0aCAtIDE7XG5cdCAgICB2YXIgaGVpZ2h0TWludXMxID0gaGVpZ2h0IC0gMTtcblx0ICAgIHZhciByYWRpdXNQbHVzMSAgPSByYWRpdXMgKyAxO1xuXHQgICAgdmFyIHN1bUZhY3RvciA9IHJhZGl1c1BsdXMxICogKHJhZGl1c1BsdXMxICsgMSkgLyAyO1xuXG5cdCAgICB2YXIgc3RhY2tTdGFydCA9IG5ldyBCbHVyU3RhY2soKTtcblx0ICAgIHZhciBzdGFjayA9IHN0YWNrU3RhcnQ7XG5cdCAgICBmb3IgKGkgPSAxOyBpIDwgZGl2OyBpKyspXG5cdCAgICB7XG5cdCAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0ID0gbmV3IEJsdXJTdGFjaygpO1xuXHQgICAgICAgIGlmIChpID09IHJhZGl1c1BsdXMxKSB2YXIgc3RhY2tFbmQgPSBzdGFjaztcblx0ICAgIH1cblx0ICAgIHN0YWNrLm5leHQgPSBzdGFja1N0YXJ0O1xuXHQgICAgdmFyIHN0YWNrSW4gPSBudWxsO1xuXHQgICAgdmFyIHN0YWNrT3V0ID0gbnVsbDtcblxuXHQgICAgeXcgPSB5aSA9IDA7XG5cblx0ICAgIHZhciBtdWxfc3VtID0gbXVsX3RhYmxlW3JhZGl1c107XG5cdCAgICB2YXIgc2hnX3N1bSA9IHNoZ190YWJsZVtyYWRpdXNdO1xuXG5cdCAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspXG5cdCAgICB7XG5cdCAgICAgICAgcl9pbl9zdW0gPSBnX2luX3N1bSA9IGJfaW5fc3VtID0gcl9zdW0gPSBnX3N1bSA9IGJfc3VtID0gMDtcblxuXHQgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XG5cdCAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkrMV0pO1xuXHQgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpKzJdKTtcblxuXHQgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xuXHQgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xuXHQgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuXG5cdCAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBzdGFjay5yID0gcHI7XG5cdCAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcblx0ICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZm9yIChpID0gMTsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgaSA/IHdpZHRoTWludXMxIDogaSkgPDwgMik7XG5cdCAgICAgICAgICAgIHJfc3VtICs9IChzdGFjay5yID0gKHByID0gcGl4ZWxzW3BdKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcblx0ICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbcCsxXSkpICogcmJzO1xuXHQgICAgICAgICAgICBiX3N1bSArPSAoc3RhY2suYiA9IChwYiA9IHBpeGVsc1twKzJdKSkgKiByYnM7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gKz0gcHI7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtICs9IHBnO1xuXHQgICAgICAgICAgICBiX2luX3N1bSArPSBwYjtcblxuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cblx0ICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcblx0ICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXHQgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKVxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpXSAgID0gKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpKzFdID0gKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpKzJdID0gKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblxuXHQgICAgICAgICAgICByX3N1bSAtPSByX291dF9zdW07XG5cdCAgICAgICAgICAgIGdfc3VtIC09IGdfb3V0X3N1bTtcblx0ICAgICAgICAgICAgYl9zdW0gLT0gYl9vdXRfc3VtO1xuXG5cdCAgICAgICAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XG5cdCAgICAgICAgICAgIGdfb3V0X3N1bSAtPSBzdGFja0luLmc7XG5cdCAgICAgICAgICAgIGJfb3V0X3N1bSAtPSBzdGFja0luLmI7XG5cblx0ICAgICAgICAgICAgcCA9ICAoeXcgKyAoKHAgPSB4ICsgcmFkaXVzICsgMSkgPCB3aWR0aE1pbnVzMSA/IHAgOiB3aWR0aE1pbnVzMSkpIDw8IDI7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gKz0gKHN0YWNrSW4uciA9IHBpeGVsc1twXSk7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtICs9IChzdGFja0luLmcgPSBwaXhlbHNbcCsxXSk7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCsyXSk7XG5cblx0ICAgICAgICAgICAgcl9zdW0gKz0gcl9pbl9zdW07XG5cdCAgICAgICAgICAgIGdfc3VtICs9IGdfaW5fc3VtO1xuXHQgICAgICAgICAgICBiX3N1bSArPSBiX2luX3N1bTtcblxuXHQgICAgICAgICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuXG5cdCAgICAgICAgICAgIHJfb3V0X3N1bSArPSAocHIgPSBzdGFja091dC5yKTtcblx0ICAgICAgICAgICAgZ19vdXRfc3VtICs9IChwZyA9IHN0YWNrT3V0LmcpO1xuXHQgICAgICAgICAgICBiX291dF9zdW0gKz0gKHBiID0gc3RhY2tPdXQuYik7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gLT0gcHI7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtIC09IHBnO1xuXHQgICAgICAgICAgICBiX2luX3N1bSAtPSBwYjtcblxuXHQgICAgICAgICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG5cblx0ICAgICAgICAgICAgeWkgKz0gNDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgeXcgKz0gd2lkdGg7XG5cdCAgICB9XG5cblxuXHQgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspXG5cdCAgICB7XG5cdCAgICAgICAgZ19pbl9zdW0gPSBiX2luX3N1bSA9IHJfaW5fc3VtID0gZ19zdW0gPSBiX3N1bSA9IHJfc3VtID0gMDtcblxuXHQgICAgICAgIHlpID0geCA8PCAyO1xuXHQgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XG5cdCAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkrMV0pO1xuXHQgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpKzJdKTtcblxuXHQgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xuXHQgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xuXHQgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuXG5cdCAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBzdGFjay5yID0gcHI7XG5cdCAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcblx0ICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgeXAgPSB3aWR0aDtcblxuXHQgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcmFkaXVzOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB5aSA9ICh5cCArIHgpIDw8IDI7XG5cblx0ICAgICAgICAgICAgcl9zdW0gKz0gKHN0YWNrLnIgPSAocHIgPSBwaXhlbHNbeWldKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcblx0ICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbeWkrMV0pKSAqIHJicztcblx0ICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbeWkrMl0pKSAqIHJicztcblxuXHQgICAgICAgICAgICByX2luX3N1bSArPSBwcjtcblx0ICAgICAgICAgICAgZ19pbl9zdW0gKz0gcGc7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtICs9IHBiO1xuXG5cdCAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcblxuXHQgICAgICAgICAgICBpZihpIDwgaGVpZ2h0TWludXMxKVxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICB5cCArPSB3aWR0aDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHlpID0geDtcblx0ICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcblx0ICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXHQgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKylcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHAgPSB5aSA8PCAyO1xuXHQgICAgICAgICAgICBwaXhlbHNbcF0gICA9IChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW07XG5cdCAgICAgICAgICAgIHBpeGVsc1twKzFdID0gKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3ArMl0gPSAoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xuXG5cdCAgICAgICAgICAgIHJfc3VtIC09IHJfb3V0X3N1bTtcblx0ICAgICAgICAgICAgZ19zdW0gLT0gZ19vdXRfc3VtO1xuXHQgICAgICAgICAgICBiX3N1bSAtPSBiX291dF9zdW07XG5cblx0ICAgICAgICAgICAgcl9vdXRfc3VtIC09IHN0YWNrSW4ucjtcblx0ICAgICAgICAgICAgZ19vdXRfc3VtIC09IHN0YWNrSW4uZztcblx0ICAgICAgICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcblxuXHQgICAgICAgICAgICBwID0gKHggKyAoKChwID0geSArIHJhZGl1c1BsdXMxKSA8IGhlaWdodE1pbnVzMSA/IHAgOiBoZWlnaHRNaW51czEpICogd2lkdGgpKSA8PCAyO1xuXG5cdCAgICAgICAgICAgIHJfc3VtICs9IChyX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKSk7XG5cdCAgICAgICAgICAgIGdfc3VtICs9IChnX2luX3N1bSArPSAoc3RhY2tJbi5nID0gcGl4ZWxzW3ArMV0pKTtcblx0ICAgICAgICAgICAgYl9zdW0gKz0gKGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCsyXSkpO1xuXG5cdCAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XG5cblx0ICAgICAgICAgICAgcl9vdXRfc3VtICs9IChwciA9IHN0YWNrT3V0LnIpO1xuXHQgICAgICAgICAgICBnX291dF9zdW0gKz0gKHBnID0gc3RhY2tPdXQuZyk7XG5cdCAgICAgICAgICAgIGJfb3V0X3N1bSArPSAocGIgPSBzdGFja091dC5iKTtcblxuXHQgICAgICAgICAgICByX2luX3N1bSAtPSBwcjtcblx0ICAgICAgICAgICAgZ19pbl9zdW0gLT0gcGc7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtIC09IHBiO1xuXG5cdCAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcblxuXHQgICAgICAgICAgICB5aSArPSB3aWR0aDtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBpbWFnZURhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBCbHVyU3RhY2soKVxuXHR7XG5cdCAgICB0aGlzLnIgPSAwO1xuXHQgICAgdGhpcy5nID0gMDtcblx0ICAgIHRoaXMuYiA9IDA7XG5cdCAgICB0aGlzLmEgPSAwO1xuXHQgICAgdGhpcy5uZXh0ID0gbnVsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdCAgICBjYW52YXNSR0I6IHByb2Nlc3NDYW52YXNSR0Jcblx0fTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTdGFja0JsdXI7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file From f8b06bde34ac403f1c107518e6ca2d50899527d3 Mon Sep 17 00:00:00 2001 From: Ignacio Cruz Date: Wed, 18 Nov 2020 10:31:56 +0100 Subject: [PATCH 9/9] Revert "Unignore dist folder" This reverts commit 44cbfe98798c56e3a77c24788743f40f01796679. --- .gitignore | 1 + dist/gaussholder.min.js | 655 ---------------------------------------- 2 files changed, 1 insertion(+), 655 deletions(-) delete mode 100644 dist/gaussholder.min.js diff --git a/.gitignore b/.gitignore index 24742b4..8cf7790 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ # Composer /vendor /node_modules +/dist diff --git a/dist/gaussholder.min.js b/dist/gaussholder.min.js deleted file mode 100644 index 1e67cbb..0000000 --- a/dist/gaussholder.min.js +++ /dev/null @@ -1,655 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./assets/index.js": -/*!*************************!*\ - !*** ./assets/index.js ***! - \*************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _src_gaussholder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/gaussholder */ "./assets/src/gaussholder.js"); - -window.Gaussholder = Object(_src_gaussholder__WEBPACK_IMPORTED_MODULE_0__["default"])(); - -/***/ }), - -/***/ "./assets/src/gaussholder.js": -/*!***********************************!*\ - !*** ./assets/src/gaussholder.js ***! - \***********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _render_image_into_canvas__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./render-image-into-canvas */ "./assets/src/render-image-into-canvas.js"); - // Fade duration in ms when the image loads in. - -var FADE_DURATION = 800; -/* harmony default export */ __webpack_exports__["default"] = (function () { - /** - * Render placeholder for an image - * - * @param {HTMLImageElement} element Element to render placeholder for - */ - var handleElement = function handleElement(element) { - if (!('gaussholder' in element.dataset)) { - return; - } - - var canvas = document.createElement('canvas'); - var final = element.dataset.gaussholderSize.split(','); // Set the dimensions... - - element.style.width = final[0] + 'px'; - element.style.height = final[1] + 'px'; // ...then recalculate based on what it actually renders as - - var original = [final[0], final[1]]; - - if (element.width < final[0]) { - // Rescale, keeping the aspect ratio - final[0] = element.width; - final[1] = final[1] * (final[0] / original[0]); - } else if (element.height < final[1]) { - // Rescale, keeping the aspect ratio - final[1] = element.height; - final[0] = final[0] * (final[1] / original[1]); - } // Set dimensions, _again_ - - - element.style.width = final[0] + 'px'; - element.style.height = final[1] + 'px'; - Object(_render_image_into_canvas__WEBPACK_IMPORTED_MODULE_0__["default"])(canvas, element.dataset.gaussholder.split(','), final, function () { - // Load in as our background image - element.style.backgroundImage = 'url("' + canvas.toDataURL() + '")'; - element.style.backgroundRepeat = 'no-repeat'; - }); - }; - - var loadOriginal = function loadOriginal(element) { - if (!('originalsrc' in element.dataset) && !('originalsrcset' in element.dataset)) { - return; - } - - var data = element.dataset.gaussholderSize.split(','), - radius = parseInt(data[2]); // Load our image now - - var img = new Image(); - - if (element.dataset.originalsrc) { - img.src = element.dataset.originalsrc; - } - - if (element.dataset.originalsrcset) { - img.srcset = element.dataset.originalsrcset; - } - - img.onload = function () { - // Filter property to use - var filterProp = 'webkitFilter' in element.style ? 'webkitFilter' : 'filter'; - element.style[filterProp] = 'blur(' + radius * 0.5 + 'px)'; // Ensure blur doesn't bleed past image border - - element.style.clipPath = 'url(#gaussclip)'; // Current FF - - element.style.clipPath = 'inset(0)'; // Standard - - element.style.webkitClipPath = 'inset(0)'; // WebKit - // Set the actual source - - element.src = img.src; - element.srcset = img.srcset; // Cleaning source - - element.dataset.originalsrc = ''; - element.dataset.originalsrcset = ''; // Clear placeholder temporary image - // (We do this after setting the source, as doing it before can - // cause a tiny flicker) - - element.style.backgroundImage = ''; - element.style.backgroundRepeat = ''; - var start = 0; - - var anim = function anim(ts) { - if (!start) start = ts; - var diff = ts - start; - - if (diff > FADE_DURATION) { - element.style[filterProp] = ''; - element.style.clipPath = ''; - element.style.webkitClipPath = ''; - return; - } - - var effectiveRadius = radius * (1 - diff / FADE_DURATION); - element.style[filterProp] = 'blur(' + effectiveRadius * 0.5 + 'px)'; - window.requestAnimationFrame(anim); - }; - - window.requestAnimationFrame(anim); - }; - }; - - var loadLazily = []; - var threshold = 1200; - var lastRun = 0, - loopTimeout = null; - - var scrollHandler = function scrollHandler() { - var now = Date.now(); - - if (lastRun + 40 > now) { - if (loopTimeout) { - return; - } - - loopTimeout = window.setTimeout(scrollHandler, 40); - return; - } - - lastRun = now; - loopTimeout && (loopTimeout = null); - var next = []; - - for (var i = loadLazily.length - 1; i >= 0; i--) { - var img = loadLazily[i]; - var shouldShow = img.getBoundingClientRect().top <= window.innerHeight + threshold; - - if (!shouldShow) { - next.push(img); - continue; - } - - loadOriginal(img); - } - - loadLazily = next; - - if (loadLazily.length < 1) { - window.removeEventListener('scroll', scrollHandler); - } - }; - /** - * Render all placeholders on the page - */ - - - return function () { - var images = document.getElementsByTagName('img'); - - for (var i = images.length - 1; i >= 0; i--) { - var img = images[i]; // Ensure the blank GIF has loaded first - - if (img.complete) { - handleElement(img); - } else { - img.onload = function () { - handleElement(this); - }; - } - } - - loadLazily = images; - scrollHandler(); - - if (loadLazily.length > 0) { - window.addEventListener('scroll', scrollHandler); - } - }; -}); - -/***/ }), - -/***/ "./assets/src/reconstitute-image.js": -/*!******************************************!*\ - !*** ./assets/src/reconstitute-image.js ***! - \******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -function arrayBufferToBase64(buffer) { - var binary = ''; - var bytes = new Uint8Array(buffer); - var len = bytes.byteLength; - - for (var i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - - return window.btoa(binary); -} - -function reconstituteImage(header, image) { - var image_data = image[0], - width = parseInt(image[1]), - height = parseInt(image[2]); - var full = atob(header.header) + atob(image_data); - var bytes = new Uint8Array(full.length); - - for (var i = 0; i < full.length; i++) { - bytes[i] = full.charCodeAt(i); - } // Poke the bits. - - - bytes[header.height_offset] = height >> 8 & 0xFF; - bytes[header.height_offset + 1] = height & 0xFF; - bytes[header.length_offset] = width >> 8 & 0xFF; - bytes[header.length_offset + 1] = width & 0xFF; // Back to a full JPEG now. - - return arrayBufferToBase64(bytes); -} - -/* harmony default export */ __webpack_exports__["default"] = (reconstituteImage); - -/***/ }), - -/***/ "./assets/src/render-image-into-canvas.js": -/*!************************************************!*\ - !*** ./assets/src/render-image-into-canvas.js ***! - \************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _reconstitute_image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reconstitute-image */ "./assets/src/reconstitute-image.js"); -/* harmony import */ var _stackblur__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stackblur */ "./assets/src/stackblur.js"); - - -var _window = window, - GaussholderHeader = _window.GaussholderHeader; -/** - * Render an image into a Canvas - * - * @param {HTMLCanvasElement} canvas Canvas element to render into - * @param {list} image 3-tuple of base64-encoded image data, width, height - * @param {list} final Final width and height - */ - -function renderImageIntoCanvas(canvas, image, final, cb) { - var ctx = canvas.getContext('2d'), - width = parseInt(final[0]), - height = parseInt(final[1]), - radius = parseInt(final[2]); // Ensure smoothing is off - - ctx.mozImageSmoothingEnabled = false; - ctx.webkitImageSmoothingEnabled = false; - ctx.msImageSmoothingEnabled = false; - ctx.imageSmoothingEnabled = false; - var img = new Image(); - img.src = 'data:image/jpg;base64,' + Object(_reconstitute_image__WEBPACK_IMPORTED_MODULE_0__["default"])(GaussholderHeader, image); - - img.onload = function () { - canvas.width = width; - canvas.height = height; - ctx.drawImage(img, 0, 0, width, height); - _stackblur__WEBPACK_IMPORTED_MODULE_1__["default"].canvasRGB(canvas, 0, 0, width, height, radius); - cb(); - }; -} - -/* harmony default export */ __webpack_exports__["default"] = (renderImageIntoCanvas); - -/***/ }), - -/***/ "./assets/src/stackblur.js": -/*!*********************************!*\ - !*** ./assets/src/stackblur.js ***! - \*********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* - StackBlur - a fast almost Gaussian Blur For Canvas - - Version: 0.5 - Author: Mario Klingemann - Contact: mario@quasimondo.com - Website: http://www.quasimondo.com/StackBlurForCanvas - Twitter: @quasimondo - - In case you find this class useful - especially in commercial projects - - I am not totally unhappy for a small donation to my PayPal account - mario@quasimondo.de - - Or support me on flattr: - https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript - - Copyright (c) 2010 Mario Klingemann - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - */ -var StackBlur = function StackBlur() { - var mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; - var shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; - - function getImageDataFromCanvas(canvas, top_x, top_y, width, height) { - if (typeof canvas == 'string') var canvas = document.getElementById(canvas);else if (!canvas instanceof HTMLCanvasElement) return; - var context = canvas.getContext('2d'); - var imageData; - - try { - // try { - imageData = context.getImageData(top_x, top_y, width, height); - /*} catch(e) { - // NOTE: this part is supposedly only needed if you want to work with local files - // so it might be okay to remove the whole try/catch block and just use - // imageData = context.getImageData(top_x, top_y, width, height); - try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); - imageData = context.getImageData(top_x, top_y, width, height); - } catch(e) { - alert("Cannot access local image"); - throw new Error("unable to access local image data: " + e); - return; - } - }*/ - } catch (e) { - throw new Error("unable to access image data: " + e); - } - - return imageData; - } - - function processCanvasRGB(canvas, top_x, top_y, width, height, radius) { - if (isNaN(radius) || radius < 1) return; - radius |= 0; - var imageData = getImageDataFromCanvas(canvas, top_x, top_y, width, height); - imageData = processImageDataRGB(imageData, top_x, top_y, width, height, radius); - canvas.getContext('2d').putImageData(imageData, top_x, top_y); - } - - function processImageDataRGB(imageData, top_x, top_y, width, height, radius) { - var pixels = imageData.data; - var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, r_out_sum, g_out_sum, b_out_sum, r_in_sum, g_in_sum, b_in_sum, pr, pg, pb, rbs; - var div = radius + radius + 1; - var w4 = width << 2; - var widthMinus1 = width - 1; - var heightMinus1 = height - 1; - var radiusPlus1 = radius + 1; - var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; - var stackStart = new BlurStack(); - var stack = stackStart; - - for (i = 1; i < div; i++) { - stack = stack.next = new BlurStack(); - if (i == radiusPlus1) var stackEnd = stack; - } - - stack.next = stackStart; - var stackIn = null; - var stackOut = null; - yw = yi = 0; - var mul_sum = mul_table[radius]; - var shg_sum = shg_table[radius]; - - for (y = 0; y < height; y++) { - r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; - r_out_sum = radiusPlus1 * (pr = pixels[yi]); - g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); - b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); - r_sum += sumFactor * pr; - g_sum += sumFactor * pg; - b_sum += sumFactor * pb; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack = stack.next; - } - - for (i = 1; i < radiusPlus1; i++) { - p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); - r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i); - g_sum += (stack.g = pg = pixels[p + 1]) * rbs; - b_sum += (stack.b = pb = pixels[p + 2]) * rbs; - r_in_sum += pr; - g_in_sum += pg; - b_in_sum += pb; - stack = stack.next; - } - - stackIn = stackStart; - stackOut = stackEnd; - - for (x = 0; x < width; x++) { - pixels[yi] = r_sum * mul_sum >> shg_sum; - pixels[yi + 1] = g_sum * mul_sum >> shg_sum; - pixels[yi + 2] = b_sum * mul_sum >> shg_sum; - r_sum -= r_out_sum; - g_sum -= g_out_sum; - b_sum -= b_out_sum; - r_out_sum -= stackIn.r; - g_out_sum -= stackIn.g; - b_out_sum -= stackIn.b; - p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2; - r_in_sum += stackIn.r = pixels[p]; - g_in_sum += stackIn.g = pixels[p + 1]; - b_in_sum += stackIn.b = pixels[p + 2]; - r_sum += r_in_sum; - g_sum += g_in_sum; - b_sum += b_in_sum; - stackIn = stackIn.next; - r_out_sum += pr = stackOut.r; - g_out_sum += pg = stackOut.g; - b_out_sum += pb = stackOut.b; - r_in_sum -= pr; - g_in_sum -= pg; - b_in_sum -= pb; - stackOut = stackOut.next; - yi += 4; - } - - yw += width; - } - - for (x = 0; x < width; x++) { - g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; - yi = x << 2; - r_out_sum = radiusPlus1 * (pr = pixels[yi]); - g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); - b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); - r_sum += sumFactor * pr; - g_sum += sumFactor * pg; - b_sum += sumFactor * pb; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack = stack.next; - } - - yp = width; - - for (i = 1; i <= radius; i++) { - yi = yp + x << 2; - r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i); - g_sum += (stack.g = pg = pixels[yi + 1]) * rbs; - b_sum += (stack.b = pb = pixels[yi + 2]) * rbs; - r_in_sum += pr; - g_in_sum += pg; - b_in_sum += pb; - stack = stack.next; - - if (i < heightMinus1) { - yp += width; - } - } - - yi = x; - stackIn = stackStart; - stackOut = stackEnd; - - for (y = 0; y < height; y++) { - p = yi << 2; - pixels[p] = r_sum * mul_sum >> shg_sum; - pixels[p + 1] = g_sum * mul_sum >> shg_sum; - pixels[p + 2] = b_sum * mul_sum >> shg_sum; - r_sum -= r_out_sum; - g_sum -= g_out_sum; - b_sum -= b_out_sum; - r_out_sum -= stackIn.r; - g_out_sum -= stackIn.g; - b_out_sum -= stackIn.b; - p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2; - r_sum += r_in_sum += stackIn.r = pixels[p]; - g_sum += g_in_sum += stackIn.g = pixels[p + 1]; - b_sum += b_in_sum += stackIn.b = pixels[p + 2]; - stackIn = stackIn.next; - r_out_sum += pr = stackOut.r; - g_out_sum += pg = stackOut.g; - b_out_sum += pb = stackOut.b; - r_in_sum -= pr; - g_in_sum -= pg; - b_in_sum -= pb; - stackOut = stackOut.next; - yi += width; - } - } - - return imageData; - } - - function BlurStack() { - this.r = 0; - this.g = 0; - this.b = 0; - this.a = 0; - this.next = null; - } - - return { - canvasRGB: processCanvasRGB - }; -}; - -/* harmony default export */ __webpack_exports__["default"] = (StackBlur); - -/***/ }), - -/***/ 0: -/*!*******************************!*\ - !*** multi ./assets/index.js ***! - \*******************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! ./assets/index.js */"./assets/index.js"); - - -/***/ }) - -/******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZ2F1c3Nob2xkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9yZWNvbnN0aXR1dGUtaW1hZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9yZW5kZXItaW1hZ2UtaW50by1jYW52YXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9zdGFja2JsdXIuanMiXSwibmFtZXMiOlsid2luZG93IiwiR2F1c3Nob2xkZXIiLCJGQURFX0RVUkFUSU9OIiwiaGFuZGxlRWxlbWVudCIsImVsZW1lbnQiLCJkYXRhc2V0IiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmluYWwiLCJnYXVzc2hvbGRlclNpemUiLCJzcGxpdCIsInN0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJvcmlnaW5hbCIsInJlbmRlckltYWdlSW50b0NhbnZhcyIsImdhdXNzaG9sZGVyIiwiYmFja2dyb3VuZEltYWdlIiwidG9EYXRhVVJMIiwiYmFja2dyb3VuZFJlcGVhdCIsImxvYWRPcmlnaW5hbCIsImRhdGEiLCJyYWRpdXMiLCJwYXJzZUludCIsImltZyIsIkltYWdlIiwib3JpZ2luYWxzcmMiLCJzcmMiLCJvcmlnaW5hbHNyY3NldCIsInNyY3NldCIsIm9ubG9hZCIsImZpbHRlclByb3AiLCJjbGlwUGF0aCIsIndlYmtpdENsaXBQYXRoIiwic3RhcnQiLCJhbmltIiwidHMiLCJkaWZmIiwiZWZmZWN0aXZlUmFkaXVzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibG9hZExhemlseSIsInRocmVzaG9sZCIsImxhc3RSdW4iLCJsb29wVGltZW91dCIsInNjcm9sbEhhbmRsZXIiLCJub3ciLCJEYXRlIiwic2V0VGltZW91dCIsIm5leHQiLCJpIiwibGVuZ3RoIiwic2hvdWxkU2hvdyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvcCIsImlubmVySGVpZ2h0IiwicHVzaCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJpbWFnZXMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImNvbXBsZXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImFycmF5QnVmZmVyVG9CYXNlNjQiLCJidWZmZXIiLCJiaW5hcnkiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJsZW4iLCJieXRlTGVuZ3RoIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYnRvYSIsInJlY29uc3RpdHV0ZUltYWdlIiwiaGVhZGVyIiwiaW1hZ2UiLCJpbWFnZV9kYXRhIiwiZnVsbCIsImF0b2IiLCJjaGFyQ29kZUF0IiwiaGVpZ2h0X29mZnNldCIsImxlbmd0aF9vZmZzZXQiLCJHYXVzc2hvbGRlckhlYWRlciIsImNiIiwiY3R4IiwiZ2V0Q29udGV4dCIsIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIsIndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCIsIm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwiZHJhd0ltYWdlIiwiU3RhY2tCbHVyIiwiY2FudmFzUkdCIiwibXVsX3RhYmxlIiwic2hnX3RhYmxlIiwiZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyIsInRvcF94IiwidG9wX3kiLCJnZXRFbGVtZW50QnlJZCIsIkhUTUxDYW52YXNFbGVtZW50IiwiY29udGV4dCIsImltYWdlRGF0YSIsImdldEltYWdlRGF0YSIsImUiLCJFcnJvciIsInByb2Nlc3NDYW52YXNSR0IiLCJpc05hTiIsInByb2Nlc3NJbWFnZURhdGFSR0IiLCJwdXRJbWFnZURhdGEiLCJwaXhlbHMiLCJ4IiwieSIsInAiLCJ5cCIsInlpIiwieXciLCJyX3N1bSIsImdfc3VtIiwiYl9zdW0iLCJyX291dF9zdW0iLCJnX291dF9zdW0iLCJiX291dF9zdW0iLCJyX2luX3N1bSIsImdfaW5fc3VtIiwiYl9pbl9zdW0iLCJwciIsInBnIiwicGIiLCJyYnMiLCJkaXYiLCJ3NCIsIndpZHRoTWludXMxIiwiaGVpZ2h0TWludXMxIiwicmFkaXVzUGx1czEiLCJzdW1GYWN0b3IiLCJzdGFja1N0YXJ0IiwiQmx1clN0YWNrIiwic3RhY2siLCJzdGFja0VuZCIsInN0YWNrSW4iLCJzdGFja091dCIsIm11bF9zdW0iLCJzaGdfc3VtIiwiciIsImciLCJiIiwiYSJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUFBO0FBQUE7QUFFQUEsTUFBTSxDQUFDQyxXQUFQLEdBQXFCQSxnRUFBVyxFQUFoQyxDOzs7Ozs7Ozs7Ozs7QUNGQTtBQUFBO0NBRUE7O0FBQ0EsSUFBTUMsYUFBYSxHQUFHLEdBQXRCO0FBRWUsMkVBQVk7QUFDMUI7Ozs7O0FBS0EsTUFBSUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUFXQyxPQUFYLEVBQXFCO0FBQ3hDLFFBQUssRUFBSSxpQkFBaUJBLE9BQU8sQ0FBQ0MsT0FBN0IsQ0FBTCxF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LEdBQVluQyxNQUFNLENBQUNHLENBQUMsR0FBQyxDQUFILENBQXpDO0FBQ0FNLGFBQUssSUFBS00sUUFBUSxJQUFLZSxPQUFPLENBQUNNLENBQVIsR0FBWXBDLE1BQU0sQ0FBQ0csQ0FBQyxHQUFDLENBQUgsQ0FBekM7QUFFQTJCLGVBQU8sR0FBR0EsT0FBTyxDQUFDekYsSUFBbEI7QUFFQXFFLGlCQUFTLElBQUtNLEVBQUUsR0FBR2UsUUFBUSxDQUFDRyxDQUE1QjtBQUNBdkIsaUJBQVMsSUFBS00sRUFBRSxHQUFHYyxRQUFRLENBQUNJLENBQTVCO0FBQ0F2QixpQkFBUyxJQUFLTSxFQUFFLEdBQUdhLFFBQVEsQ0FBQ0ssQ0FBNUI7QUFFQXZCLGdCQUFRLElBQUlHLEVBQVo7QUFDQUYsZ0JBQVEsSUFBSUcsRUFBWjtBQUNBRixnQkFBUSxJQUFJRyxFQUFaO0FBRUFhLGdCQUFRLEdBQUdBLFFBQVEsQ0FBQzFGLElBQXBCO0FBRUFnRSxVQUFFLElBQUlwRyxLQUFOO0FBQ0g7QUFDSjs7QUFFRCxXQUFPdUYsU0FBUDtBQUNIOztBQUVELFdBQVNtQyxTQUFULEdBQ0E7QUFDSSxTQUFLTyxDQUFMLEdBQVMsQ0FBVDtBQUNBLFNBQUtDLENBQUwsR0FBUyxDQUFUO0FBQ0EsU0FBS0MsQ0FBTCxHQUFTLENBQVQ7QUFDQSxTQUFLQyxDQUFMLEdBQVMsQ0FBVDtBQUNBLFNBQUtoRyxJQUFMLEdBQVksSUFBWjtBQUNIOztBQUVELFNBQU87QUFDSDBDLGFBQVMsRUFBRWE7QUFEUixHQUFQO0FBR0EsQ0F6U0Q7O0FBMlNlZCx3RUFBZixFIiwiZmlsZSI6ImdhdXNzaG9sZGVyLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsImltcG9ydCBHYXVzc2hvbGRlciBmcm9tICcuL3NyYy9nYXVzc2hvbGRlcic7XG5cbndpbmRvdy5HYXVzc2hvbGRlciA9IEdhdXNzaG9sZGVyKCk7XG4iLCJpbXBvcnQgcmVuZGVySW1hZ2VJbnRvQ2FudmFzIGZyb20gJy4vcmVuZGVyLWltYWdlLWludG8tY2FudmFzJztcblxuLy8gRmFkZSBkdXJhdGlvbiBpbiBtcyB3aGVuIHRoZSBpbWFnZSBsb2FkcyBpbi5cbmNvbnN0IEZBREVfRFVSQVRJT04gPSA4MDA7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcblx0LyoqXG5cdCAqIFJlbmRlciBwbGFjZWhvbGRlciBmb3IgYW4gaW1hZ2Vcblx0ICpcblx0ICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdG8gcmVuZGVyIHBsYWNlaG9sZGVyIGZvclxuXHQgKi9cblx0bGV0IGhhbmRsZUVsZW1lbnQgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0aWYgKCAhICggJ2dhdXNzaG9sZGVyJyBpbiBlbGVtZW50LmRhdGFzZXQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTtcblx0XHRsZXQgZmluYWwgPSBlbGVtZW50LmRhdGFzZXQuZ2F1c3Nob2xkZXJTaXplLnNwbGl0KCAnLCcgKTtcblxuXHRcdC8vIFNldCB0aGUgZGltZW5zaW9ucy4uLlxuXHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSBmaW5hbFswXSArICdweCc7XG5cdFx0ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBmaW5hbFsxXSArICdweCc7XG5cblx0XHQvLyAuLi50aGVuIHJlY2FsY3VsYXRlIGJhc2VkIG9uIHdoYXQgaXQgYWN0dWFsbHkgcmVuZGVycyBhc1xuXHRcdGxldCBvcmlnaW5hbCA9IFsgZmluYWxbMF0sIGZpbmFsWzFdIF07XG5cdFx0aWYgKCBlbGVtZW50LndpZHRoIDwgZmluYWxbMF0gKSB7XG5cdFx0XHQvLyBSZXNjYWxlLCBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW9cblx0XHRcdGZpbmFsWzBdID0gZWxlbWVudC53aWR0aDtcblx0XHRcdGZpbmFsWzFdID0gZmluYWxbMV0gKiAoIGZpbmFsWzBdIC8gb3JpZ2luYWxbMF0gKTtcblx0XHR9IGVsc2UgaWYgKCBlbGVtZW50LmhlaWdodCA8IGZpbmFsWzFdICkge1xuXHRcdFx0Ly8gUmVzY2FsZSwga2VlcGluZyB0aGUgYXNwZWN0IHJhdGlvXG5cdFx0XHRmaW5hbFsxXSA9IGVsZW1lbnQuaGVpZ2h0O1xuXHRcdFx0ZmluYWxbMF0gPSBmaW5hbFswXSAqICggZmluYWxbMV0gLyBvcmlnaW5hbFsxXSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCBkaW1lbnNpb25zLCBfYWdhaW5fXG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IGZpbmFsWzBdICsgJ3B4Jztcblx0XHRlbGVtZW50LnN0eWxlLmhlaWdodCA9IGZpbmFsWzFdICsgJ3B4JztcblxuXHRcdHJlbmRlckltYWdlSW50b0NhbnZhcyggY2FudmFzLCBlbGVtZW50LmRhdGFzZXQuZ2F1c3Nob2xkZXIuc3BsaXQoICcsJyApLCBmaW5hbCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gTG9hZCBpbiBhcyBvdXIgYmFja2dyb3VuZCBpbWFnZVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIGNhbnZhcy50b0RhdGFVUkwoKSArICdcIiknO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kUmVwZWF0ID0gJ25vLXJlcGVhdCc7XG5cdFx0fSApO1xuXHR9O1xuXG5cdGxldCBsb2FkT3JpZ2luYWwgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0aWYgKCAhICggJ29yaWdpbmFsc3JjJyBpbiBlbGVtZW50LmRhdGFzZXQgKSAmJiAhICggJ29yaWdpbmFsc3Jjc2V0JyBpbiBlbGVtZW50LmRhdGFzZXQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgZGF0YSA9IGVsZW1lbnQuZGF0YXNldC5nYXVzc2hvbGRlclNpemUuc3BsaXQoICcsJyApLFxuXHRcdFx0cmFkaXVzID0gcGFyc2VJbnQoIGRhdGFbMl0gKTtcblxuXHRcdC8vIExvYWQgb3VyIGltYWdlIG5vd1xuXHRcdGxldCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuXHRcdGlmICggZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3JjICkge1xuXHRcdFx0aW1nLnNyYyA9IGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbHNyYztcblx0XHR9XG5cdFx0aWYgKCBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxzcmNzZXQgKSB7XG5cdFx0XHRpbWcuc3Jjc2V0ID0gZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3Jjc2V0O1xuXHRcdH1cblxuXHRcdGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBGaWx0ZXIgcHJvcGVydHkgdG8gdXNlXG5cdFx0XHRsZXQgZmlsdGVyUHJvcCA9ICggJ3dlYmtpdEZpbHRlcicgaW4gZWxlbWVudC5zdHlsZSApID8gJ3dlYmtpdEZpbHRlcicgOiAnZmlsdGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGVbIGZpbHRlclByb3AgXSA9ICdibHVyKCcgKyByYWRpdXMgKiAwLjUgKyAncHgpJztcblxuXHRcdFx0Ly8gRW5zdXJlIGJsdXIgZG9lc24ndCBibGVlZCBwYXN0IGltYWdlIGJvcmRlclxuXHRcdFx0ZWxlbWVudC5zdHlsZS5jbGlwUGF0aCA9ICd1cmwoI2dhdXNzY2xpcCknOyAvLyBDdXJyZW50IEZGXG5cdFx0XHRlbGVtZW50LnN0eWxlLmNsaXBQYXRoID0gJ2luc2V0KDApJzsgLy8gU3RhbmRhcmRcblx0XHRcdGVsZW1lbnQuc3R5bGUud2Via2l0Q2xpcFBhdGggPSAnaW5zZXQoMCknOyAvLyBXZWJLaXRcblxuXHRcdFx0Ly8gU2V0IHRoZSBhY3R1YWwgc291cmNlXG5cdFx0XHRlbGVtZW50LnNyYyA9IGltZy5zcmM7XG5cdFx0XHRlbGVtZW50LnNyY3NldCA9IGltZy5zcmNzZXQ7XG5cblx0XHRcdC8vIENsZWFuaW5nIHNvdXJjZVxuXHRcdFx0ZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsc3JjID0gJyc7XG5cdFx0XHRlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxzcmNzZXQgPSAnJztcblxuXHRcdFx0Ly8gQ2xlYXIgcGxhY2Vob2xkZXIgdGVtcG9yYXJ5IGltYWdlXG5cdFx0XHQvLyAoV2UgZG8gdGhpcyBhZnRlciBzZXR0aW5nIHRoZSBzb3VyY2UsIGFzIGRvaW5nIGl0IGJlZm9yZSBjYW5cblx0XHRcdC8vIGNhdXNlIGEgdGlueSBmbGlja2VyKVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJztcblx0XHRcdGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICcnO1xuXG5cdFx0XHRsZXQgc3RhcnQgPSAwO1xuXHRcdFx0dmFyIGFuaW0gPSBmdW5jdGlvbiAoIHRzICkge1xuXHRcdFx0XHRpZiAoICEgc3RhcnQgKSBzdGFydCA9IHRzO1xuXHRcdFx0XHRsZXQgZGlmZiA9IHRzIC0gc3RhcnQ7XG5cdFx0XHRcdGlmICggZGlmZiA+IEZBREVfRFVSQVRJT04gKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZVsgZmlsdGVyUHJvcCBdID0gJyc7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5jbGlwUGF0aCA9ICcnO1xuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUud2Via2l0Q2xpcFBhdGggPSAnJztcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgZWZmZWN0aXZlUmFkaXVzID0gcmFkaXVzICogKCAxIC0gKCBkaWZmIC8gRkFERV9EVVJBVElPTiApICk7XG5cblx0XHRcdFx0ZWxlbWVudC5zdHlsZVsgZmlsdGVyUHJvcCBdID0gJ2JsdXIoJyArIGVmZmVjdGl2ZVJhZGl1cyAqIDAuNSArICdweCknO1xuXHRcdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltICk7XG5cdFx0XHR9O1xuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbSApO1xuXHRcdH07XG5cdH07XG5cblx0bGV0IGxvYWRMYXppbHkgPSBbXTtcblx0bGV0IHRocmVzaG9sZCA9IDEyMDA7XG5cdGxldCBsYXN0UnVuID0gMCxcblx0XHRsb29wVGltZW91dCA9IG51bGw7XG5cblx0dmFyIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0bGV0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0aWYgKCAoIGxhc3RSdW4gKyA0MCApID4gbm93ICkge1xuXHRcdFx0aWYgKCBsb29wVGltZW91dCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bG9vcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggc2Nyb2xsSGFuZGxlciwgNDAgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGFzdFJ1biA9IG5vdztcblx0XHRsb29wVGltZW91dCAmJiAoIGxvb3BUaW1lb3V0ID0gbnVsbCApO1xuXG5cdFx0bGV0IG5leHQgPSBbXTtcblx0XHRmb3IgKCBsZXQgaSA9IGxvYWRMYXppbHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG5cdFx0XHRsZXQgaW1nID0gbG9hZExhemlseVtpXTtcblx0XHRcdGxldCBzaG91bGRTaG93ID0gaW1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8PSAoIHdpbmRvdy5pbm5lckhlaWdodCArIHRocmVzaG9sZCApO1xuXHRcdFx0aWYgKCAhIHNob3VsZFNob3cgKSB7XG5cdFx0XHRcdG5leHQucHVzaCggaW1nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsb2FkT3JpZ2luYWwoIGltZyApO1xuXHRcdH1cblx0XHRsb2FkTGF6aWx5ID0gbmV4dDtcblx0XHRpZiAoIGxvYWRMYXppbHkubGVuZ3RoIDwgMSApIHtcblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgc2Nyb2xsSGFuZGxlciApO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVuZGVyIGFsbCBwbGFjZWhvbGRlcnMgb24gdGhlIHBhZ2Vcblx0ICovXG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0bGV0IGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAnaW1nJyApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBpbWFnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG5cdFx0XHRsZXQgaW1nID0gaW1hZ2VzW2ldO1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGJsYW5rIEdJRiBoYXMgbG9hZGVkIGZpcnN0XG5cdFx0XHRpZiAoIGltZy5jb21wbGV0ZSApIHtcblx0XHRcdFx0aGFuZGxlRWxlbWVudCggaW1nICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhhbmRsZUVsZW1lbnQoIHRoaXMgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsb2FkTGF6aWx5ID0gaW1hZ2VzO1xuXHRcdHNjcm9sbEhhbmRsZXIoKTtcblxuXHRcdGlmICggbG9hZExhemlseS5sZW5ndGggPiAwICkge1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyICk7XG5cdFx0fVxuXHR9O1xufVxuIiwiZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NCggYnVmZmVyICkge1xuXHRsZXQgYmluYXJ5ID0gJyc7XG5cdGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KCBidWZmZXIgKTtcblx0bGV0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBieXRlc1sgaSBdICk7XG5cdH1cblx0cmV0dXJuIHdpbmRvdy5idG9hKCBiaW5hcnkgKTtcbn1cblxuZnVuY3Rpb24gcmVjb25zdGl0dXRlSW1hZ2UoIGhlYWRlciwgaW1hZ2UgKSB7XG5cdGxldCBpbWFnZV9kYXRhID0gaW1hZ2VbMF0sXG5cdFx0d2lkdGggPSBwYXJzZUludCggaW1hZ2VbMV0gKSxcblx0XHRoZWlnaHQgPSBwYXJzZUludCggaW1hZ2VbMl0gKTtcblxuXHRsZXQgZnVsbCA9IGF0b2IoIGhlYWRlci5oZWFkZXIgKSArIGF0b2IoIGltYWdlX2RhdGEgKTtcblx0bGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoIGZ1bGwubGVuZ3RoICk7XG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGZ1bGwubGVuZ3RoOyBpKysgKSB7XG5cdFx0Ynl0ZXNbaV0gPSBmdWxsLmNoYXJDb2RlQXQoIGkgKTtcblx0fVxuXG5cdC8vIFBva2UgdGhlIGJpdHMuXG5cdGJ5dGVzWyBoZWFkZXIuaGVpZ2h0X29mZnNldCBdID0gKCAoIGhlaWdodCA+PiA4ICkgJiAweEZGICk7XG5cdGJ5dGVzWyBoZWFkZXIuaGVpZ2h0X29mZnNldCArIDEgXSA9ICggaGVpZ2h0ICYgMHhGRiApO1xuXHRieXRlc1sgaGVhZGVyLmxlbmd0aF9vZmZzZXQgXSA9ICggKCB3aWR0aCA+PiA4ICkgJiAweEZGICk7XG5cdGJ5dGVzWyBoZWFkZXIubGVuZ3RoX29mZnNldCArIDFdID0gKCB3aWR0aCAmIDB4RkYgKTtcblxuXHQvLyBCYWNrIHRvIGEgZnVsbCBKUEVHIG5vdy5cblx0cmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjQoIGJ5dGVzICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlY29uc3RpdHV0ZUltYWdlO1xuIiwiaW1wb3J0IHJlY29uc3RpdHV0ZUltYWdlIGZyb20gJy4vcmVjb25zdGl0dXRlLWltYWdlJztcbmltcG9ydCBTdGFja0JsdXIgZnJvbSAnLi9zdGFja2JsdXInO1xuXG5jb25zdCB7IEdhdXNzaG9sZGVySGVhZGVyIH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVuZGVyIGFuIGltYWdlIGludG8gYSBDYW52YXNcbiAqXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgQ2FudmFzIGVsZW1lbnQgdG8gcmVuZGVyIGludG9cbiAqIEBwYXJhbSB7bGlzdH0gaW1hZ2UgMy10dXBsZSBvZiBiYXNlNjQtZW5jb2RlZCBpbWFnZSBkYXRhLCB3aWR0aCwgaGVpZ2h0XG4gKiBAcGFyYW0ge2xpc3R9IGZpbmFsIEZpbmFsIHdpZHRoIGFuZCBoZWlnaHRcbiAqL1xuZnVuY3Rpb24gcmVuZGVySW1hZ2VJbnRvQ2FudmFzKCBjYW52YXMsIGltYWdlLCBmaW5hbCwgY2IgKSB7XG5cdGxldCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApLFxuXHRcdHdpZHRoID0gcGFyc2VJbnQoIGZpbmFsWzBdICksXG5cdFx0aGVpZ2h0ID0gcGFyc2VJbnQoIGZpbmFsWzFdICksXG5cdFx0cmFkaXVzID0gcGFyc2VJbnQoIGZpbmFsWzJdICk7XG5cblx0Ly8gRW5zdXJlIHNtb290aGluZyBpcyBvZmZcblx0Y3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRjdHgud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cdGN0eC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0bGV0IGltZyA9IG5ldyBJbWFnZSgpO1xuXHRpbWcuc3JjID0gJ2RhdGE6aW1hZ2UvanBnO2Jhc2U2NCwnICsgcmVjb25zdGl0dXRlSW1hZ2UoIEdhdXNzaG9sZGVySGVhZGVyLCBpbWFnZSApO1xuXHRpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuXHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRjdHguZHJhd0ltYWdlKCBpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHRTdGFja0JsdXIuY2FudmFzUkdCKCBjYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIHJhZGl1cyApO1xuXHRcdGNiKCk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlbmRlckltYWdlSW50b0NhbnZhcztcbiIsIi8qXG4gICAgU3RhY2tCbHVyIC0gYSBmYXN0IGFsbW9zdCBHYXVzc2lhbiBCbHVyIEZvciBDYW52YXNcblxuICAgIFZlcnNpb246ICAgICAwLjVcbiAgICBBdXRob3I6ICAgICAgICBNYXJpbyBLbGluZ2VtYW5uXG4gICAgQ29udGFjdDogICAgIG1hcmlvQHF1YXNpbW9uZG8uY29tXG4gICAgV2Vic2l0ZTogICAgaHR0cDovL3d3dy5xdWFzaW1vbmRvLmNvbS9TdGFja0JsdXJGb3JDYW52YXNcbiAgICBUd2l0dGVyOiAgICBAcXVhc2ltb25kb1xuXG4gICAgSW4gY2FzZSB5b3UgZmluZCB0aGlzIGNsYXNzIHVzZWZ1bCAtIGVzcGVjaWFsbHkgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyAtXG4gICAgSSBhbSBub3QgdG90YWxseSB1bmhhcHB5IGZvciBhIHNtYWxsIGRvbmF0aW9uIHRvIG15IFBheVBhbCBhY2NvdW50XG4gICAgbWFyaW9AcXVhc2ltb25kby5kZVxuXG4gICAgT3Igc3VwcG9ydCBtZSBvbiBmbGF0dHI6XG4gICAgaHR0cHM6Ly9mbGF0dHIuY29tL3RoaW5nLzcyNzkxL1N0YWNrQmx1ci1hLWZhc3QtYWxtb3N0LUdhdXNzaWFuLUJsdXItRWZmZWN0LWZvci1DYW52YXNKYXZhc2NyaXB0XG5cbiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgTWFyaW8gS2xpbmdlbWFublxuXG4gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvblxuICAgIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dFxuICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLFxuICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmdcbiAgICBjb25kaXRpb25zOlxuXG4gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTXG4gICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLFxuICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1JcbiAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gICAgKi9cblxudmFyIFN0YWNrQmx1ciA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBtdWxfdGFibGUgPSBbXG5cdCAgICA1MTIsNTEyLDQ1Niw1MTIsMzI4LDQ1NiwzMzUsNTEyLDQwNSwzMjgsMjcxLDQ1NiwzODgsMzM1LDI5Miw1MTIsXG5cdCAgICA0NTQsNDA1LDM2NCwzMjgsMjk4LDI3MSw0OTYsNDU2LDQyMCwzODgsMzYwLDMzNSwzMTIsMjkyLDI3Myw1MTIsXG5cdCAgICA0ODIsNDU0LDQyOCw0MDUsMzgzLDM2NCwzNDUsMzI4LDMxMiwyOTgsMjg0LDI3MSwyNTksNDk2LDQ3NSw0NTYsXG5cdCAgICA0MzcsNDIwLDQwNCwzODgsMzc0LDM2MCwzNDcsMzM1LDMyMywzMTIsMzAyLDI5MiwyODIsMjczLDI2NSw1MTIsXG5cdCAgICA0OTcsNDgyLDQ2OCw0NTQsNDQxLDQyOCw0MTcsNDA1LDM5NCwzODMsMzczLDM2NCwzNTQsMzQ1LDMzNywzMjgsXG5cdCAgICAzMjAsMzEyLDMwNSwyOTgsMjkxLDI4NCwyNzgsMjcxLDI2NSwyNTksNTA3LDQ5Niw0ODUsNDc1LDQ2NSw0NTYsXG5cdCAgICA0NDYsNDM3LDQyOCw0MjAsNDEyLDQwNCwzOTYsMzg4LDM4MSwzNzQsMzY3LDM2MCwzNTQsMzQ3LDM0MSwzMzUsXG5cdCAgICAzMjksMzIzLDMxOCwzMTIsMzA3LDMwMiwyOTcsMjkyLDI4NywyODIsMjc4LDI3MywyNjksMjY1LDI2MSw1MTIsXG5cdCAgICA1MDUsNDk3LDQ4OSw0ODIsNDc1LDQ2OCw0NjEsNDU0LDQ0Nyw0NDEsNDM1LDQyOCw0MjIsNDE3LDQxMSw0MDUsXG5cdCAgICAzOTksMzk0LDM4OSwzODMsMzc4LDM3MywzNjgsMzY0LDM1OSwzNTQsMzUwLDM0NSwzNDEsMzM3LDMzMiwzMjgsXG5cdCAgICAzMjQsMzIwLDMxNiwzMTIsMzA5LDMwNSwzMDEsMjk4LDI5NCwyOTEsMjg3LDI4NCwyODEsMjc4LDI3NCwyNzEsXG5cdCAgICAyNjgsMjY1LDI2MiwyNTksMjU3LDUwNyw1MDEsNDk2LDQ5MSw0ODUsNDgwLDQ3NSw0NzAsNDY1LDQ2MCw0NTYsXG5cdCAgICA0NTEsNDQ2LDQ0Miw0MzcsNDMzLDQyOCw0MjQsNDIwLDQxNiw0MTIsNDA4LDQwNCw0MDAsMzk2LDM5MiwzODgsXG5cdCAgICAzODUsMzgxLDM3NywzNzQsMzcwLDM2NywzNjMsMzYwLDM1NywzNTQsMzUwLDM0NywzNDQsMzQxLDMzOCwzMzUsXG5cdCAgICAzMzIsMzI5LDMyNiwzMjMsMzIwLDMxOCwzMTUsMzEyLDMxMCwzMDcsMzA0LDMwMiwyOTksMjk3LDI5NCwyOTIsXG5cdCAgICAyODksMjg3LDI4NSwyODIsMjgwLDI3OCwyNzUsMjczLDI3MSwyNjksMjY3LDI2NSwyNjMsMjYxLDI1OV07XG5cblxuXHR2YXIgc2hnX3RhYmxlID0gW1xuXHQgICAgOSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNyxcblx0ICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LFxuXHQgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsXG5cdCAgICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSxcblx0ICAgIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLFxuXHQgICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG5cdCAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMixcblx0ICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLFxuXHQgICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG5cdCAgICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMyxcblx0ICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLFxuXHQgICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG5cdCAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcblx0ICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxuXHQgICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG5cdCAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0IF07XG5cblxuXHRmdW5jdGlvbiBnZXRJbWFnZURhdGFGcm9tQ2FudmFzKGNhbnZhcywgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KVxuXHR7XG5cdCAgICBpZiAodHlwZW9mKGNhbnZhcykgPT0gJ3N0cmluZycpXG5cdCAgICAgICAgdmFyIGNhbnZhcyAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYW52YXMpO1xuXHQgICAgZWxzZSBpZiAoIWNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KVxuXHQgICAgICAgIHJldHVybjtcblxuXHQgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblx0ICAgIHZhciBpbWFnZURhdGE7XG5cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gdHJ5IHtcblx0ICAgICAgICAgICAgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEodG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgICAvKn0gY2F0Y2goZSkge1xuXG5cdCAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgcGFydCBpcyBzdXBwb3NlZGx5IG9ubHkgbmVlZGVkIGlmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBsb2NhbCBmaWxlc1xuXHQgICAgICAgICAgICAvLyBzbyBpdCBtaWdodCBiZSBva2F5IHRvIHJlbW92ZSB0aGUgd2hvbGUgdHJ5L2NhdGNoIGJsb2NrIGFuZCBqdXN0IHVzZVxuXHQgICAgICAgICAgICAvLyBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSh0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoXCJVbml2ZXJzYWxCcm93c2VyUmVhZFwiKTtcblx0ICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuXHQgICAgICAgICAgICAgICAgYWxlcnQoXCJDYW5ub3QgYWNjZXNzIGxvY2FsIGltYWdlXCIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBsb2NhbCBpbWFnZSBkYXRhOiBcIiArIGUpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSovXG5cdCAgICB9IGNhdGNoKGUpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gYWNjZXNzIGltYWdlIGRhdGE6IFwiICsgZSk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBpbWFnZURhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm9jZXNzQ2FudmFzUkdCKGNhbnZhcywgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpXG5cdHtcblx0ICAgIGlmIChpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEpIHJldHVybjtcblx0ICAgIHJhZGl1cyB8PSAwO1xuXG5cdCAgICB2YXIgaW1hZ2VEYXRhID0gZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyhjYW52YXMsIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICBpbWFnZURhdGEgPSBwcm9jZXNzSW1hZ2VEYXRhUkdCKGltYWdlRGF0YSwgdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpO1xuXG5cdCAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB0b3BfeCwgdG9wX3kpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJvY2Vzc0ltYWdlRGF0YVJHQihpbWFnZURhdGEsIHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKVxuXHR7XG5cdCAgICB2YXIgcGl4ZWxzID0gaW1hZ2VEYXRhLmRhdGE7XG5cblx0ICAgIHZhciB4LCB5LCBpLCBwLCB5cCwgeWksIHl3LCByX3N1bSwgZ19zdW0sIGJfc3VtLFxuXHQgICAgICAgIHJfb3V0X3N1bSwgZ19vdXRfc3VtLCBiX291dF9zdW0sXG5cdCAgICAgICAgcl9pbl9zdW0sIGdfaW5fc3VtLCBiX2luX3N1bSxcblx0ICAgICAgICBwciwgcGcsIHBiLCByYnM7XG5cblx0ICAgIHZhciBkaXYgPSByYWRpdXMgKyByYWRpdXMgKyAxO1xuXHQgICAgdmFyIHc0ID0gd2lkdGggPDwgMjtcblx0ICAgIHZhciB3aWR0aE1pbnVzMSAgPSB3aWR0aCAtIDE7XG5cdCAgICB2YXIgaGVpZ2h0TWludXMxID0gaGVpZ2h0IC0gMTtcblx0ICAgIHZhciByYWRpdXNQbHVzMSAgPSByYWRpdXMgKyAxO1xuXHQgICAgdmFyIHN1bUZhY3RvciA9IHJhZGl1c1BsdXMxICogKHJhZGl1c1BsdXMxICsgMSkgLyAyO1xuXG5cdCAgICB2YXIgc3RhY2tTdGFydCA9IG5ldyBCbHVyU3RhY2soKTtcblx0ICAgIHZhciBzdGFjayA9IHN0YWNrU3RhcnQ7XG5cdCAgICBmb3IgKGkgPSAxOyBpIDwgZGl2OyBpKyspXG5cdCAgICB7XG5cdCAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0ID0gbmV3IEJsdXJTdGFjaygpO1xuXHQgICAgICAgIGlmIChpID09IHJhZGl1c1BsdXMxKSB2YXIgc3RhY2tFbmQgPSBzdGFjaztcblx0ICAgIH1cblx0ICAgIHN0YWNrLm5leHQgPSBzdGFja1N0YXJ0O1xuXHQgICAgdmFyIHN0YWNrSW4gPSBudWxsO1xuXHQgICAgdmFyIHN0YWNrT3V0ID0gbnVsbDtcblxuXHQgICAgeXcgPSB5aSA9IDA7XG5cblx0ICAgIHZhciBtdWxfc3VtID0gbXVsX3RhYmxlW3JhZGl1c107XG5cdCAgICB2YXIgc2hnX3N1bSA9IHNoZ190YWJsZVtyYWRpdXNdO1xuXG5cdCAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspXG5cdCAgICB7XG5cdCAgICAgICAgcl9pbl9zdW0gPSBnX2luX3N1bSA9IGJfaW5fc3VtID0gcl9zdW0gPSBnX3N1bSA9IGJfc3VtID0gMDtcblxuXHQgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XG5cdCAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkrMV0pO1xuXHQgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpKzJdKTtcblxuXHQgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xuXHQgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xuXHQgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuXG5cdCAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBzdGFjay5yID0gcHI7XG5cdCAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcblx0ICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZm9yIChpID0gMTsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgaSA/IHdpZHRoTWludXMxIDogaSkgPDwgMik7XG5cdCAgICAgICAgICAgIHJfc3VtICs9IChzdGFjay5yID0gKHByID0gcGl4ZWxzW3BdKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcblx0ICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbcCsxXSkpICogcmJzO1xuXHQgICAgICAgICAgICBiX3N1bSArPSAoc3RhY2suYiA9IChwYiA9IHBpeGVsc1twKzJdKSkgKiByYnM7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gKz0gcHI7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtICs9IHBnO1xuXHQgICAgICAgICAgICBiX2luX3N1bSArPSBwYjtcblxuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cblx0ICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcblx0ICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXHQgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKVxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpXSAgID0gKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpKzFdID0gKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3lpKzJdID0gKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblxuXHQgICAgICAgICAgICByX3N1bSAtPSByX291dF9zdW07XG5cdCAgICAgICAgICAgIGdfc3VtIC09IGdfb3V0X3N1bTtcblx0ICAgICAgICAgICAgYl9zdW0gLT0gYl9vdXRfc3VtO1xuXG5cdCAgICAgICAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XG5cdCAgICAgICAgICAgIGdfb3V0X3N1bSAtPSBzdGFja0luLmc7XG5cdCAgICAgICAgICAgIGJfb3V0X3N1bSAtPSBzdGFja0luLmI7XG5cblx0ICAgICAgICAgICAgcCA9ICAoeXcgKyAoKHAgPSB4ICsgcmFkaXVzICsgMSkgPCB3aWR0aE1pbnVzMSA/IHAgOiB3aWR0aE1pbnVzMSkpIDw8IDI7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gKz0gKHN0YWNrSW4uciA9IHBpeGVsc1twXSk7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtICs9IChzdGFja0luLmcgPSBwaXhlbHNbcCsxXSk7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCsyXSk7XG5cblx0ICAgICAgICAgICAgcl9zdW0gKz0gcl9pbl9zdW07XG5cdCAgICAgICAgICAgIGdfc3VtICs9IGdfaW5fc3VtO1xuXHQgICAgICAgICAgICBiX3N1bSArPSBiX2luX3N1bTtcblxuXHQgICAgICAgICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuXG5cdCAgICAgICAgICAgIHJfb3V0X3N1bSArPSAocHIgPSBzdGFja091dC5yKTtcblx0ICAgICAgICAgICAgZ19vdXRfc3VtICs9IChwZyA9IHN0YWNrT3V0LmcpO1xuXHQgICAgICAgICAgICBiX291dF9zdW0gKz0gKHBiID0gc3RhY2tPdXQuYik7XG5cblx0ICAgICAgICAgICAgcl9pbl9zdW0gLT0gcHI7XG5cdCAgICAgICAgICAgIGdfaW5fc3VtIC09IHBnO1xuXHQgICAgICAgICAgICBiX2luX3N1bSAtPSBwYjtcblxuXHQgICAgICAgICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG5cblx0ICAgICAgICAgICAgeWkgKz0gNDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgeXcgKz0gd2lkdGg7XG5cdCAgICB9XG5cblxuXHQgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspXG5cdCAgICB7XG5cdCAgICAgICAgZ19pbl9zdW0gPSBiX2luX3N1bSA9IHJfaW5fc3VtID0gZ19zdW0gPSBiX3N1bSA9IHJfc3VtID0gMDtcblxuXHQgICAgICAgIHlpID0geCA8PCAyO1xuXHQgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XG5cdCAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkrMV0pO1xuXHQgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpKzJdKTtcblxuXHQgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xuXHQgICAgICAgIGdfc3VtICs9IHN1bUZhY3RvciAqIHBnO1xuXHQgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuXG5cdCAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICBzdGFjay5yID0gcHI7XG5cdCAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcblx0ICAgICAgICAgICAgc3RhY2suYiA9IHBiO1xuXHQgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgeXAgPSB3aWR0aDtcblxuXHQgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcmFkaXVzOyBpKyspXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB5aSA9ICh5cCArIHgpIDw8IDI7XG5cblx0ICAgICAgICAgICAgcl9zdW0gKz0gKHN0YWNrLnIgPSAocHIgPSBwaXhlbHNbeWldKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcblx0ICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbeWkrMV0pKSAqIHJicztcblx0ICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbeWkrMl0pKSAqIHJicztcblxuXHQgICAgICAgICAgICByX2luX3N1bSArPSBwcjtcblx0ICAgICAgICAgICAgZ19pbl9zdW0gKz0gcGc7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtICs9IHBiO1xuXG5cdCAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcblxuXHQgICAgICAgICAgICBpZihpIDwgaGVpZ2h0TWludXMxKVxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICB5cCArPSB3aWR0aDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHlpID0geDtcblx0ICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcblx0ICAgICAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXHQgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKylcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHAgPSB5aSA8PCAyO1xuXHQgICAgICAgICAgICBwaXhlbHNbcF0gICA9IChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW07XG5cdCAgICAgICAgICAgIHBpeGVsc1twKzFdID0gKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bTtcblx0ICAgICAgICAgICAgcGl4ZWxzW3ArMl0gPSAoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xuXG5cdCAgICAgICAgICAgIHJfc3VtIC09IHJfb3V0X3N1bTtcblx0ICAgICAgICAgICAgZ19zdW0gLT0gZ19vdXRfc3VtO1xuXHQgICAgICAgICAgICBiX3N1bSAtPSBiX291dF9zdW07XG5cblx0ICAgICAgICAgICAgcl9vdXRfc3VtIC09IHN0YWNrSW4ucjtcblx0ICAgICAgICAgICAgZ19vdXRfc3VtIC09IHN0YWNrSW4uZztcblx0ICAgICAgICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcblxuXHQgICAgICAgICAgICBwID0gKHggKyAoKChwID0geSArIHJhZGl1c1BsdXMxKSA8IGhlaWdodE1pbnVzMSA/IHAgOiBoZWlnaHRNaW51czEpICogd2lkdGgpKSA8PCAyO1xuXG5cdCAgICAgICAgICAgIHJfc3VtICs9IChyX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKSk7XG5cdCAgICAgICAgICAgIGdfc3VtICs9IChnX2luX3N1bSArPSAoc3RhY2tJbi5nID0gcGl4ZWxzW3ArMV0pKTtcblx0ICAgICAgICAgICAgYl9zdW0gKz0gKGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCsyXSkpO1xuXG5cdCAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XG5cblx0ICAgICAgICAgICAgcl9vdXRfc3VtICs9IChwciA9IHN0YWNrT3V0LnIpO1xuXHQgICAgICAgICAgICBnX291dF9zdW0gKz0gKHBnID0gc3RhY2tPdXQuZyk7XG5cdCAgICAgICAgICAgIGJfb3V0X3N1bSArPSAocGIgPSBzdGFja091dC5iKTtcblxuXHQgICAgICAgICAgICByX2luX3N1bSAtPSBwcjtcblx0ICAgICAgICAgICAgZ19pbl9zdW0gLT0gcGc7XG5cdCAgICAgICAgICAgIGJfaW5fc3VtIC09IHBiO1xuXG5cdCAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcblxuXHQgICAgICAgICAgICB5aSArPSB3aWR0aDtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBpbWFnZURhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBCbHVyU3RhY2soKVxuXHR7XG5cdCAgICB0aGlzLnIgPSAwO1xuXHQgICAgdGhpcy5nID0gMDtcblx0ICAgIHRoaXMuYiA9IDA7XG5cdCAgICB0aGlzLmEgPSAwO1xuXHQgICAgdGhpcy5uZXh0ID0gbnVsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdCAgICBjYW52YXNSR0I6IHByb2Nlc3NDYW52YXNSR0Jcblx0fTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTdGFja0JsdXI7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file