├── .github
└── workflows
│ └── test.yml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── examples
├── dilation.js
├── expected-output
│ ├── dilation.png
│ └── template-matching.png
├── getVersion.js
├── input
│ ├── image-sample-1.jpg
│ ├── image-sample-2-template.png
│ └── image-sample-2.png
├── templateMatching.js
└── test-output
│ └── .gitkeep
├── index.d.ts
├── index.js
├── mod.ts
├── notes.txt
├── opencv.d.ts
├── package-lock.json
├── package.json
├── test
├── deno
│ └── test.ts
├── error-example.js
└── test.js
├── tsconfig.json
└── utils
├── build.sh
├── generateCvProps.js
└── opencvJsMod.js
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Test
2 |
3 | on: [push, pull_request, workflow_dispatch]
4 |
5 | jobs:
6 | test:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - name: Checkout the repo
10 | uses: actions/checkout@v2
11 |
12 | - name: Set up Node v14
13 | uses: actions/setup-node@v1
14 | with:
15 | node-version: '14.x'
16 | registry-url: 'https://registry.npmjs.org'
17 |
18 | - run: npm install
19 | name: Install Node dependencies
20 |
21 | - run: (cd ./utils && sh ./build.sh)
22 | name: Build opencv-wasm
23 |
24 | - run: (cd utils && node generateCvProps.js)
25 | name: generateCvProps
26 |
27 | - run: (cd ./build_wasm_test/bin && npm install)
28 | name: Install Node dependencies for test provided by OpenCV
29 |
30 | - run: (cd ./build_wasm_test/bin && node tests.js)
31 | name: Run test provided by OpenCV
32 |
33 | - run: npm test
34 | name: Run this's repo's test
35 |
36 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | #
107 | # OpenCV-Wasm
108 | #
109 |
110 | # OpenCV Binaries
111 | /opencv.wasm
112 | /opencv-bin.js
113 |
114 | # Generated Types
115 | /types/opencv.d.ts
116 | /types/opencv.ts
117 |
118 | # OpenCV-Wasm Node
119 | /opencv.js
120 |
121 | # OpenCV-Wasm Deno
122 | /opencv-deno.js
123 |
124 | # Test files
125 | /examples/temp.png
126 |
127 | /examples/test-output/*
128 | !/examples/test-output/.gitkeep
129 |
130 | # Git repo
131 | /utils/opencv
132 |
133 | # Code tranformation temp
134 | /utils/build_wasm
135 |
136 | # Duplicated tests from OpenCV
137 | /haarcascade_frontalface_default.xml
138 | /test_calib3d.js
139 | /test_features2d.js
140 | /test_imgproc.js
141 | /test_mat.js
142 | /test_objdetect.js
143 | /test_photo.js
144 | /test_utils.js
145 | /test_video.js
146 | /tests.js
147 | /build_wasm_test
148 |
149 | # Playgrounds
150 | /playground.js
151 | /playground.ts
152 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 |
3 | sudo: required
4 |
5 | services:
6 | - docker
7 |
8 | node_js:
9 | - "12"
10 |
11 | arch:
12 | - amd64
13 |
14 | os:
15 | - linux
16 |
17 | install:
18 | - npm install
19 |
20 | # Compile OpenCV
21 | - (cd ./utils && bash ./build.sh)
22 |
23 | # Create types
24 | - (cd utils && node generateCvProps.js)
25 |
26 | # Install test node modules
27 | - (cd ./build_wasm_test/bin && npm install)
28 |
29 |
30 | script:
31 | # Run opencv's test
32 | - (cd ./build_wasm_test/bin && node tests.js)
33 | # Run opencv-wasm's test
34 | - npm test
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2020, Ezzat Chamudi
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | 2. Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | 3. Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenCV-Wasm
2 |
3 | [](https://travis-ci.org/echamudi/opencv-wasm)
4 |
5 | Precompiled OpenCV to JavaScript + WebAssembly for node.js and deno environment. 🦕
6 |
7 | In this Wasm-compiled OpenCV, there's no need to have OpenCV installed in the machine. The entire OpenCV library is already inside this package (`opencv.js` and `opencv.wasm`).
8 |
9 | This module has zero dependencies.
10 |
11 | ## Examples
12 |
13 | | Code | Input | Output |
14 | |---|---|---|
15 | | [dilation.js](https://github.com/echamudi/opencv-wasm/blob/master/examples/dilation.js) (node)|  |  |
16 | | [templateMatching.js](https://github.com/echamudi/opencv-wasm/blob/master/examples/templateMatching.js) (node) | source:

template:
 |  |
17 |
18 | ## Installation
19 |
20 | ### node
21 |
22 | ```
23 | npm install opencv-wasm
24 | ```
25 | Code example:
26 | ```js
27 | const { cv, cvTranslateError } = require('opencv-wasm');
28 |
29 | let mat = cv.matFromArray(2, 3, cv.CV_8UC1, [1, 2, 3, 4, 5, 6]);
30 | console.log('cols =', mat.cols, '; rows =', mat.rows);
31 | console.log(mat.data8S);
32 |
33 | cv.transpose(mat, mat);
34 | console.log('cols =', mat.cols, '; rows =', mat.rows);
35 | console.log(mat.data8S);
36 |
37 | /*
38 | cols = 3 ; rows = 2
39 | Int8Array(6) [ 1, 2, 3, 4, 5, 6 ]
40 | cols = 2 ; rows = 3
41 | Int8Array(6) [ 1, 4, 2, 5, 3, 6 ]
42 | */
43 | ```
44 |
45 | ### deno
46 |
47 | ```ts
48 | import { cv, cvTranslateError } from 'https://deno.land/x/opencv@v4.3.0-10/mod.ts';
49 | // Change the @ with the latest or any version you desire.
50 | // Check the available versions here: https://deno.land/x/opencv.
51 | ```
52 | Code example:
53 | ```ts
54 | import { cv, cvTranslateError } from 'https://deno.land/x/opencv@v4.3.0-10/mod.ts';
55 |
56 | let mat = cv.matFromArray(2, 3, cv.CV_8UC1, [1, 2, 3, 4, 5, 6]);
57 | console.log('cols =', mat.cols, '; rows =', mat.rows);
58 | console.log(mat.data8S);
59 |
60 | cv.transpose(mat, mat);
61 | console.log('cols =', mat.cols, '; rows =', mat.rows);
62 | console.log(mat.data8S);
63 |
64 | /*
65 | cols = 3 ; rows = 2
66 | Int8Array(6) [ 1, 2, 3, 4, 5, 6 ]
67 | cols = 2 ; rows = 3
68 | Int8Array(6) [ 1, 4, 2, 5, 3, 6 ]
69 | */
70 | ```
71 |
72 | ## Usage
73 |
74 | Because this module is using the same code as the official OpenCV.js for the web, you can use the same documentation at the web: https://docs.opencv.org/4.3.0/d5/d10/tutorial_js_root.html
75 |
76 | There are some minor initialization changes, because this module will be loaded synchronously instead of the OpenCV's default (asynchronously).
77 |
78 | You can check the files inside [examples](https://github.com/echamudi/opencv-wasm/tree/master/examples) folder as reference on how to initialize, loading images, and saving images.
79 |
80 | ## Error Handling
81 |
82 | By default, mistakes in code will produce error code. You can use the following snippet to translate the error code into meaningful statement from OpenCV.
83 |
84 | ```js
85 | const { cv, cvTranslateError } = require('opencv-wasm');
86 |
87 | try {
88 | // Your OpenCV code
89 | } catch (err) {
90 | console.log(cvTranslateError(cv, err));
91 | }
92 | ```
93 |
94 | ## Versioning
95 |
96 | This npm module uses the following versioning number:
97 | ```
98 | -
99 | ```
100 | For Example
101 | ```
102 | 4.3.0-9
103 | OpenCV version 4.3.0
104 | OpenCV-Wasm Module version 9
105 | ```
106 |
107 | ## Development
108 |
109 | ### Building
110 |
111 | Run the following script on macOS or Linux (tested on Ubuntu). You need docker on the system.
112 |
113 | ```
114 | npm install
115 | (cd ./utils && sh ./build.sh)
116 | (cd utils && node generateCvProps.js)
117 | ```
118 |
119 | ### Testing
120 |
121 | After completing the build script, you can run the test provided by OpenCV, and the test from this repo.
122 |
123 | ```sh
124 | # OpenCV's test
125 | (cd ./build_wasm_test/bin && npm install)
126 | (cd ./build_wasm_test/bin && node tests.js)
127 |
128 | # This repo's test
129 | npm test
130 | ```
131 |
132 | ## Authors
133 |
134 | * **Ezzat Chamudi** - [echamudi](https://github.com/echamudi)
135 |
136 | See also the list of [contributors](https://github.com/echamudi/opencv-wasm/graphs/contributors) who participated in this project.
137 |
138 | ## License
139 |
140 | Copyright © 2020 [Ezzat Chamudi](https://github.com/echamudi) and [OpenCV-Wasm Project Authors](https://github.com/echamudi/opencv-wasm/graphs/contributors)
141 |
142 | OpenCV-Wasm code is licensed under [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause). Images, logos, docs, and articles in this project are released under [CC-BY-SA-4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode).
143 |
144 | [OpenCV License](https://opencv.org/license/).
145 |
146 | Libraries, dependencies, and tools used in this project are tied with their licenses.
147 |
--------------------------------------------------------------------------------
/examples/dilation.js:
--------------------------------------------------------------------------------
1 | // modified code from https://docs.opencv.org/master/dc/de6/tutorial_js_nodejs.html
2 |
3 | const Jimp = require('jimp');
4 | const { cv } = require('../'); // replace with require('opencv-wasm') in prod
5 |
6 | (async () => {
7 | let jimpSrc = await Jimp.read(__dirname + '/input/image-sample-1.jpg');
8 |
9 | var src = cv.matFromImageData(jimpSrc.bitmap);
10 |
11 | let dst = new cv.Mat();
12 | let M = cv.Mat.ones(5, 5, cv.CV_8U);
13 | let anchor = new cv.Point(-1, -1);
14 | cv.dilate(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
15 |
16 | new Jimp({
17 | width: dst.cols,
18 | height: dst.rows,
19 | data: Buffer.from(dst.data)
20 | })
21 | .write(__dirname + '/test-output/dilation.png');
22 | })();
23 |
--------------------------------------------------------------------------------
/examples/expected-output/dilation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/echamudi/opencv-wasm/49909153c67c29ee7535598fd55e256ffec34999/examples/expected-output/dilation.png
--------------------------------------------------------------------------------
/examples/expected-output/template-matching.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/echamudi/opencv-wasm/49909153c67c29ee7535598fd55e256ffec34999/examples/expected-output/template-matching.png
--------------------------------------------------------------------------------
/examples/getVersion.js:
--------------------------------------------------------------------------------
1 | const { cv } = require('../'); // replace with require('opencv-wasm'); in prod
2 |
3 | console.log(cv.getBuildInformation());
4 |
--------------------------------------------------------------------------------
/examples/input/image-sample-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/echamudi/opencv-wasm/49909153c67c29ee7535598fd55e256ffec34999/examples/input/image-sample-1.jpg
--------------------------------------------------------------------------------
/examples/input/image-sample-2-template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/echamudi/opencv-wasm/49909153c67c29ee7535598fd55e256ffec34999/examples/input/image-sample-2-template.png
--------------------------------------------------------------------------------
/examples/input/image-sample-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/echamudi/opencv-wasm/49909153c67c29ee7535598fd55e256ffec34999/examples/input/image-sample-2.png
--------------------------------------------------------------------------------
/examples/templateMatching.js:
--------------------------------------------------------------------------------
1 | const Jimp = require('jimp');
2 | const { cv, cvTranslateError } = require('../'); // replace with require('opencv-wasm') in prod
3 |
4 | (async () => {
5 | try {
6 | const imageSource = await Jimp.read(__dirname + '/input/image-sample-2.png');
7 | const imageTemplate = await Jimp.read(__dirname + '/input/image-sample-2-template.png');
8 |
9 | let src = cv.matFromImageData(imageSource.bitmap);
10 | let templ = cv.matFromImageData(imageTemplate.bitmap);
11 | let processedImage = new cv.Mat();
12 | let mask = new cv.Mat();
13 |
14 | cv.matchTemplate(src, templ, processedImage, cv.TM_CCOEFF_NORMED, mask);
15 | cv.threshold(processedImage, processedImage, 0.999, 1, cv.THRESH_BINARY);
16 | processedImage.convertTo(processedImage, cv.CV_8UC1);
17 |
18 | let contours = new cv.MatVector();
19 | let hierarchy = new cv.Mat();
20 |
21 | cv.findContours(processedImage, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);
22 | for (let i = 0; i < contours.size(); ++i) {
23 | let countour = contours.get(i).data32S; // Contains the points
24 | let x = countour[0];
25 | let y = countour[1];
26 |
27 | let color = new cv.Scalar(0, 255, 0, 255);
28 | let pointA = new cv.Point(x, y);
29 | let pointB = new cv.Point(x + templ.cols, y + templ.rows);
30 | cv.rectangle(src, pointA, pointB, color, 2, cv.LINE_8, 0);
31 | }
32 |
33 | new Jimp({
34 | width: src.cols,
35 | height: src.rows,
36 | data: Buffer.from(src.data)
37 | })
38 | .write(__dirname + '/test-output/template-matching.png');
39 |
40 | } catch (err) {
41 | console.log(cvTranslateError(cv, err));
42 | }
43 | })();
44 |
--------------------------------------------------------------------------------
/examples/test-output/.gitkeep:
--------------------------------------------------------------------------------
1 | This folder is used for containting the test temporary results.
2 | You can initiate the test by running "npm test" in terminal.
3 |
--------------------------------------------------------------------------------
/index.d.ts:
--------------------------------------------------------------------------------
1 | import * as OpenCV from './types/opencv';
2 |
3 | /**
4 | * OpenCV Object
5 | */
6 | export const cv: typeof OpenCV;
7 |
8 | /**
9 | * Translate error number from OpenCV into a meaningful message
10 | * @param cvObject OpenCV object
11 | * @param err OpenCV error number
12 | */
13 | export function cvTranslateError(cvObject: typeof OpenCV, err: any): string | Error | undefined;
14 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | cv: require('./opencv.js'),
3 | cvTranslateError: function (cv, err) {
4 | // Code modified from OpenCV TryIt playground
5 | // https://docs.opencv.org/3.4/d0/d84/tutorial_js_usage.html
6 |
7 | let errorStatement = undefined;
8 |
9 | if (typeof err === 'undefined') {
10 | errorStatement = '';
11 | } else if (typeof err === 'number') {
12 | if (!isNaN(err)) {
13 | if (typeof cv !== 'undefined') {
14 | errorStatement = 'Exception: ' + cv.exceptionFromPtr(err).msg;
15 | }
16 | }
17 | } else if (typeof err === 'string') {
18 | let ptr = Number(err.split(' ')[0]);
19 | if (!isNaN(ptr)) {
20 | if (typeof cv !== 'undefined') {
21 | errorStatement = 'Exception: ' + cv.exceptionFromPtr(ptr).msg;
22 | }
23 | }
24 | } else if (err instanceof Error) {
25 | errorStatement = err;
26 | }
27 |
28 | return errorStatement;
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/mod.ts:
--------------------------------------------------------------------------------
1 | import * as OpenCV from 'https://unpkg.com/opencv-wasm@4.3.0-10/types/opencv.ts';
2 | import {cv as _cv} from 'https://unpkg.com/opencv-wasm@4.3.0-10/opencv-deno.js';
3 |
4 | export const cv: typeof OpenCV = _cv;
5 |
6 | /**
7 | * Translate error number from OpenCV into a meaningful message
8 | * @param cvObject OpenCV object
9 | * @param err OpenCV error number
10 | */
11 | export function cvTranslateError (cv: typeof OpenCV, err: any): string | Error | undefined {
12 | // Code modified from OpenCV TryIt playground
13 | // https://docs.opencv.org/3.4/d0/d84/tutorial_js_usage.html
14 |
15 | let errorStatement: string | Error | undefined = undefined;
16 |
17 | if (typeof err === 'undefined') {
18 | errorStatement = '';
19 | } else if (typeof err === 'number') {
20 | if (!isNaN(err)) {
21 | if (typeof cv !== 'undefined') {
22 | errorStatement = 'Exception: ' + cv.exceptionFromPtr(err).msg;
23 | }
24 | }
25 | } else if (typeof err === 'string') {
26 | let ptr = Number(err.split(' ')[0]);
27 | if (!isNaN(ptr)) {
28 | if (typeof cv !== 'undefined') {
29 | errorStatement = 'Exception: ' + cv.exceptionFromPtr(ptr).msg;
30 | }
31 | }
32 | } else if (err instanceof Error) {
33 | errorStatement = err;
34 | }
35 |
36 | return errorStatement;
37 | }
38 |
--------------------------------------------------------------------------------
/notes.txt:
--------------------------------------------------------------------------------
1 | # Complete Building & Publishing Recommendation
2 |
3 | - Compile from scratch using docker and build.sh
4 | - Generate types
5 | - Test using OpenCV’s node test
6 | - Test using node scripts at '/test'
7 | - Test using deno scripts at '/test'
8 | - Try node types validity in playground
9 | - Try deno types validity in playground
10 | - Increment all versions
11 | - package
12 | - package-lock
13 | - deno's mod.ts
14 | - README installation
15 | - Dry run publishing NPM module
16 | - Publish NPM module
17 | - Try to use the deno using unpkg (https://unpkg.com/opencv-wasm@/mod.ts), see if the type is working.
18 | - If unpkg is working fine, then tag it.
19 |
--------------------------------------------------------------------------------
/opencv.d.ts:
--------------------------------------------------------------------------------
1 | export * from './types/opencv';
2 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "opencv-wasm",
3 | "version": "4.3.0-10",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/runtime": {
8 | "version": "7.9.2",
9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
10 | "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
11 | "dev": true,
12 | "requires": {
13 | "regenerator-runtime": "^0.13.4"
14 | }
15 | },
16 | "@jimp/bmp": {
17 | "version": "0.10.2",
18 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.10.2.tgz",
19 | "integrity": "sha512-vsLwkfj6rcxtSxEdpQaxDagrgpOB0ErHTS/vVRQKDIhrzZkW1ddQa9W1hV8qssSY3K7lz1QNYFQdeRw/qoCiBA==",
20 | "dev": true,
21 | "requires": {
22 | "@babel/runtime": "^7.7.2",
23 | "@jimp/utils": "^0.10.2",
24 | "bmp-js": "^0.1.0",
25 | "core-js": "^3.4.1"
26 | }
27 | },
28 | "@jimp/core": {
29 | "version": "0.10.2",
30 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.10.2.tgz",
31 | "integrity": "sha512-oyJLzWYcT6u0joD2YJAAVqCc1Ng9wXGPdAijWy3xxQT/roALmWLGL5ev6fQ/gugPVAD+xKUQpM0OxJepRYUl0Q==",
32 | "dev": true,
33 | "requires": {
34 | "@babel/runtime": "^7.7.2",
35 | "@jimp/utils": "^0.10.2",
36 | "any-base": "^1.1.0",
37 | "buffer": "^5.2.0",
38 | "core-js": "^3.4.1",
39 | "exif-parser": "^0.1.12",
40 | "file-type": "^9.0.0",
41 | "load-bmfont": "^1.3.1",
42 | "mkdirp": "^0.5.1",
43 | "phin": "^2.9.1",
44 | "pixelmatch": "^4.0.2",
45 | "tinycolor2": "^1.4.1"
46 | },
47 | "dependencies": {
48 | "pixelmatch": {
49 | "version": "4.0.2",
50 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
51 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
52 | "dev": true,
53 | "requires": {
54 | "pngjs": "^3.0.0"
55 | }
56 | }
57 | }
58 | },
59 | "@jimp/custom": {
60 | "version": "0.10.2",
61 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.10.2.tgz",
62 | "integrity": "sha512-+ErCKYrIC0m6nDxRwIq0ETdltL4+C8RKrv3bGW/bI94QSfIXCdP6Vsz03VMae1J9+IPjfhn1LJ5rQ3zWkZEfdA==",
63 | "dev": true,
64 | "requires": {
65 | "@babel/runtime": "^7.7.2",
66 | "@jimp/core": "^0.10.2",
67 | "core-js": "^3.4.1"
68 | }
69 | },
70 | "@jimp/gif": {
71 | "version": "0.10.2",
72 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.10.2.tgz",
73 | "integrity": "sha512-Evkwr7Vlt5zMqNccsUDetHpKtvhFz07yg8BRZl3kXzkeKeaK/PbuAV7yjXn1DxVVU+1uSS765MdbsMVe7J404A==",
74 | "dev": true,
75 | "requires": {
76 | "@babel/runtime": "^7.7.2",
77 | "@jimp/utils": "^0.10.2",
78 | "core-js": "^3.4.1",
79 | "omggif": "^1.0.9"
80 | }
81 | },
82 | "@jimp/jpeg": {
83 | "version": "0.10.2",
84 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.10.2.tgz",
85 | "integrity": "sha512-+aQUGBZI6OueB0K6gqLCwehV5skZceVyZjjmPmuXaE7ZvdhFMP2QDh45vcT8LzlPGUcOwpIWxsGHrB6Q6RcFXQ==",
86 | "dev": true,
87 | "requires": {
88 | "@babel/runtime": "^7.7.2",
89 | "@jimp/utils": "^0.10.2",
90 | "core-js": "^3.4.1",
91 | "jpeg-js": "^0.3.4"
92 | }
93 | },
94 | "@jimp/plugin-blit": {
95 | "version": "0.10.2",
96 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.10.2.tgz",
97 | "integrity": "sha512-PdqKZLkwnOOnrr+M4X4K/GrQ26qeCHut7AoFbKW+BsHooHvyadOWwVTBUBfK8GyDp/NApEC9SXbT0UNk8XqabA==",
98 | "dev": true,
99 | "requires": {
100 | "@babel/runtime": "^7.7.2",
101 | "@jimp/utils": "^0.10.2",
102 | "core-js": "^3.4.1"
103 | }
104 | },
105 | "@jimp/plugin-blur": {
106 | "version": "0.10.2",
107 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.10.2.tgz",
108 | "integrity": "sha512-9KeLyUY3s5N0cPZN4uMg0qIiSDvIPhXEnpYnXdN2V53dM25sKrBCMH578/W+n9hAHVpsbJHS+VFknO1JV47QVw==",
109 | "dev": true,
110 | "requires": {
111 | "@babel/runtime": "^7.7.2",
112 | "@jimp/utils": "^0.10.2",
113 | "core-js": "^3.4.1"
114 | }
115 | },
116 | "@jimp/plugin-circle": {
117 | "version": "0.10.2",
118 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.10.2.tgz",
119 | "integrity": "sha512-wOJ3qKa916YZMEwA9qwIn8yROYonkscJ3bqaaSsyf5CadiY8VCijKxA3BVwr7PKjj89yf5RCS4mcy+CO8+nmkw==",
120 | "dev": true,
121 | "requires": {
122 | "@babel/runtime": "^7.7.2",
123 | "@jimp/utils": "^0.10.2",
124 | "core-js": "^3.4.1"
125 | }
126 | },
127 | "@jimp/plugin-color": {
128 | "version": "0.10.2",
129 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.10.2.tgz",
130 | "integrity": "sha512-c6cw41Hn3tLYQIRg3hxXrefKcOfW4jRN9b9DGH16mcZrRtw5jMzq3NfZ+RLQM47SyAE7N2BeUz0Ah3pmCArI0g==",
131 | "dev": true,
132 | "requires": {
133 | "@babel/runtime": "^7.7.2",
134 | "@jimp/utils": "^0.10.2",
135 | "core-js": "^3.4.1",
136 | "tinycolor2": "^1.4.1"
137 | }
138 | },
139 | "@jimp/plugin-contain": {
140 | "version": "0.10.2",
141 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.10.2.tgz",
142 | "integrity": "sha512-oDDe+XdpSwx2OQOSb6ar4O31+4d02Qz4R+1BeucuO7FzOrbDggnCWavSg6RevyOJPDKGkmv8Jj3V6S0jUwgVgw==",
143 | "dev": true,
144 | "requires": {
145 | "@babel/runtime": "^7.7.2",
146 | "@jimp/utils": "^0.10.2",
147 | "core-js": "^3.4.1"
148 | }
149 | },
150 | "@jimp/plugin-cover": {
151 | "version": "0.10.2",
152 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.10.2.tgz",
153 | "integrity": "sha512-cnEqx8kHqBvQA+axKA8qRshwAIIfyxAwjdeRB/LZ9bWroh8XvbifW5buBgITDG5KklDkBhivmDEtPY90r3mMFQ==",
154 | "dev": true,
155 | "requires": {
156 | "@babel/runtime": "^7.7.2",
157 | "@jimp/utils": "^0.10.2",
158 | "core-js": "^3.4.1"
159 | }
160 | },
161 | "@jimp/plugin-crop": {
162 | "version": "0.10.2",
163 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.10.2.tgz",
164 | "integrity": "sha512-6uTb3LMP0kiMqYOAHyU/q/pkScw6aRWkTSxhjgcsewQS3zPHWTSGgP8u6CNAFnlDmVYVIz/jdKlFnnOdf0ZwrA==",
165 | "dev": true,
166 | "requires": {
167 | "@babel/runtime": "^7.7.2",
168 | "@jimp/utils": "^0.10.2",
169 | "core-js": "^3.4.1"
170 | }
171 | },
172 | "@jimp/plugin-displace": {
173 | "version": "0.10.2",
174 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.10.2.tgz",
175 | "integrity": "sha512-AGQDlyeFJz+zszYUkIzi5QyLLPsJzRJNIplU0S0HBxmXf5tZEeiiEtmsaC4j9VoAVD9Jwwn39+cfwV88Ij7WGg==",
176 | "dev": true,
177 | "requires": {
178 | "@babel/runtime": "^7.7.2",
179 | "@jimp/utils": "^0.10.2",
180 | "core-js": "^3.4.1"
181 | }
182 | },
183 | "@jimp/plugin-dither": {
184 | "version": "0.10.2",
185 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.10.2.tgz",
186 | "integrity": "sha512-TEu7n44OS/+F1eWqKumsKYI+i2cPxzRTmxJhxrsUGyDD2aNi7tCIfKILXDqO6Ii0tYgSqwakG2+Eu0Jqg7J/VQ==",
187 | "dev": true,
188 | "requires": {
189 | "@babel/runtime": "^7.7.2",
190 | "@jimp/utils": "^0.10.2",
191 | "core-js": "^3.4.1"
192 | }
193 | },
194 | "@jimp/plugin-fisheye": {
195 | "version": "0.10.2",
196 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.2.tgz",
197 | "integrity": "sha512-kxtfkcnnXitqpTxGaZg/q6bzMBRWCFEWs7maMIgjFkGvXsMegQ90EdKF1Ku76/gCTIGxyfbped8QD/+iACgzFw==",
198 | "dev": true,
199 | "requires": {
200 | "@babel/runtime": "^7.7.2",
201 | "@jimp/utils": "^0.10.2",
202 | "core-js": "^3.4.1"
203 | }
204 | },
205 | "@jimp/plugin-flip": {
206 | "version": "0.10.2",
207 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.10.2.tgz",
208 | "integrity": "sha512-JW/aAKPGYOEGrqldpUBFxHUZ21pwhtxeRiwXEyMu/8N23PVuNBAePKboPMxRvkSLvAOn122xKEyCQvF10v/TOQ==",
209 | "dev": true,
210 | "requires": {
211 | "@babel/runtime": "^7.7.2",
212 | "@jimp/utils": "^0.10.2",
213 | "core-js": "^3.4.1"
214 | }
215 | },
216 | "@jimp/plugin-gaussian": {
217 | "version": "0.10.2",
218 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.2.tgz",
219 | "integrity": "sha512-uP1up3fCIBzGexqs/+HMGBoZckEEcic09RNRj5Lq6EUVY8vFdKeBk3F+tAA+fstpA6yHhjPk1w7FZKX/tkECNw==",
220 | "dev": true,
221 | "requires": {
222 | "@babel/runtime": "^7.7.2",
223 | "@jimp/utils": "^0.10.2",
224 | "core-js": "^3.4.1"
225 | }
226 | },
227 | "@jimp/plugin-invert": {
228 | "version": "0.10.2",
229 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.10.2.tgz",
230 | "integrity": "sha512-zm1NB+AS0fTKW0gmFs1Tjgkj892gtnDicyxzmYeCLoQzPTr/1iPVf2EGidCS88+aw04sA5DOu0UX7637ib7TkA==",
231 | "dev": true,
232 | "requires": {
233 | "@babel/runtime": "^7.7.2",
234 | "@jimp/utils": "^0.10.2",
235 | "core-js": "^3.4.1"
236 | }
237 | },
238 | "@jimp/plugin-mask": {
239 | "version": "0.10.2",
240 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.10.2.tgz",
241 | "integrity": "sha512-4pVBAU6d/7EhfYs8sYuBGB3JMIuvrdiXbt6ESNs4CyDSbiDT4z1/f2sjWvNyLYlJ7cQJ+we50qqvq8vvNnb5lA==",
242 | "dev": true,
243 | "requires": {
244 | "@babel/runtime": "^7.7.2",
245 | "@jimp/utils": "^0.10.2",
246 | "core-js": "^3.4.1"
247 | }
248 | },
249 | "@jimp/plugin-normalize": {
250 | "version": "0.10.2",
251 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.10.2.tgz",
252 | "integrity": "sha512-B2HXf6uaH8EAyZA5KvVYJOfv4AZpferIuDhOQSqDLKAEBBfEViwHk/Rn+nCUzGsAzQ/yiVtKAil68YcybaI6oQ==",
253 | "dev": true,
254 | "requires": {
255 | "@babel/runtime": "^7.7.2",
256 | "@jimp/utils": "^0.10.2",
257 | "core-js": "^3.4.1"
258 | }
259 | },
260 | "@jimp/plugin-print": {
261 | "version": "0.10.2",
262 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.10.2.tgz",
263 | "integrity": "sha512-YXKBG5yNOr/DX958Omk1GzTrprRJ3YXWhJ6tzCbboxqXK6pErLDxFsa1mlngDGb/a43oGs63Myj7CuGf98/vaw==",
264 | "dev": true,
265 | "requires": {
266 | "@babel/runtime": "^7.7.2",
267 | "@jimp/utils": "^0.10.2",
268 | "core-js": "^3.4.1",
269 | "load-bmfont": "^1.4.0"
270 | }
271 | },
272 | "@jimp/plugin-resize": {
273 | "version": "0.10.2",
274 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.10.2.tgz",
275 | "integrity": "sha512-F+pXSU5sbACqqArZfVeYYXrq7qMwZcMs97Z3V70qsLtvDSVyNFG5iYpJhFKJOj05O7a2G7FQ1Nq2h0UKJdlLJg==",
276 | "dev": true,
277 | "requires": {
278 | "@babel/runtime": "^7.7.2",
279 | "@jimp/utils": "^0.10.2",
280 | "core-js": "^3.4.1"
281 | }
282 | },
283 | "@jimp/plugin-rotate": {
284 | "version": "0.10.2",
285 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.10.2.tgz",
286 | "integrity": "sha512-bQ0RQuXS768G9l1HemULJ7puuevU5N3TpE1QV5NdzbKwjHidFAAavp8XFXOhd2Mj/Xh/3iFlMMEB7NG/McYoOA==",
287 | "dev": true,
288 | "requires": {
289 | "@babel/runtime": "^7.7.2",
290 | "@jimp/utils": "^0.10.2",
291 | "core-js": "^3.4.1"
292 | }
293 | },
294 | "@jimp/plugin-scale": {
295 | "version": "0.10.2",
296 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.10.2.tgz",
297 | "integrity": "sha512-47GRG3joOGDBLHYyLR0tc3hEz/H8tgPcLZaNEAaIdyL+ckAWQIgnoytbqj7OEAFeMj5j+loNm+ahJVX7w/X/ug==",
298 | "dev": true,
299 | "requires": {
300 | "@babel/runtime": "^7.7.2",
301 | "@jimp/utils": "^0.10.2",
302 | "core-js": "^3.4.1"
303 | }
304 | },
305 | "@jimp/plugin-shadow": {
306 | "version": "0.10.2",
307 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.10.2.tgz",
308 | "integrity": "sha512-koksEMJZKjq8OiprLh+ffrRo/x/dXHCsfaKS4kf2EoFZEb6sZHeJgKLwozLky1DXBPiMryYSrNt8Cb6wzjd1zA==",
309 | "dev": true,
310 | "requires": {
311 | "@babel/runtime": "^7.7.2",
312 | "@jimp/utils": "^0.10.2",
313 | "core-js": "^3.4.1"
314 | }
315 | },
316 | "@jimp/plugin-threshold": {
317 | "version": "0.10.2",
318 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.10.2.tgz",
319 | "integrity": "sha512-RQzxB40KK50iUUNLF9M7G3dVKFmbe/T4EQVWMPxxX8NQPNbU0vjZzTW0vVYoTYno2vLxewQgV0Y3ydX/l08NLg==",
320 | "dev": true,
321 | "requires": {
322 | "@babel/runtime": "^7.7.2",
323 | "@jimp/utils": "^0.10.2",
324 | "core-js": "^3.4.1"
325 | }
326 | },
327 | "@jimp/plugins": {
328 | "version": "0.10.2",
329 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.10.2.tgz",
330 | "integrity": "sha512-z4Fhu97WZIussTzd1PJXUUuluushXlfCYzXifixf8fGAoVGZuMMJl6aqtuy4eUOgLyN8sXun0MzdWAahelqbfA==",
331 | "dev": true,
332 | "requires": {
333 | "@babel/runtime": "^7.7.2",
334 | "@jimp/plugin-blit": "^0.10.2",
335 | "@jimp/plugin-blur": "^0.10.2",
336 | "@jimp/plugin-circle": "^0.10.2",
337 | "@jimp/plugin-color": "^0.10.2",
338 | "@jimp/plugin-contain": "^0.10.2",
339 | "@jimp/plugin-cover": "^0.10.2",
340 | "@jimp/plugin-crop": "^0.10.2",
341 | "@jimp/plugin-displace": "^0.10.2",
342 | "@jimp/plugin-dither": "^0.10.2",
343 | "@jimp/plugin-fisheye": "^0.10.2",
344 | "@jimp/plugin-flip": "^0.10.2",
345 | "@jimp/plugin-gaussian": "^0.10.2",
346 | "@jimp/plugin-invert": "^0.10.2",
347 | "@jimp/plugin-mask": "^0.10.2",
348 | "@jimp/plugin-normalize": "^0.10.2",
349 | "@jimp/plugin-print": "^0.10.2",
350 | "@jimp/plugin-resize": "^0.10.2",
351 | "@jimp/plugin-rotate": "^0.10.2",
352 | "@jimp/plugin-scale": "^0.10.2",
353 | "@jimp/plugin-shadow": "^0.10.2",
354 | "@jimp/plugin-threshold": "^0.10.2",
355 | "core-js": "^3.4.1",
356 | "timm": "^1.6.1"
357 | }
358 | },
359 | "@jimp/png": {
360 | "version": "0.10.2",
361 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.10.2.tgz",
362 | "integrity": "sha512-3r5q9Ns3Gz8pcI8oBdGTY7d0TkkW4atZ12bknB1sABc3UYX69arqmTvrULMYhWf0M6n3tKHdnmdW2cTlFWIAbw==",
363 | "dev": true,
364 | "requires": {
365 | "@babel/runtime": "^7.7.2",
366 | "@jimp/utils": "^0.10.2",
367 | "core-js": "^3.4.1",
368 | "pngjs": "^3.3.3"
369 | }
370 | },
371 | "@jimp/tiff": {
372 | "version": "0.10.2",
373 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.10.2.tgz",
374 | "integrity": "sha512-uuJF6ZMXo0EDyooho9RhwAY9YGcgUju1mw53N9BtU7E9Y+AxKn7miaK2niROmN2/ufmLJO8vS9zjpgAxv+zgKQ==",
375 | "dev": true,
376 | "requires": {
377 | "@babel/runtime": "^7.7.2",
378 | "core-js": "^3.4.1",
379 | "utif": "^2.0.1"
380 | }
381 | },
382 | "@jimp/types": {
383 | "version": "0.10.2",
384 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.10.2.tgz",
385 | "integrity": "sha512-XCgFhH8BR0ovxrEkDnKRXalEAUjo3vW9vwOFxfSrJR/YS/k0TsvYB6/+QAU/cGwcN8icmYdDyhq2yhJACAl13w==",
386 | "dev": true,
387 | "requires": {
388 | "@babel/runtime": "^7.7.2",
389 | "@jimp/bmp": "^0.10.2",
390 | "@jimp/gif": "^0.10.2",
391 | "@jimp/jpeg": "^0.10.2",
392 | "@jimp/png": "^0.10.2",
393 | "@jimp/tiff": "^0.10.2",
394 | "core-js": "^3.4.1",
395 | "timm": "^1.6.1"
396 | }
397 | },
398 | "@jimp/utils": {
399 | "version": "0.10.2",
400 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.10.2.tgz",
401 | "integrity": "sha512-B3fBgkE7t7S4X1RXKY5vfx+8QdUvN0AIbG2rM7csYTsudOczTtzimlP7XxunYtOwCYBLVswRWpqn8PZcRLWu2w==",
402 | "dev": true,
403 | "requires": {
404 | "@babel/runtime": "^7.7.2",
405 | "core-js": "^3.4.1",
406 | "regenerator-runtime": "^0.13.3"
407 | }
408 | },
409 | "@types/mocha": {
410 | "version": "8.2.0",
411 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz",
412 | "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==",
413 | "dev": true
414 | },
415 | "@types/node": {
416 | "version": "14.0.1",
417 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz",
418 | "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==",
419 | "dev": true
420 | },
421 | "abbrev": {
422 | "version": "1.1.1",
423 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
424 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
425 | "dev": true
426 | },
427 | "ansi-regex": {
428 | "version": "2.1.1",
429 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
430 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
431 | "dev": true
432 | },
433 | "ansi-styles": {
434 | "version": "3.2.1",
435 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
436 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
437 | "dev": true,
438 | "requires": {
439 | "color-convert": "^1.9.0"
440 | }
441 | },
442 | "any-base": {
443 | "version": "1.1.0",
444 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
445 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
446 | "dev": true
447 | },
448 | "anymatch": {
449 | "version": "3.1.1",
450 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
451 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
452 | "dev": true,
453 | "requires": {
454 | "normalize-path": "^3.0.0",
455 | "picomatch": "^2.0.4"
456 | }
457 | },
458 | "argparse": {
459 | "version": "1.0.10",
460 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
461 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
462 | "dev": true,
463 | "requires": {
464 | "sprintf-js": "~1.0.2"
465 | }
466 | },
467 | "assertion-error": {
468 | "version": "1.1.0",
469 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
470 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
471 | "dev": true
472 | },
473 | "balanced-match": {
474 | "version": "1.0.0",
475 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
476 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
477 | "dev": true
478 | },
479 | "base64-js": {
480 | "version": "1.3.1",
481 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
482 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
483 | "dev": true
484 | },
485 | "binary-extensions": {
486 | "version": "2.0.0",
487 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
488 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
489 | "dev": true
490 | },
491 | "bmp-js": {
492 | "version": "0.1.0",
493 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
494 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=",
495 | "dev": true
496 | },
497 | "brace-expansion": {
498 | "version": "1.1.11",
499 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
500 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
501 | "dev": true,
502 | "requires": {
503 | "balanced-match": "^1.0.0",
504 | "concat-map": "0.0.1"
505 | }
506 | },
507 | "braces": {
508 | "version": "3.0.2",
509 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
510 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
511 | "dev": true,
512 | "requires": {
513 | "fill-range": "^7.0.1"
514 | }
515 | },
516 | "browser-stdout": {
517 | "version": "1.3.1",
518 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
519 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
520 | "dev": true
521 | },
522 | "buffer": {
523 | "version": "5.6.0",
524 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
525 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
526 | "dev": true,
527 | "requires": {
528 | "base64-js": "^1.0.2",
529 | "ieee754": "^1.1.4"
530 | }
531 | },
532 | "buffer-equal": {
533 | "version": "0.0.1",
534 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
535 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=",
536 | "dev": true
537 | },
538 | "camelcase": {
539 | "version": "5.3.1",
540 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
541 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
542 | "dev": true
543 | },
544 | "chai": {
545 | "version": "4.2.0",
546 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
547 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
548 | "dev": true,
549 | "requires": {
550 | "assertion-error": "^1.1.0",
551 | "check-error": "^1.0.2",
552 | "deep-eql": "^3.0.1",
553 | "get-func-name": "^2.0.0",
554 | "pathval": "^1.1.0",
555 | "type-detect": "^4.0.5"
556 | }
557 | },
558 | "chalk": {
559 | "version": "2.4.2",
560 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
561 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
562 | "dev": true,
563 | "requires": {
564 | "ansi-styles": "^3.2.1",
565 | "escape-string-regexp": "^1.0.5",
566 | "supports-color": "^5.3.0"
567 | },
568 | "dependencies": {
569 | "supports-color": {
570 | "version": "5.5.0",
571 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
572 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
573 | "dev": true,
574 | "requires": {
575 | "has-flag": "^3.0.0"
576 | }
577 | }
578 | }
579 | },
580 | "check-error": {
581 | "version": "1.0.2",
582 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
583 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
584 | "dev": true
585 | },
586 | "chokidar": {
587 | "version": "3.3.0",
588 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
589 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
590 | "dev": true,
591 | "requires": {
592 | "anymatch": "~3.1.1",
593 | "braces": "~3.0.2",
594 | "fsevents": "~2.1.1",
595 | "glob-parent": "~5.1.0",
596 | "is-binary-path": "~2.1.0",
597 | "is-glob": "~4.0.1",
598 | "normalize-path": "~3.0.0",
599 | "readdirp": "~3.2.0"
600 | }
601 | },
602 | "cliui": {
603 | "version": "5.0.0",
604 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
605 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
606 | "dev": true,
607 | "requires": {
608 | "string-width": "^3.1.0",
609 | "strip-ansi": "^5.2.0",
610 | "wrap-ansi": "^5.1.0"
611 | },
612 | "dependencies": {
613 | "ansi-regex": {
614 | "version": "4.1.0",
615 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
616 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
617 | "dev": true
618 | },
619 | "is-fullwidth-code-point": {
620 | "version": "2.0.0",
621 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
622 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
623 | "dev": true
624 | },
625 | "string-width": {
626 | "version": "3.1.0",
627 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
628 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
629 | "dev": true,
630 | "requires": {
631 | "emoji-regex": "^7.0.1",
632 | "is-fullwidth-code-point": "^2.0.0",
633 | "strip-ansi": "^5.1.0"
634 | }
635 | },
636 | "strip-ansi": {
637 | "version": "5.2.0",
638 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
639 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
640 | "dev": true,
641 | "requires": {
642 | "ansi-regex": "^4.1.0"
643 | }
644 | }
645 | }
646 | },
647 | "code-point-at": {
648 | "version": "1.1.0",
649 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
650 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
651 | "dev": true
652 | },
653 | "color-convert": {
654 | "version": "1.9.3",
655 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
656 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
657 | "dev": true,
658 | "requires": {
659 | "color-name": "1.1.3"
660 | }
661 | },
662 | "color-name": {
663 | "version": "1.1.3",
664 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
665 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
666 | "dev": true
667 | },
668 | "commander": {
669 | "version": "2.20.3",
670 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
671 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
672 | "dev": true
673 | },
674 | "concat-map": {
675 | "version": "0.0.1",
676 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
677 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
678 | "dev": true
679 | },
680 | "config-chain": {
681 | "version": "1.1.12",
682 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
683 | "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
684 | "dev": true,
685 | "requires": {
686 | "ini": "^1.3.4",
687 | "proto-list": "~1.2.1"
688 | }
689 | },
690 | "core-js": {
691 | "version": "3.6.5",
692 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
693 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
694 | "dev": true
695 | },
696 | "debug": {
697 | "version": "3.2.6",
698 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
699 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
700 | "dev": true,
701 | "requires": {
702 | "ms": "^2.1.1"
703 | }
704 | },
705 | "decamelize": {
706 | "version": "1.2.0",
707 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
708 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
709 | "dev": true
710 | },
711 | "deep-eql": {
712 | "version": "3.0.1",
713 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
714 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
715 | "dev": true,
716 | "requires": {
717 | "type-detect": "^4.0.0"
718 | }
719 | },
720 | "define-properties": {
721 | "version": "1.1.3",
722 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
723 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
724 | "dev": true,
725 | "requires": {
726 | "object-keys": "^1.0.12"
727 | }
728 | },
729 | "diff": {
730 | "version": "3.5.0",
731 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
732 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
733 | "dev": true
734 | },
735 | "dom-walk": {
736 | "version": "0.1.2",
737 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
738 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==",
739 | "dev": true
740 | },
741 | "editorconfig": {
742 | "version": "0.15.3",
743 | "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
744 | "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
745 | "dev": true,
746 | "requires": {
747 | "commander": "^2.19.0",
748 | "lru-cache": "^4.1.5",
749 | "semver": "^5.6.0",
750 | "sigmund": "^1.0.1"
751 | }
752 | },
753 | "emoji-regex": {
754 | "version": "7.0.3",
755 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
756 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
757 | "dev": true
758 | },
759 | "es-abstract": {
760 | "version": "1.17.5",
761 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
762 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
763 | "dev": true,
764 | "requires": {
765 | "es-to-primitive": "^1.2.1",
766 | "function-bind": "^1.1.1",
767 | "has": "^1.0.3",
768 | "has-symbols": "^1.0.1",
769 | "is-callable": "^1.1.5",
770 | "is-regex": "^1.0.5",
771 | "object-inspect": "^1.7.0",
772 | "object-keys": "^1.1.1",
773 | "object.assign": "^4.1.0",
774 | "string.prototype.trimleft": "^2.1.1",
775 | "string.prototype.trimright": "^2.1.1"
776 | }
777 | },
778 | "es-to-primitive": {
779 | "version": "1.2.1",
780 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
781 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
782 | "dev": true,
783 | "requires": {
784 | "is-callable": "^1.1.4",
785 | "is-date-object": "^1.0.1",
786 | "is-symbol": "^1.0.2"
787 | }
788 | },
789 | "escape-string-regexp": {
790 | "version": "1.0.5",
791 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
792 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
793 | "dev": true
794 | },
795 | "esprima": {
796 | "version": "4.0.1",
797 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
798 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
799 | "dev": true
800 | },
801 | "exif-parser": {
802 | "version": "0.1.12",
803 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
804 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=",
805 | "dev": true
806 | },
807 | "file-type": {
808 | "version": "9.0.0",
809 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
810 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
811 | "dev": true
812 | },
813 | "fill-range": {
814 | "version": "7.0.1",
815 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
816 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
817 | "dev": true,
818 | "requires": {
819 | "to-regex-range": "^5.0.1"
820 | }
821 | },
822 | "find-up": {
823 | "version": "3.0.0",
824 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
825 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
826 | "dev": true,
827 | "requires": {
828 | "locate-path": "^3.0.0"
829 | }
830 | },
831 | "flat": {
832 | "version": "4.1.0",
833 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
834 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
835 | "dev": true,
836 | "requires": {
837 | "is-buffer": "~2.0.3"
838 | }
839 | },
840 | "fs.realpath": {
841 | "version": "1.0.0",
842 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
843 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
844 | "dev": true
845 | },
846 | "fsevents": {
847 | "version": "2.1.3",
848 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
849 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
850 | "dev": true,
851 | "optional": true
852 | },
853 | "function-bind": {
854 | "version": "1.1.1",
855 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
856 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
857 | "dev": true
858 | },
859 | "get-caller-file": {
860 | "version": "2.0.5",
861 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
862 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
863 | "dev": true
864 | },
865 | "get-func-name": {
866 | "version": "2.0.0",
867 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
868 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
869 | "dev": true
870 | },
871 | "glob": {
872 | "version": "7.1.6",
873 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
874 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
875 | "dev": true,
876 | "requires": {
877 | "fs.realpath": "^1.0.0",
878 | "inflight": "^1.0.4",
879 | "inherits": "2",
880 | "minimatch": "^3.0.4",
881 | "once": "^1.3.0",
882 | "path-is-absolute": "^1.0.0"
883 | }
884 | },
885 | "glob-parent": {
886 | "version": "5.1.1",
887 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
888 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
889 | "dev": true,
890 | "requires": {
891 | "is-glob": "^4.0.1"
892 | }
893 | },
894 | "global": {
895 | "version": "4.3.2",
896 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
897 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
898 | "dev": true,
899 | "requires": {
900 | "min-document": "^2.19.0",
901 | "process": "~0.5.1"
902 | }
903 | },
904 | "growl": {
905 | "version": "1.10.5",
906 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
907 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
908 | "dev": true
909 | },
910 | "has": {
911 | "version": "1.0.3",
912 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
913 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
914 | "dev": true,
915 | "requires": {
916 | "function-bind": "^1.1.1"
917 | }
918 | },
919 | "has-flag": {
920 | "version": "3.0.0",
921 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
922 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
923 | "dev": true
924 | },
925 | "has-symbols": {
926 | "version": "1.0.1",
927 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
928 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
929 | "dev": true
930 | },
931 | "he": {
932 | "version": "1.2.0",
933 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
934 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
935 | "dev": true
936 | },
937 | "ieee754": {
938 | "version": "1.1.13",
939 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
940 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
941 | "dev": true
942 | },
943 | "inflight": {
944 | "version": "1.0.6",
945 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
946 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
947 | "dev": true,
948 | "requires": {
949 | "once": "^1.3.0",
950 | "wrappy": "1"
951 | }
952 | },
953 | "inherits": {
954 | "version": "2.0.4",
955 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
956 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
957 | "dev": true
958 | },
959 | "ini": {
960 | "version": "1.3.8",
961 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
962 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
963 | "dev": true
964 | },
965 | "is-binary-path": {
966 | "version": "2.1.0",
967 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
968 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
969 | "dev": true,
970 | "requires": {
971 | "binary-extensions": "^2.0.0"
972 | }
973 | },
974 | "is-buffer": {
975 | "version": "2.0.4",
976 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
977 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
978 | "dev": true
979 | },
980 | "is-callable": {
981 | "version": "1.1.5",
982 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
983 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
984 | "dev": true
985 | },
986 | "is-date-object": {
987 | "version": "1.0.2",
988 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
989 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
990 | "dev": true
991 | },
992 | "is-extglob": {
993 | "version": "2.1.1",
994 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
995 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
996 | "dev": true
997 | },
998 | "is-fullwidth-code-point": {
999 | "version": "1.0.0",
1000 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1001 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1002 | "dev": true,
1003 | "requires": {
1004 | "number-is-nan": "^1.0.0"
1005 | }
1006 | },
1007 | "is-function": {
1008 | "version": "1.0.1",
1009 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
1010 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=",
1011 | "dev": true
1012 | },
1013 | "is-glob": {
1014 | "version": "4.0.1",
1015 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1016 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1017 | "dev": true,
1018 | "requires": {
1019 | "is-extglob": "^2.1.1"
1020 | }
1021 | },
1022 | "is-number": {
1023 | "version": "7.0.0",
1024 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1025 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1026 | "dev": true
1027 | },
1028 | "is-regex": {
1029 | "version": "1.0.5",
1030 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
1031 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
1032 | "dev": true,
1033 | "requires": {
1034 | "has": "^1.0.3"
1035 | }
1036 | },
1037 | "is-symbol": {
1038 | "version": "1.0.3",
1039 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1040 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1041 | "dev": true,
1042 | "requires": {
1043 | "has-symbols": "^1.0.1"
1044 | }
1045 | },
1046 | "isexe": {
1047 | "version": "2.0.0",
1048 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1049 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1050 | "dev": true
1051 | },
1052 | "jimp": {
1053 | "version": "0.10.2",
1054 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.10.2.tgz",
1055 | "integrity": "sha512-dt6n3P0LZyoqAiIUur+gJEKS55sCUUo19cKx8LTSZRqGizF4JN0jfRAnfnV4nxF+sINP2FN6SOi82gHcAMm1nQ==",
1056 | "dev": true,
1057 | "requires": {
1058 | "@babel/runtime": "^7.7.2",
1059 | "@jimp/custom": "^0.10.2",
1060 | "@jimp/plugins": "^0.10.2",
1061 | "@jimp/types": "^0.10.2",
1062 | "core-js": "^3.4.1",
1063 | "regenerator-runtime": "^0.13.3"
1064 | }
1065 | },
1066 | "jpeg-js": {
1067 | "version": "0.3.7",
1068 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
1069 | "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
1070 | "dev": true
1071 | },
1072 | "js-beautify": {
1073 | "version": "1.13.4",
1074 | "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.4.tgz",
1075 | "integrity": "sha512-M5yEWwonlEO3kPcCZ3K3KBSpFRZAEO3FAWC6wtbIGeyg7dusStxvF0WG+HRLBoMZqREXSRSxkkqClDE865x1sg==",
1076 | "dev": true,
1077 | "requires": {
1078 | "config-chain": "^1.1.12",
1079 | "editorconfig": "^0.15.3",
1080 | "glob": "^7.1.3",
1081 | "mkdirp": "^1.0.4",
1082 | "nopt": "^5.0.0"
1083 | },
1084 | "dependencies": {
1085 | "mkdirp": {
1086 | "version": "1.0.4",
1087 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1088 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
1089 | "dev": true
1090 | }
1091 | }
1092 | },
1093 | "js-yaml": {
1094 | "version": "3.13.1",
1095 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1096 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1097 | "dev": true,
1098 | "requires": {
1099 | "argparse": "^1.0.7",
1100 | "esprima": "^4.0.0"
1101 | }
1102 | },
1103 | "load-bmfont": {
1104 | "version": "1.4.0",
1105 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz",
1106 | "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==",
1107 | "dev": true,
1108 | "requires": {
1109 | "buffer-equal": "0.0.1",
1110 | "mime": "^1.3.4",
1111 | "parse-bmfont-ascii": "^1.0.3",
1112 | "parse-bmfont-binary": "^1.0.5",
1113 | "parse-bmfont-xml": "^1.1.4",
1114 | "phin": "^2.9.1",
1115 | "xhr": "^2.0.1",
1116 | "xtend": "^4.0.0"
1117 | }
1118 | },
1119 | "locate-path": {
1120 | "version": "3.0.0",
1121 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1122 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1123 | "dev": true,
1124 | "requires": {
1125 | "p-locate": "^3.0.0",
1126 | "path-exists": "^3.0.0"
1127 | }
1128 | },
1129 | "lodash": {
1130 | "version": "4.17.15",
1131 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1132 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1133 | "dev": true
1134 | },
1135 | "log-symbols": {
1136 | "version": "3.0.0",
1137 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1138 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1139 | "dev": true,
1140 | "requires": {
1141 | "chalk": "^2.4.2"
1142 | }
1143 | },
1144 | "lru-cache": {
1145 | "version": "4.1.5",
1146 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1147 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1148 | "dev": true,
1149 | "requires": {
1150 | "pseudomap": "^1.0.2",
1151 | "yallist": "^2.1.2"
1152 | }
1153 | },
1154 | "mime": {
1155 | "version": "1.6.0",
1156 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1157 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1158 | "dev": true
1159 | },
1160 | "min-document": {
1161 | "version": "2.19.0",
1162 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
1163 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
1164 | "dev": true,
1165 | "requires": {
1166 | "dom-walk": "^0.1.0"
1167 | }
1168 | },
1169 | "minimatch": {
1170 | "version": "3.0.4",
1171 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1172 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1173 | "dev": true,
1174 | "requires": {
1175 | "brace-expansion": "^1.1.7"
1176 | }
1177 | },
1178 | "minimist": {
1179 | "version": "1.2.5",
1180 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1181 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1182 | "dev": true
1183 | },
1184 | "mkdirp": {
1185 | "version": "0.5.5",
1186 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1187 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1188 | "dev": true,
1189 | "requires": {
1190 | "minimist": "^1.2.5"
1191 | }
1192 | },
1193 | "mocha": {
1194 | "version": "7.1.2",
1195 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz",
1196 | "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==",
1197 | "dev": true,
1198 | "requires": {
1199 | "ansi-colors": "3.2.3",
1200 | "browser-stdout": "1.3.1",
1201 | "chokidar": "3.3.0",
1202 | "debug": "3.2.6",
1203 | "diff": "3.5.0",
1204 | "escape-string-regexp": "1.0.5",
1205 | "find-up": "3.0.0",
1206 | "glob": "7.1.3",
1207 | "growl": "1.10.5",
1208 | "he": "1.2.0",
1209 | "js-yaml": "3.13.1",
1210 | "log-symbols": "3.0.0",
1211 | "minimatch": "3.0.4",
1212 | "mkdirp": "0.5.5",
1213 | "ms": "2.1.1",
1214 | "node-environment-flags": "1.0.6",
1215 | "object.assign": "4.1.0",
1216 | "strip-json-comments": "2.0.1",
1217 | "supports-color": "6.0.0",
1218 | "which": "1.3.1",
1219 | "wide-align": "1.1.3",
1220 | "yargs": "13.3.2",
1221 | "yargs-parser": "13.1.2",
1222 | "yargs-unparser": "1.6.0"
1223 | },
1224 | "dependencies": {
1225 | "ansi-colors": {
1226 | "version": "3.2.3",
1227 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
1228 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
1229 | "dev": true
1230 | },
1231 | "glob": {
1232 | "version": "7.1.3",
1233 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1234 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1235 | "dev": true,
1236 | "requires": {
1237 | "fs.realpath": "^1.0.0",
1238 | "inflight": "^1.0.4",
1239 | "inherits": "2",
1240 | "minimatch": "^3.0.4",
1241 | "once": "^1.3.0",
1242 | "path-is-absolute": "^1.0.0"
1243 | }
1244 | },
1245 | "ms": {
1246 | "version": "2.1.1",
1247 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1248 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1249 | "dev": true
1250 | }
1251 | }
1252 | },
1253 | "ms": {
1254 | "version": "2.1.2",
1255 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1256 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1257 | "dev": true
1258 | },
1259 | "node-environment-flags": {
1260 | "version": "1.0.6",
1261 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
1262 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
1263 | "dev": true,
1264 | "requires": {
1265 | "object.getownpropertydescriptors": "^2.0.3",
1266 | "semver": "^5.7.0"
1267 | }
1268 | },
1269 | "nopt": {
1270 | "version": "5.0.0",
1271 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
1272 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
1273 | "dev": true,
1274 | "requires": {
1275 | "abbrev": "1"
1276 | }
1277 | },
1278 | "normalize-path": {
1279 | "version": "3.0.0",
1280 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1281 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1282 | "dev": true
1283 | },
1284 | "number-is-nan": {
1285 | "version": "1.0.1",
1286 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1287 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1288 | "dev": true
1289 | },
1290 | "object-inspect": {
1291 | "version": "1.7.0",
1292 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
1293 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
1294 | "dev": true
1295 | },
1296 | "object-keys": {
1297 | "version": "1.1.1",
1298 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1299 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1300 | "dev": true
1301 | },
1302 | "object.assign": {
1303 | "version": "4.1.0",
1304 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1305 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1306 | "dev": true,
1307 | "requires": {
1308 | "define-properties": "^1.1.2",
1309 | "function-bind": "^1.1.1",
1310 | "has-symbols": "^1.0.0",
1311 | "object-keys": "^1.0.11"
1312 | }
1313 | },
1314 | "object.getownpropertydescriptors": {
1315 | "version": "2.1.0",
1316 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
1317 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
1318 | "dev": true,
1319 | "requires": {
1320 | "define-properties": "^1.1.3",
1321 | "es-abstract": "^1.17.0-next.1"
1322 | }
1323 | },
1324 | "omggif": {
1325 | "version": "1.0.10",
1326 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
1327 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
1328 | "dev": true
1329 | },
1330 | "once": {
1331 | "version": "1.4.0",
1332 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1333 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1334 | "dev": true,
1335 | "requires": {
1336 | "wrappy": "1"
1337 | }
1338 | },
1339 | "p-limit": {
1340 | "version": "2.3.0",
1341 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1342 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1343 | "dev": true,
1344 | "requires": {
1345 | "p-try": "^2.0.0"
1346 | }
1347 | },
1348 | "p-locate": {
1349 | "version": "3.0.0",
1350 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1351 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1352 | "dev": true,
1353 | "requires": {
1354 | "p-limit": "^2.0.0"
1355 | }
1356 | },
1357 | "p-try": {
1358 | "version": "2.2.0",
1359 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1360 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1361 | "dev": true
1362 | },
1363 | "pako": {
1364 | "version": "1.0.11",
1365 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
1366 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
1367 | "dev": true
1368 | },
1369 | "parse-bmfont-ascii": {
1370 | "version": "1.0.6",
1371 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
1372 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=",
1373 | "dev": true
1374 | },
1375 | "parse-bmfont-binary": {
1376 | "version": "1.0.6",
1377 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
1378 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=",
1379 | "dev": true
1380 | },
1381 | "parse-bmfont-xml": {
1382 | "version": "1.1.4",
1383 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
1384 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
1385 | "dev": true,
1386 | "requires": {
1387 | "xml-parse-from-string": "^1.0.0",
1388 | "xml2js": "^0.4.5"
1389 | }
1390 | },
1391 | "parse-headers": {
1392 | "version": "2.0.3",
1393 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
1394 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==",
1395 | "dev": true
1396 | },
1397 | "path-exists": {
1398 | "version": "3.0.0",
1399 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1400 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1401 | "dev": true
1402 | },
1403 | "path-is-absolute": {
1404 | "version": "1.0.1",
1405 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1406 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1407 | "dev": true
1408 | },
1409 | "pathval": {
1410 | "version": "1.1.0",
1411 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
1412 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
1413 | "dev": true
1414 | },
1415 | "phin": {
1416 | "version": "2.9.3",
1417 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
1418 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
1419 | "dev": true
1420 | },
1421 | "picomatch": {
1422 | "version": "2.2.2",
1423 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1424 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1425 | "dev": true
1426 | },
1427 | "pixelmatch": {
1428 | "version": "5.2.0",
1429 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.0.tgz",
1430 | "integrity": "sha512-TdleROuanI+Uo/4PcOAH7b7qgO4kjzJO8K4y/TBAo1wx/5BE8cn1B0I6Jfk3mKcJsGpWvX7zjM8OjU5o9i+aog==",
1431 | "dev": true,
1432 | "requires": {
1433 | "pngjs": "^4.0.1"
1434 | },
1435 | "dependencies": {
1436 | "pngjs": {
1437 | "version": "4.0.1",
1438 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz",
1439 | "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==",
1440 | "dev": true
1441 | }
1442 | }
1443 | },
1444 | "pngjs": {
1445 | "version": "3.4.0",
1446 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
1447 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
1448 | "dev": true
1449 | },
1450 | "process": {
1451 | "version": "0.5.2",
1452 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
1453 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=",
1454 | "dev": true
1455 | },
1456 | "proto-list": {
1457 | "version": "1.2.4",
1458 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
1459 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
1460 | "dev": true
1461 | },
1462 | "pseudomap": {
1463 | "version": "1.0.2",
1464 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1465 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1466 | "dev": true
1467 | },
1468 | "readdirp": {
1469 | "version": "3.2.0",
1470 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
1471 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
1472 | "dev": true,
1473 | "requires": {
1474 | "picomatch": "^2.0.4"
1475 | }
1476 | },
1477 | "regenerator-runtime": {
1478 | "version": "0.13.5",
1479 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
1480 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
1481 | "dev": true
1482 | },
1483 | "require-directory": {
1484 | "version": "2.1.1",
1485 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1486 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1487 | "dev": true
1488 | },
1489 | "require-main-filename": {
1490 | "version": "2.0.0",
1491 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1492 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1493 | "dev": true
1494 | },
1495 | "sax": {
1496 | "version": "1.2.4",
1497 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
1498 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
1499 | "dev": true
1500 | },
1501 | "semver": {
1502 | "version": "5.7.1",
1503 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1504 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1505 | "dev": true
1506 | },
1507 | "set-blocking": {
1508 | "version": "2.0.0",
1509 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1510 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1511 | "dev": true
1512 | },
1513 | "sigmund": {
1514 | "version": "1.0.1",
1515 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
1516 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
1517 | "dev": true
1518 | },
1519 | "sprintf-js": {
1520 | "version": "1.0.3",
1521 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1522 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1523 | "dev": true
1524 | },
1525 | "string-width": {
1526 | "version": "1.0.2",
1527 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1528 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1529 | "dev": true,
1530 | "requires": {
1531 | "code-point-at": "^1.0.0",
1532 | "is-fullwidth-code-point": "^1.0.0",
1533 | "strip-ansi": "^3.0.0"
1534 | }
1535 | },
1536 | "string.prototype.trimend": {
1537 | "version": "1.0.1",
1538 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
1539 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
1540 | "dev": true,
1541 | "requires": {
1542 | "define-properties": "^1.1.3",
1543 | "es-abstract": "^1.17.5"
1544 | }
1545 | },
1546 | "string.prototype.trimleft": {
1547 | "version": "2.1.2",
1548 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
1549 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
1550 | "dev": true,
1551 | "requires": {
1552 | "define-properties": "^1.1.3",
1553 | "es-abstract": "^1.17.5",
1554 | "string.prototype.trimstart": "^1.0.0"
1555 | }
1556 | },
1557 | "string.prototype.trimright": {
1558 | "version": "2.1.2",
1559 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
1560 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
1561 | "dev": true,
1562 | "requires": {
1563 | "define-properties": "^1.1.3",
1564 | "es-abstract": "^1.17.5",
1565 | "string.prototype.trimend": "^1.0.0"
1566 | }
1567 | },
1568 | "string.prototype.trimstart": {
1569 | "version": "1.0.1",
1570 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
1571 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
1572 | "dev": true,
1573 | "requires": {
1574 | "define-properties": "^1.1.3",
1575 | "es-abstract": "^1.17.5"
1576 | }
1577 | },
1578 | "strip-ansi": {
1579 | "version": "3.0.1",
1580 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1581 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1582 | "dev": true,
1583 | "requires": {
1584 | "ansi-regex": "^2.0.0"
1585 | }
1586 | },
1587 | "strip-json-comments": {
1588 | "version": "2.0.1",
1589 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1590 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1591 | "dev": true
1592 | },
1593 | "supports-color": {
1594 | "version": "6.0.0",
1595 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
1596 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
1597 | "dev": true,
1598 | "requires": {
1599 | "has-flag": "^3.0.0"
1600 | }
1601 | },
1602 | "timm": {
1603 | "version": "1.6.2",
1604 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz",
1605 | "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==",
1606 | "dev": true
1607 | },
1608 | "tinycolor2": {
1609 | "version": "1.4.1",
1610 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
1611 | "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=",
1612 | "dev": true
1613 | },
1614 | "to-regex-range": {
1615 | "version": "5.0.1",
1616 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1617 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1618 | "dev": true,
1619 | "requires": {
1620 | "is-number": "^7.0.0"
1621 | }
1622 | },
1623 | "type-detect": {
1624 | "version": "4.0.8",
1625 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
1626 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
1627 | "dev": true
1628 | },
1629 | "utif": {
1630 | "version": "2.0.1",
1631 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
1632 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
1633 | "dev": true,
1634 | "requires": {
1635 | "pako": "^1.0.5"
1636 | }
1637 | },
1638 | "which": {
1639 | "version": "1.3.1",
1640 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1641 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1642 | "dev": true,
1643 | "requires": {
1644 | "isexe": "^2.0.0"
1645 | }
1646 | },
1647 | "which-module": {
1648 | "version": "2.0.0",
1649 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
1650 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
1651 | "dev": true
1652 | },
1653 | "wide-align": {
1654 | "version": "1.1.3",
1655 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
1656 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
1657 | "dev": true,
1658 | "requires": {
1659 | "string-width": "^1.0.2 || 2"
1660 | }
1661 | },
1662 | "wrap-ansi": {
1663 | "version": "5.1.0",
1664 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
1665 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
1666 | "dev": true,
1667 | "requires": {
1668 | "ansi-styles": "^3.2.0",
1669 | "string-width": "^3.0.0",
1670 | "strip-ansi": "^5.0.0"
1671 | },
1672 | "dependencies": {
1673 | "ansi-regex": {
1674 | "version": "4.1.0",
1675 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1676 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1677 | "dev": true
1678 | },
1679 | "is-fullwidth-code-point": {
1680 | "version": "2.0.0",
1681 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1682 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1683 | "dev": true
1684 | },
1685 | "string-width": {
1686 | "version": "3.1.0",
1687 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1688 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1689 | "dev": true,
1690 | "requires": {
1691 | "emoji-regex": "^7.0.1",
1692 | "is-fullwidth-code-point": "^2.0.0",
1693 | "strip-ansi": "^5.1.0"
1694 | }
1695 | },
1696 | "strip-ansi": {
1697 | "version": "5.2.0",
1698 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1699 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1700 | "dev": true,
1701 | "requires": {
1702 | "ansi-regex": "^4.1.0"
1703 | }
1704 | }
1705 | }
1706 | },
1707 | "wrappy": {
1708 | "version": "1.0.2",
1709 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1710 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1711 | "dev": true
1712 | },
1713 | "xhr": {
1714 | "version": "2.5.0",
1715 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz",
1716 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==",
1717 | "dev": true,
1718 | "requires": {
1719 | "global": "~4.3.0",
1720 | "is-function": "^1.0.1",
1721 | "parse-headers": "^2.0.0",
1722 | "xtend": "^4.0.0"
1723 | }
1724 | },
1725 | "xml-parse-from-string": {
1726 | "version": "1.0.1",
1727 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
1728 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=",
1729 | "dev": true
1730 | },
1731 | "xml2js": {
1732 | "version": "0.4.23",
1733 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
1734 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
1735 | "dev": true,
1736 | "requires": {
1737 | "sax": ">=0.6.0",
1738 | "xmlbuilder": "~11.0.0"
1739 | }
1740 | },
1741 | "xmlbuilder": {
1742 | "version": "11.0.1",
1743 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
1744 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
1745 | "dev": true
1746 | },
1747 | "xtend": {
1748 | "version": "4.0.2",
1749 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1750 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1751 | "dev": true
1752 | },
1753 | "y18n": {
1754 | "version": "4.0.0",
1755 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
1756 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
1757 | "dev": true
1758 | },
1759 | "yallist": {
1760 | "version": "2.1.2",
1761 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1762 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1763 | "dev": true
1764 | },
1765 | "yargs": {
1766 | "version": "13.3.2",
1767 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
1768 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
1769 | "dev": true,
1770 | "requires": {
1771 | "cliui": "^5.0.0",
1772 | "find-up": "^3.0.0",
1773 | "get-caller-file": "^2.0.1",
1774 | "require-directory": "^2.1.1",
1775 | "require-main-filename": "^2.0.0",
1776 | "set-blocking": "^2.0.0",
1777 | "string-width": "^3.0.0",
1778 | "which-module": "^2.0.0",
1779 | "y18n": "^4.0.0",
1780 | "yargs-parser": "^13.1.2"
1781 | },
1782 | "dependencies": {
1783 | "ansi-regex": {
1784 | "version": "4.1.0",
1785 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1786 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1787 | "dev": true
1788 | },
1789 | "is-fullwidth-code-point": {
1790 | "version": "2.0.0",
1791 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1792 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1793 | "dev": true
1794 | },
1795 | "string-width": {
1796 | "version": "3.1.0",
1797 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1798 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1799 | "dev": true,
1800 | "requires": {
1801 | "emoji-regex": "^7.0.1",
1802 | "is-fullwidth-code-point": "^2.0.0",
1803 | "strip-ansi": "^5.1.0"
1804 | }
1805 | },
1806 | "strip-ansi": {
1807 | "version": "5.2.0",
1808 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1809 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1810 | "dev": true,
1811 | "requires": {
1812 | "ansi-regex": "^4.1.0"
1813 | }
1814 | }
1815 | }
1816 | },
1817 | "yargs-parser": {
1818 | "version": "13.1.2",
1819 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
1820 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
1821 | "dev": true,
1822 | "requires": {
1823 | "camelcase": "^5.0.0",
1824 | "decamelize": "^1.2.0"
1825 | }
1826 | },
1827 | "yargs-unparser": {
1828 | "version": "1.6.0",
1829 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
1830 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
1831 | "dev": true,
1832 | "requires": {
1833 | "flat": "^4.1.0",
1834 | "lodash": "^4.17.15",
1835 | "yargs": "^13.3.0"
1836 | }
1837 | }
1838 | }
1839 | }
1840 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "opencv-wasm",
3 | "version": "4.3.0-10",
4 | "description": "Precompiled OpenCV 4.3.0 to JavaScript + WebAssembly for node.js environment",
5 | "main": "index.js",
6 | "directories": {
7 | "example": "examples"
8 | },
9 | "scripts": {
10 | "test": "npx mocha ./test/test.js"
11 | },
12 | "files": [
13 | "/index.js",
14 | "/index.d.ts",
15 | "/mod.ts",
16 | "/opencv.js",
17 | "/opencv.d.ts",
18 | "/opencv.wasm",
19 | "/opencv-deno.js",
20 | "/opencv-bin.js",
21 | "/types"
22 | ],
23 | "repository": {
24 | "type": "git",
25 | "url": "git+https://echamudi@github.com/echamudi/opencv-wasm.git"
26 | },
27 | "author": "Ezzat Chamudi",
28 | "license": "BSD-3-Clause",
29 | "bugs": {
30 | "url": "https://github.com/echamudi/opencv-wasm/issues"
31 | },
32 | "homepage": "https://github.com/echamudi/opencv-wasm#readme",
33 | "devDependencies": {
34 | "@types/mocha": "^8.2.0",
35 | "@types/node": "^14.0.1",
36 | "chai": "^4.2.0",
37 | "jimp": "^0.10.2",
38 | "js-beautify": "^1.13.4",
39 | "mocha": "^7.1.2",
40 | "pixelmatch": "^5.2.0"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/test/deno/test.ts:
--------------------------------------------------------------------------------
1 | import { cv, cvTranslateError } from '../../mod.ts';
2 | import { assertStrictEquals, assertEquals } from "https://deno.land/std@0.83.0/testing/asserts.ts";
3 |
4 | Deno.test("Basic test", () => {
5 | let mat = cv.matFromArray(2, 3, cv.CV_8UC1, [1, 2, 3, 4, 5, 6]);
6 |
7 | assertStrictEquals(mat.cols, 3);
8 | assertStrictEquals(mat.rows, 2);
9 | assertEquals(mat.data8S, new Int8Array([1,2,3,4,5,6]));
10 | });
11 |
--------------------------------------------------------------------------------
/test/error-example.js:
--------------------------------------------------------------------------------
1 | const Jimp = require('jimp');
2 | const { cv, cvTranslateError } = require('../'); // replace with require('opencv-wasm') in prod
3 |
4 | const errorExample = async () => {
5 | try {
6 | const imageSource = await Jimp.read(__dirname + '/../examples/input/image-sample-2.png');
7 | const imageTemplate = await Jimp.read(__dirname + '/../examples/input/image-sample-2-template.png');
8 |
9 | let src = cv.matFromImageData(imageSource.bitmap);
10 | let templ = cv.matFromImageData(imageTemplate.bitmap);
11 | let processedImage = new cv.Mat();
12 | let mask = new cv.Mat();
13 |
14 | cv.matchTemplate(src, templ, processedImage, cv.TM_CCOEFF_NORMED, mask);
15 | cv.threshold(processedImage, processedImage, 0.999, 1, cv.THRESH_BINARY);
16 | processedImage.convertTo(processedImage, cv.CV_16S); // This line causes findContours produce error
17 |
18 | let contours = new cv.MatVector();
19 | let hierarchy = new cv.Mat();
20 |
21 | cv.findContours(processedImage, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);
22 | } catch (err) {
23 | return cvTranslateError(cv, err);
24 | }
25 |
26 | return '';
27 | };
28 |
29 | module.exports = { errorExample };
30 |
--------------------------------------------------------------------------------
/test/test.js:
--------------------------------------------------------------------------------
1 | const { cv, cvTranslateError } = require('../');
2 | const fs = require('fs');
3 | const { assert } = require('chai');
4 | const { execSync } = require("child_process");
5 | const { PNG } = require('pngjs');
6 | const pixelmatch = require('pixelmatch');
7 | const { errorExample } = require('./error-example');
8 |
9 | describe('opencv-wasm', function () {
10 | this.timeout(40000);
11 |
12 | it('can be loaded', function () {
13 | assert.isObject(cv);
14 | assert.isFunction(cv.Scalar);
15 | assert.isFunction(cv.Point);
16 | assert.isFunction(cv.Mat);
17 | assert.isFunction(cv.MatVector);
18 | assert.isFunction(cvTranslateError);
19 | });
20 |
21 | it('runs dilation example', function () {
22 | execSync('node ./examples/dilation.js');
23 | const expectedOutput = PNG.sync.read(fs.readFileSync('./examples/expected-output/dilation.png'));
24 | const testOutput = PNG.sync.read(fs.readFileSync('./examples/test-output/dilation.png'));
25 |
26 | const pixelmatchResult = pixelmatch(expectedOutput.data, testOutput.data, null, expectedOutput.width, expectedOutput.height, {threshold: 0.01});
27 | assert.deepStrictEqual(pixelmatchResult, 0);
28 | });
29 |
30 | it('runs template matching example', function () {
31 | execSync('node ./examples/templateMatching.js');
32 | const expectedOutput = PNG.sync.read(fs.readFileSync('./examples/expected-output/template-matching.png'));
33 | const testOutput = PNG.sync.read(fs.readFileSync('./examples/test-output/template-matching.png'));
34 |
35 | const pixelmatchResult = pixelmatch(expectedOutput.data, testOutput.data, null, expectedOutput.width, expectedOutput.height, {threshold: 0.01});
36 | assert.deepStrictEqual(pixelmatchResult, 0);
37 | });
38 | });
39 |
40 | describe('cvTranslateError', function() {
41 | it('translates error correctly', async function () {
42 | const errString = await errorExample();
43 | assert.deepStrictEqual(errString,
44 | "Exception: OpenCV(4.3.0) /code/modules/imgproc/src/contours.cpp:197: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'\n");
45 | });
46 | });
47 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
4 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
5 | "allowJs": true, /* Allow javascript files to be compiled. */
6 | "checkJs": true, /* Report errors in .js files. */
7 | "noEmit": true, /* Do not emit outputs. */
8 | "noImplicitAny": false,
9 | "strict": false, /* Enable all strict type-checking options. */
10 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
11 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/utils/build.sh:
--------------------------------------------------------------------------------
1 | git clone --branch 4.3.0 --depth 1 https://github.com/opencv/opencv.git
2 |
3 | # Build
4 | (
5 | cd opencv &&
6 | git checkout 4.3.0 &&
7 |
8 | # Add non async flag before compiling in the python build_js.py script
9 | docker run --rm --workdir /code -v "$PWD":/code "trzeci/emscripten:sdk-tag-1.39.4-64bit" python ./platforms/js/build_js.py build_wasm --build_wasm --build_test --build_flags "-s WASM=1 -s WASM_ASYNC_COMPILATION=0 -s SINGLE_FILE=0 "
10 | )
11 |
12 | # Copy compilation result
13 | cp -a ./opencv/build_wasm/ ./build_wasm
14 |
15 | # Transpile opencv.js files
16 | node opencvJsMod.js
17 |
18 | # Beautify JS
19 | (
20 | cd ./build_wasm/bin &&
21 | npx js-beautify opencv.js -r &&
22 | npx js-beautify opencv-deno.js -r
23 | )
24 |
25 | # Copy bins to root
26 | (
27 | cp ./build_wasm/bin/opencv.wasm ../opencv.wasm &&
28 | cp ./build_wasm/bin/opencv-bin.js ../opencv-bin.js &&
29 | cp ./build_wasm/bin/opencv.js ../opencv.js &&
30 | cp ./build_wasm/bin/opencv-deno.js ../opencv-deno.js &&
31 | cp -r ./build_wasm/ ../build_wasm_test
32 | )
33 |
--------------------------------------------------------------------------------
/utils/generateCvProps.js:
--------------------------------------------------------------------------------
1 | const { cv } = require('../.');
2 | const fs = require('fs');
3 |
4 | const removeProps = [
5 | // Invalid item
6 | 'arguments',
7 | ];
8 |
9 | let keys = Object.keys(cv);
10 |
11 | let result = '';
12 | result += `// Generated types by generateCvProps.js, don't edit this file\n`;
13 | result += `\n`;
14 | result += `\n`;
15 |
16 | keys.forEach(key => {
17 | if (removeProps.indexOf(key) !== -1) return;
18 |
19 | // @ts-ignore
20 | let type = typeof cv[key];
21 |
22 | if (type === 'string' || type === 'number' || type === 'boolean') {
23 | result += `export var ${key}: ${type};\n`;
24 | } else if (type === 'function') {
25 | result += `\n`;
26 | result += `/** function */\n`;
27 | result += `export var ${key}: any;\n`;
28 | } else if (type === 'object') {
29 | result += `\n`;
30 | result += `/** object */\n`;
31 | result += `export var ${key}: any;\n`;
32 | } else if (type === 'undefined') {
33 | result += `\n`;
34 | result += `/** undefined */\n`;
35 | result += `export var ${key}: any;\n`;
36 | } else {
37 | throw new Error(key + ' ' + type);
38 | }
39 |
40 | });
41 |
42 | fs.mkdirSync('../types', { recursive: true});
43 | fs.writeFileSync('../types/opencv.ts', result, { encoding: 'utf8' });
44 |
--------------------------------------------------------------------------------
/utils/opencvJsMod.js:
--------------------------------------------------------------------------------
1 | // @ts-check
2 |
3 | const fs = require('fs');
4 | const path = require('path');
5 |
6 | const openCvJs = fs.readFileSync(path.join(__dirname, './build_wasm/bin/opencv.js'), 'utf-8');
7 |
8 |
9 | // Generate opencv.wasm
10 | const matchResult = openCvJs.match(/var wasmBinaryFile="(.*?)";/gs);
11 |
12 | if (matchResult == null) {
13 | throw new Error('WASM Base64 is not found');
14 | }
15 |
16 | const wasmBase64 = matchResult[0].replace('var wasmBinaryFile="data:application/octet-stream;base64,', '').replace('";', '');
17 |
18 | fs.writeFileSync(path.join(__dirname, './build_wasm/bin/opencv.wasm'), wasmBase64, {encoding: 'base64'});
19 | console.log('Generated OpenCV.wasm');
20 |
21 |
22 | // Generate opencv-bin.js
23 | const opencvBin = `
24 | export const bin = 'data:application/octet-stream;base64,${wasmBase64}';
25 | `;
26 | fs.writeFileSync(path.join(__dirname, './build_wasm/bin/opencv-bin.js'), opencvBin, {encoding: 'utf8'});
27 | console.log('Generated opencv-bin.js');
28 |
29 |
30 | // Replace the data with opencvWasmBinaryFile variable
31 | const openCvJsNew = openCvJs.replace(/var wasmBinaryFile="(.*?)";/, 'var wasmBinaryFile=opencvWasmBinaryFile;');
32 |
33 |
34 | // Add modifications for node.js code
35 | let openCvJsNode = openCvJsNew;
36 |
37 | openCvJsNode =
38 | `
39 | let Module = {};
40 | let opencvWasmBinaryFile = './opencv.wasm';
41 |
42 | ${openCvJsNode}`;
43 | fs.writeFileSync(path.join(__dirname, './build_wasm/bin/opencv.js'), openCvJsNode, {encoding: 'utf8'});
44 | console.log('Updated opencv.js');
45 |
46 |
47 | // Add modifications for deno code
48 | let openCvJsDeno = openCvJsNew;
49 | openCvJsDeno = openCvJsDeno.replace(/\}\(this, function \(\) \{/, '}($this, function () {');
50 |
51 | openCvJsDeno = `
52 | import { bin } from './opencv-bin.js';
53 |
54 | let Module = {};
55 | let TextDecoder = undefined;
56 | let document = {};
57 |
58 | let opencvWasmBinaryFile = bin;
59 | let $this = {};
60 |
61 | ${openCvJsDeno}
62 |
63 | const cv = $this.cv;
64 | export { cv };
65 | `;
66 |
67 | fs.writeFileSync(path.join(__dirname, './build_wasm/bin/opencv-deno.js'), openCvJsDeno, {encoding: 'utf8'});
68 | console.log('Added opencv-deno.js');
69 |
--------------------------------------------------------------------------------