├── .eslintrc.json
├── .gitattributes
├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── images
├── demo.gif
└── icon.png
├── package-lock.json
├── package.json
├── src
├── adb.ts
├── bridge.ts
├── debugConfigurationProvider.ts
├── extension.ts
├── http.ts
├── tasks.ts
└── ui.ts
└── tsconfig.json
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "es6": true,
4 | "node": true
5 | },
6 | "extends": [
7 | "plugin:@typescript-eslint/recommended-requiring-type-checking"
8 | ],
9 | "parser": "@typescript-eslint/parser",
10 | "parserOptions": {
11 | "project": "tsconfig.json",
12 | "sourceType": "module"
13 | },
14 | "plugins": [
15 | "@typescript-eslint"
16 | ],
17 | "ignorePatterns": ["out/**"],
18 | "rules": {
19 | "@typescript-eslint/no-floating-promises": "off"
20 | }
21 | }
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set default behavior to automatically normalize line endings.
2 | * text=auto
3 |
4 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 | on: [push, pull_request]
3 |
4 | jobs:
5 | build:
6 | runs-on: ubuntu-latest
7 | steps:
8 | - uses: actions/checkout@v2
9 | - name: Use Node.js 16.x
10 | uses: actions/setup-node@v1
11 | with:
12 | node-version: 16.x
13 | - run: npm ci
14 | - run: npm run lint
15 | - run: npm run compile
16 | env:
17 | CI: true
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
3 | .vscode-test/
4 | *.vsix
5 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "ms-vscode.vscode-typescript-tslint-plugin"
6 | ]
7 | }
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that compiles the extension and then opens it inside a new window
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | {
6 | "version": "0.2.0",
7 | "configurations": [
8 | {
9 | "name": "Extension",
10 | "type": "extensionHost",
11 | "request": "launch",
12 | "runtimeExecutable": "${execPath}",
13 | "args": [
14 | "--extensionDevelopmentPath=${workspaceFolder}"
15 | ],
16 | "outFiles": [
17 | "${workspaceFolder}/out/**/*.js"
18 | ],
19 | "preLaunchTask": "npm: watch"
20 | },
21 | {
22 | "name": "Extension Tests",
23 | "type": "extensionHost",
24 | "request": "launch",
25 | "runtimeExecutable": "${execPath}",
26 | "args": [
27 | "--extensionDevelopmentPath=${workspaceFolder}",
28 | "--extensionTestsPath=${workspaceFolder}/out/test"
29 | ],
30 | "outFiles": [
31 | "${workspaceFolder}/out/test/**/*.js"
32 | ],
33 | "preLaunchTask": "npm: watch"
34 | }
35 | ]
36 | }
37 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "files.exclude": {
4 | "out": false // set this to true to hide the "out" folder with the compiled JS files
5 | },
6 | "search.exclude": {
7 | "out": true // set this to false to include "out" folder in search results
8 | },
9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts
10 | "typescript.tsc.autoDetect": "off"
11 | }
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | // See https://go.microsoft.com/fwlink/?LinkId=733558
2 | // for the documentation about the tasks.json format
3 | {
4 | "version": "2.0.0",
5 | "tasks": [
6 | {
7 | "type": "npm",
8 | "script": "watch",
9 | "problemMatcher": "$tsc-watch",
10 | "isBackground": true,
11 | "presentation": {
12 | "reveal": "never"
13 | },
14 | "group": {
15 | "kind": "build",
16 | "isDefault": true
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
1 | .github/**
2 | .vscode/**
3 | .vscode-test/**
4 | out/test/**
5 | out/**/*.map
6 | src/**
7 | .eslintrc.json
8 | .gitattributes
9 | .gitignore
10 | tsconfig.json
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## 1.2.3 - 2024-03-28
2 | * Fix devices not being recognized on systems on which ADB uses libusb ([#13](https://github.com/mpotthoff/vscode-android-webview-debug/issues/13))
3 |
4 | ## 1.2.2 - 2022-02-25
5 | * Force the extension to execute on the `workspace` side instead of the `ui` side to support remote development scenarios
6 | * Add `adbArgs` configuration parameter to allow extra arguments to be set for ADB
7 | * Remove unneccessary VS LiveShare check which is not needed anymore
8 |
9 | ## 1.2.1 - 2022-02-12
10 | * Add `connectTimeout` to allow the user to set a time the extension will wait for the webview to become ready ([#7](https://github.com/mpotthoff/vscode-android-webview-debug/issues/7))
11 |
12 | ## 1.2.0 - 2021-08-13
13 | * Support primitive `adbPath` expansion ([#3](https://github.com/mpotthoff/vscode-android-webview-debug/pull/3)) by [@buschtoens](https://github.com/buschtoens)
14 | * Switch to the new [vscode-js-debug](https://github.com/microsoft/vscode-js-debug) extension per default
15 |
16 | ## 1.1.2 - 2021-06-18
17 | * Allow the user to select which page to debug in case multiple are available ([#2](https://github.com/mpotthoff/vscode-android-webview-debug/issues/2))
18 |
19 | ## 1.1.1 - 2019-09-04
20 | * Change the `extensionKind` to `ui` because vscode-chrome-debug can not be installed on a remote system
21 | * Add a check for VS LiveShare to prevent the debugging configuration from being resolved in a guest instance
22 |
23 | ## 1.1.0 - 2019-03-06
24 | * Implement custom execution of `preLaunchTask` because otherwise the task gets executed _after_ the debugging connection is established
25 |
26 | ## 1.0.3 - 2018-10-08
27 | * Disable the automatic opening of the `launch.json` configuration file if no device and/or WebView is found or the user aborted the picker dialog
28 |
29 | ## 1.0.2 - 2018-09-03
30 | * Remove the portfinder dependency and let ADB find an unused port instead
31 | * Improve the WebView detection in the ADB client bridge
32 |
33 | ## 1.0.1 - 2018-09-01
34 | * Rename the `adbExecutable` configuration parameter
35 |
36 | ## 1.0.0 - 2018-08-31
37 | * Initial release
38 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU LESSER GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 |
9 | This version of the GNU Lesser General Public License incorporates
10 | the terms and conditions of version 3 of the GNU General Public
11 | License, supplemented by the additional permissions listed below.
12 |
13 | 0. Additional Definitions.
14 |
15 | As used herein, "this License" refers to version 3 of the GNU Lesser
16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU
17 | General Public License.
18 |
19 | "The Library" refers to a covered work governed by this License,
20 | other than an Application or a Combined Work as defined below.
21 |
22 | An "Application" is any work that makes use of an interface provided
23 | by the Library, but which is not otherwise based on the Library.
24 | Defining a subclass of a class defined by the Library is deemed a mode
25 | of using an interface provided by the Library.
26 |
27 | A "Combined Work" is a work produced by combining or linking an
28 | Application with the Library. The particular version of the Library
29 | with which the Combined Work was made is also called the "Linked
30 | Version".
31 |
32 | The "Minimal Corresponding Source" for a Combined Work means the
33 | Corresponding Source for the Combined Work, excluding any source code
34 | for portions of the Combined Work that, considered in isolation, are
35 | based on the Application, and not on the Linked Version.
36 |
37 | The "Corresponding Application Code" for a Combined Work means the
38 | object code and/or source code for the Application, including any data
39 | and utility programs needed for reproducing the Combined Work from the
40 | Application, but excluding the System Libraries of the Combined Work.
41 |
42 | 1. Exception to Section 3 of the GNU GPL.
43 |
44 | You may convey a covered work under sections 3 and 4 of this License
45 | without being bound by section 3 of the GNU GPL.
46 |
47 | 2. Conveying Modified Versions.
48 |
49 | If you modify a copy of the Library, and, in your modifications, a
50 | facility refers to a function or data to be supplied by an Application
51 | that uses the facility (other than as an argument passed when the
52 | facility is invoked), then you may convey a copy of the modified
53 | version:
54 |
55 | a) under this License, provided that you make a good faith effort to
56 | ensure that, in the event an Application does not supply the
57 | function or data, the facility still operates, and performs
58 | whatever part of its purpose remains meaningful, or
59 |
60 | b) under the GNU GPL, with none of the additional permissions of
61 | this License applicable to that copy.
62 |
63 | 3. Object Code Incorporating Material from Library Header Files.
64 |
65 | The object code form of an Application may incorporate material from
66 | a header file that is part of the Library. You may convey such object
67 | code under terms of your choice, provided that, if the incorporated
68 | material is not limited to numerical parameters, data structure
69 | layouts and accessors, or small macros, inline functions and templates
70 | (ten or fewer lines in length), you do both of the following:
71 |
72 | a) Give prominent notice with each copy of the object code that the
73 | Library is used in it and that the Library and its use are
74 | covered by this License.
75 |
76 | b) Accompany the object code with a copy of the GNU GPL and this license
77 | document.
78 |
79 | 4. Combined Works.
80 |
81 | You may convey a Combined Work under terms of your choice that,
82 | taken together, effectively do not restrict modification of the
83 | portions of the Library contained in the Combined Work and reverse
84 | engineering for debugging such modifications, if you also do each of
85 | the following:
86 |
87 | a) Give prominent notice with each copy of the Combined Work that
88 | the Library is used in it and that the Library and its use are
89 | covered by this License.
90 |
91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license
92 | document.
93 |
94 | c) For a Combined Work that displays copyright notices during
95 | execution, include the copyright notice for the Library among
96 | these notices, as well as a reference directing the user to the
97 | copies of the GNU GPL and this license document.
98 |
99 | d) Do one of the following:
100 |
101 | 0) Convey the Minimal Corresponding Source under the terms of this
102 | License, and the Corresponding Application Code in a form
103 | suitable for, and under terms that permit, the user to
104 | recombine or relink the Application with a modified version of
105 | the Linked Version to produce a modified Combined Work, in the
106 | manner specified by section 6 of the GNU GPL for conveying
107 | Corresponding Source.
108 |
109 | 1) Use a suitable shared library mechanism for linking with the
110 | Library. A suitable mechanism is one that (a) uses at run time
111 | a copy of the Library already present on the user's computer
112 | system, and (b) will operate properly with a modified version
113 | of the Library that is interface-compatible with the Linked
114 | Version.
115 |
116 | e) Provide Installation Information, but only if you would otherwise
117 | be required to provide such information under section 6 of the
118 | GNU GPL, and only to the extent that such information is
119 | necessary to install and execute a modified version of the
120 | Combined Work produced by recombining or relinking the
121 | Application with a modified version of the Linked Version. (If
122 | you use option 4d0, the Installation Information must accompany
123 | the Minimal Corresponding Source and Corresponding Application
124 | Code. If you use option 4d1, you must provide the Installation
125 | Information in the manner specified by section 6 of the GNU GPL
126 | for conveying Corresponding Source.)
127 |
128 | 5. Combined Libraries.
129 |
130 | You may place library facilities that are a work based on the
131 | Library side by side in a single library together with other library
132 | facilities that are not Applications and are not covered by this
133 | License, and convey such a combined library under terms of your
134 | choice, if you do both of the following:
135 |
136 | a) Accompany the combined library with a copy of the same work based
137 | on the Library, uncombined with any other library facilities,
138 | conveyed under the terms of this License.
139 |
140 | b) Give prominent notice with the combined library that part of it
141 | is a work based on the Library, and explaining where to find the
142 | accompanying uncombined form of the same work.
143 |
144 | 6. Revised Versions of the GNU Lesser General Public License.
145 |
146 | The Free Software Foundation may publish revised and/or new versions
147 | of the GNU Lesser General Public License from time to time. Such new
148 | versions will be similar in spirit to the present version, but may
149 | differ in detail to address new problems or concerns.
150 |
151 | Each version is given a distinguishing version number. If the
152 | Library as you received it specifies that a certain numbered version
153 | of the GNU Lesser General Public License "or any later version"
154 | applies to it, you have the option of following the terms and
155 | conditions either of that published version or of any later version
156 | published by the Free Software Foundation. If the Library as you
157 | received it does not specify a version number of the GNU Lesser
158 | General Public License, you may choose any version of the GNU Lesser
159 | General Public License ever published by the Free Software Foundation.
160 |
161 | If the Library as you received it specifies that a proxy can decide
162 | whether future versions of the GNU Lesser General Public License shall
163 | apply, that proxy's public statement of acceptance of any version is
164 | permanent authorization for you to choose that version for the
165 | Library.
166 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | VS Code - Android WebView Debugging
6 |
7 |
8 |
9 |
10 | Debug your JavaScript code running in WebViews on any Android device from VS Code.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | A VS Code extension to debug your JavaScript code in the Google Chrome browser or other WebView targets on Android devices, that support the [Chrome DevTools Protocol](https://chromedevtools.github.io/debugger-protocol-viewer/).
20 |
21 | 
22 |
23 | ## Requirements
24 |
25 | ### vscode-js-debug
26 |
27 | This extension uses the [vscode-js-debug](https://github.com/microsoft/vscode-js-debug) extension under the hood.
28 |
29 | ## Using the debugger
30 |
31 | When your launch config is set up, you can debug your project. Pick a launch config from the dropdown on the Debug pane in Code. Press the play button or F5 to start.
32 |
33 | ### Configuration
34 |
35 | Right now the extension only supports attaching to an already running Google Chrome or WebView instance. This can be configured in the `.vscode/launch.json` file in the root directory of your project.
36 |
37 | In case you want to use the old [Debugger for Chrome](https://github.com/Microsoft/vscode-chrome-debug) extension you can set `debug.javascript.usePreview` to `false`.
38 |
39 | > All configuration options of the `pwa-chrome: attach` configuration of the [vscode-js-debug](https://github.com/microsoft/vscode-js-debug/blob/main/OPTIONS.md#pwa-chrome-attach) extension are supported.
40 |
41 | You can optionally specify a port to use for the debugging connection or let the extension automatically choose an unsued one.
42 |
43 | It is possible to specify the device and/or the application to attach to. If multiple possible instances are found the extension will ask you to choose one.
44 |
45 | An example `launch.json` file:
46 | ```json
47 | {
48 | "version": "0.2.0",
49 | "configurations": [
50 | {
51 | "type": "android-webview",
52 | "request": "attach",
53 | "name": "Attach to Android WebView",
54 | "application": "com.android.chrome",
55 | "webRoot": "${workspaceFolder}",
56 | "urlFilter": "http://example.com/*"
57 | }
58 | ]
59 | }
60 | ```
61 |
62 | ### All contributed configuration fields
63 |
64 | * `device`: The serial of the device to use. It can be found using `adb devices`.
65 | * `application`: The package name of the application to connect to. For example `com.android.chrome`.
66 | * `connectTimeout`: The time the extension will wait for the webview to be ready in milliseconds.
67 |
68 | ## Extension Settings
69 |
70 | This extension contributes the following settings:
71 |
72 | * `android-webview-debug.adbPath`: Specifies the path to the ADB executable.
73 | * `android-webview-debug.adbArgs`: Specifies extra arguments for the ADB executable. For example `["-H", "1.2.3.4"]`
74 |
75 | ## Troubleshooting
76 |
77 | ### Failed to locate ADB executable.
78 |
79 | The ADB executable was not found. Usually it should be on the PATH environment variable. You can also specify it manually using the `android-webview-debug.adbPath` configuration parameter.
80 |
81 | ### No WebViews found
82 |
83 | Ensure that the device is connected and that the Android application is a debug build or WebView debugging is enabled. You can always find the available WebViews by visiting `chrome://inspect/#devices` in Google Chrome.
84 |
85 | ### No devices found
86 |
87 | Ensure that USB Debugging is enabled on your Android device and that ADB can find it. You can find a list of connected devices using the command `adb devices`.
--------------------------------------------------------------------------------
/images/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mpotthoff/vscode-android-webview-debug/55539313ef7bddcfb0dbff96c299da6424675eb3/images/demo.gif
--------------------------------------------------------------------------------
/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mpotthoff/vscode-android-webview-debug/55539313ef7bddcfb0dbff96c299da6424675eb3/images/icon.png
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vscode-android-webview-debug",
3 | "version": "1.2.3",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "vscode-android-webview-debug",
9 | "version": "1.2.3",
10 | "license": "LGPL-3.0",
11 | "devDependencies": {
12 | "@types/node": "12.20.15",
13 | "@types/vscode": "1.53.0",
14 | "@typescript-eslint/eslint-plugin": "4.29.0",
15 | "@typescript-eslint/parser": "4.29.0",
16 | "eslint": "7.32.0",
17 | "typescript": "4.3.5"
18 | },
19 | "engines": {
20 | "vscode": "^1.53.0"
21 | }
22 | },
23 | "node_modules/@babel/code-frame": {
24 | "version": "7.12.11",
25 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
26 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
27 | "dev": true,
28 | "dependencies": {
29 | "@babel/highlight": "^7.10.4"
30 | }
31 | },
32 | "node_modules/@babel/helper-validator-identifier": {
33 | "version": "7.14.9",
34 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
35 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
36 | "dev": true,
37 | "engines": {
38 | "node": ">=6.9.0"
39 | }
40 | },
41 | "node_modules/@babel/highlight": {
42 | "version": "7.14.5",
43 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
44 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
45 | "dev": true,
46 | "dependencies": {
47 | "@babel/helper-validator-identifier": "^7.14.5",
48 | "chalk": "^2.0.0",
49 | "js-tokens": "^4.0.0"
50 | },
51 | "engines": {
52 | "node": ">=6.9.0"
53 | }
54 | },
55 | "node_modules/@eslint/eslintrc": {
56 | "version": "0.4.3",
57 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
58 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
59 | "dev": true,
60 | "dependencies": {
61 | "ajv": "^6.12.4",
62 | "debug": "^4.1.1",
63 | "espree": "^7.3.0",
64 | "globals": "^13.9.0",
65 | "ignore": "^4.0.6",
66 | "import-fresh": "^3.2.1",
67 | "js-yaml": "^3.13.1",
68 | "minimatch": "^3.0.4",
69 | "strip-json-comments": "^3.1.1"
70 | },
71 | "engines": {
72 | "node": "^10.12.0 || >=12.0.0"
73 | }
74 | },
75 | "node_modules/@humanwhocodes/config-array": {
76 | "version": "0.5.0",
77 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
78 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
79 | "dev": true,
80 | "dependencies": {
81 | "@humanwhocodes/object-schema": "^1.2.0",
82 | "debug": "^4.1.1",
83 | "minimatch": "^3.0.4"
84 | },
85 | "engines": {
86 | "node": ">=10.10.0"
87 | }
88 | },
89 | "node_modules/@humanwhocodes/object-schema": {
90 | "version": "1.2.0",
91 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
92 | "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
93 | "dev": true
94 | },
95 | "node_modules/@nodelib/fs.scandir": {
96 | "version": "2.1.5",
97 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
98 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
99 | "dev": true,
100 | "dependencies": {
101 | "@nodelib/fs.stat": "2.0.5",
102 | "run-parallel": "^1.1.9"
103 | },
104 | "engines": {
105 | "node": ">= 8"
106 | }
107 | },
108 | "node_modules/@nodelib/fs.stat": {
109 | "version": "2.0.5",
110 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
111 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
112 | "dev": true,
113 | "engines": {
114 | "node": ">= 8"
115 | }
116 | },
117 | "node_modules/@nodelib/fs.walk": {
118 | "version": "1.2.8",
119 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
120 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
121 | "dev": true,
122 | "dependencies": {
123 | "@nodelib/fs.scandir": "2.1.5",
124 | "fastq": "^1.6.0"
125 | },
126 | "engines": {
127 | "node": ">= 8"
128 | }
129 | },
130 | "node_modules/@types/json-schema": {
131 | "version": "7.0.9",
132 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
133 | "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
134 | "dev": true
135 | },
136 | "node_modules/@types/node": {
137 | "version": "12.20.15",
138 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz",
139 | "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==",
140 | "dev": true
141 | },
142 | "node_modules/@types/vscode": {
143 | "version": "1.53.0",
144 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz",
145 | "integrity": "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==",
146 | "dev": true
147 | },
148 | "node_modules/@typescript-eslint/eslint-plugin": {
149 | "version": "4.29.0",
150 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz",
151 | "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==",
152 | "dev": true,
153 | "dependencies": {
154 | "@typescript-eslint/experimental-utils": "4.29.0",
155 | "@typescript-eslint/scope-manager": "4.29.0",
156 | "debug": "^4.3.1",
157 | "functional-red-black-tree": "^1.0.1",
158 | "regexpp": "^3.1.0",
159 | "semver": "^7.3.5",
160 | "tsutils": "^3.21.0"
161 | },
162 | "engines": {
163 | "node": "^10.12.0 || >=12.0.0"
164 | },
165 | "funding": {
166 | "type": "opencollective",
167 | "url": "https://opencollective.com/typescript-eslint"
168 | },
169 | "peerDependencies": {
170 | "@typescript-eslint/parser": "^4.0.0",
171 | "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
172 | },
173 | "peerDependenciesMeta": {
174 | "typescript": {
175 | "optional": true
176 | }
177 | }
178 | },
179 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
180 | "version": "7.3.5",
181 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
182 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
183 | "dev": true,
184 | "dependencies": {
185 | "lru-cache": "^6.0.0"
186 | },
187 | "bin": {
188 | "semver": "bin/semver.js"
189 | },
190 | "engines": {
191 | "node": ">=10"
192 | }
193 | },
194 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": {
195 | "version": "3.21.0",
196 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
197 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
198 | "dev": true,
199 | "dependencies": {
200 | "tslib": "^1.8.1"
201 | },
202 | "engines": {
203 | "node": ">= 6"
204 | },
205 | "peerDependencies": {
206 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
207 | }
208 | },
209 | "node_modules/@typescript-eslint/experimental-utils": {
210 | "version": "4.29.0",
211 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz",
212 | "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==",
213 | "dev": true,
214 | "dependencies": {
215 | "@types/json-schema": "^7.0.7",
216 | "@typescript-eslint/scope-manager": "4.29.0",
217 | "@typescript-eslint/types": "4.29.0",
218 | "@typescript-eslint/typescript-estree": "4.29.0",
219 | "eslint-scope": "^5.1.1",
220 | "eslint-utils": "^3.0.0"
221 | },
222 | "engines": {
223 | "node": "^10.12.0 || >=12.0.0"
224 | },
225 | "funding": {
226 | "type": "opencollective",
227 | "url": "https://opencollective.com/typescript-eslint"
228 | },
229 | "peerDependencies": {
230 | "eslint": "*"
231 | }
232 | },
233 | "node_modules/@typescript-eslint/parser": {
234 | "version": "4.29.0",
235 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz",
236 | "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==",
237 | "dev": true,
238 | "dependencies": {
239 | "@typescript-eslint/scope-manager": "4.29.0",
240 | "@typescript-eslint/types": "4.29.0",
241 | "@typescript-eslint/typescript-estree": "4.29.0",
242 | "debug": "^4.3.1"
243 | },
244 | "engines": {
245 | "node": "^10.12.0 || >=12.0.0"
246 | },
247 | "funding": {
248 | "type": "opencollective",
249 | "url": "https://opencollective.com/typescript-eslint"
250 | },
251 | "peerDependencies": {
252 | "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
253 | },
254 | "peerDependenciesMeta": {
255 | "typescript": {
256 | "optional": true
257 | }
258 | }
259 | },
260 | "node_modules/@typescript-eslint/scope-manager": {
261 | "version": "4.29.0",
262 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz",
263 | "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==",
264 | "dev": true,
265 | "dependencies": {
266 | "@typescript-eslint/types": "4.29.0",
267 | "@typescript-eslint/visitor-keys": "4.29.0"
268 | },
269 | "engines": {
270 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
271 | },
272 | "funding": {
273 | "type": "opencollective",
274 | "url": "https://opencollective.com/typescript-eslint"
275 | }
276 | },
277 | "node_modules/@typescript-eslint/types": {
278 | "version": "4.29.0",
279 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz",
280 | "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==",
281 | "dev": true,
282 | "engines": {
283 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
284 | },
285 | "funding": {
286 | "type": "opencollective",
287 | "url": "https://opencollective.com/typescript-eslint"
288 | }
289 | },
290 | "node_modules/@typescript-eslint/typescript-estree": {
291 | "version": "4.29.0",
292 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz",
293 | "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==",
294 | "dev": true,
295 | "dependencies": {
296 | "@typescript-eslint/types": "4.29.0",
297 | "@typescript-eslint/visitor-keys": "4.29.0",
298 | "debug": "^4.3.1",
299 | "globby": "^11.0.3",
300 | "is-glob": "^4.0.1",
301 | "semver": "^7.3.5",
302 | "tsutils": "^3.21.0"
303 | },
304 | "engines": {
305 | "node": "^10.12.0 || >=12.0.0"
306 | },
307 | "funding": {
308 | "type": "opencollective",
309 | "url": "https://opencollective.com/typescript-eslint"
310 | },
311 | "peerDependenciesMeta": {
312 | "typescript": {
313 | "optional": true
314 | }
315 | }
316 | },
317 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
318 | "version": "7.3.5",
319 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
320 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
321 | "dev": true,
322 | "dependencies": {
323 | "lru-cache": "^6.0.0"
324 | },
325 | "bin": {
326 | "semver": "bin/semver.js"
327 | },
328 | "engines": {
329 | "node": ">=10"
330 | }
331 | },
332 | "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": {
333 | "version": "3.21.0",
334 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
335 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
336 | "dev": true,
337 | "dependencies": {
338 | "tslib": "^1.8.1"
339 | },
340 | "engines": {
341 | "node": ">= 6"
342 | },
343 | "peerDependencies": {
344 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
345 | }
346 | },
347 | "node_modules/@typescript-eslint/visitor-keys": {
348 | "version": "4.29.0",
349 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz",
350 | "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==",
351 | "dev": true,
352 | "dependencies": {
353 | "@typescript-eslint/types": "4.29.0",
354 | "eslint-visitor-keys": "^2.0.0"
355 | },
356 | "engines": {
357 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
358 | },
359 | "funding": {
360 | "type": "opencollective",
361 | "url": "https://opencollective.com/typescript-eslint"
362 | }
363 | },
364 | "node_modules/acorn": {
365 | "version": "7.4.1",
366 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
367 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
368 | "dev": true,
369 | "bin": {
370 | "acorn": "bin/acorn"
371 | },
372 | "engines": {
373 | "node": ">=0.4.0"
374 | }
375 | },
376 | "node_modules/acorn-jsx": {
377 | "version": "5.3.2",
378 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
379 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
380 | "dev": true,
381 | "peerDependencies": {
382 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
383 | }
384 | },
385 | "node_modules/ajv": {
386 | "version": "6.12.6",
387 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
388 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
389 | "dev": true,
390 | "dependencies": {
391 | "fast-deep-equal": "^3.1.1",
392 | "fast-json-stable-stringify": "^2.0.0",
393 | "json-schema-traverse": "^0.4.1",
394 | "uri-js": "^4.2.2"
395 | },
396 | "funding": {
397 | "type": "github",
398 | "url": "https://github.com/sponsors/epoberezkin"
399 | }
400 | },
401 | "node_modules/ansi-colors": {
402 | "version": "4.1.1",
403 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
404 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
405 | "dev": true,
406 | "engines": {
407 | "node": ">=6"
408 | }
409 | },
410 | "node_modules/ansi-regex": {
411 | "version": "5.0.0",
412 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
413 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
414 | "dev": true,
415 | "engines": {
416 | "node": ">=8"
417 | }
418 | },
419 | "node_modules/ansi-styles": {
420 | "version": "3.2.1",
421 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
422 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
423 | "dev": true,
424 | "dependencies": {
425 | "color-convert": "^1.9.0"
426 | },
427 | "engines": {
428 | "node": ">=4"
429 | }
430 | },
431 | "node_modules/argparse": {
432 | "version": "1.0.10",
433 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
434 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
435 | "dev": true,
436 | "dependencies": {
437 | "sprintf-js": "~1.0.2"
438 | }
439 | },
440 | "node_modules/array-union": {
441 | "version": "2.1.0",
442 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
443 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
444 | "dev": true,
445 | "engines": {
446 | "node": ">=8"
447 | }
448 | },
449 | "node_modules/astral-regex": {
450 | "version": "2.0.0",
451 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
452 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
453 | "dev": true,
454 | "engines": {
455 | "node": ">=8"
456 | }
457 | },
458 | "node_modules/balanced-match": {
459 | "version": "1.0.0",
460 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
461 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
462 | "dev": true
463 | },
464 | "node_modules/brace-expansion": {
465 | "version": "1.1.11",
466 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
467 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
468 | "dev": true,
469 | "dependencies": {
470 | "balanced-match": "^1.0.0",
471 | "concat-map": "0.0.1"
472 | }
473 | },
474 | "node_modules/braces": {
475 | "version": "3.0.2",
476 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
477 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
478 | "dev": true,
479 | "dependencies": {
480 | "fill-range": "^7.0.1"
481 | },
482 | "engines": {
483 | "node": ">=8"
484 | }
485 | },
486 | "node_modules/callsites": {
487 | "version": "3.1.0",
488 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
489 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
490 | "dev": true,
491 | "engines": {
492 | "node": ">=6"
493 | }
494 | },
495 | "node_modules/chalk": {
496 | "version": "2.4.2",
497 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
498 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
499 | "dev": true,
500 | "dependencies": {
501 | "ansi-styles": "^3.2.1",
502 | "escape-string-regexp": "^1.0.5",
503 | "supports-color": "^5.3.0"
504 | },
505 | "engines": {
506 | "node": ">=4"
507 | }
508 | },
509 | "node_modules/color-convert": {
510 | "version": "1.9.3",
511 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
512 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
513 | "dev": true,
514 | "dependencies": {
515 | "color-name": "1.1.3"
516 | }
517 | },
518 | "node_modules/color-name": {
519 | "version": "1.1.3",
520 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
521 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
522 | "dev": true
523 | },
524 | "node_modules/concat-map": {
525 | "version": "0.0.1",
526 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
527 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
528 | "dev": true
529 | },
530 | "node_modules/cross-spawn": {
531 | "version": "7.0.3",
532 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
533 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
534 | "dev": true,
535 | "dependencies": {
536 | "path-key": "^3.1.0",
537 | "shebang-command": "^2.0.0",
538 | "which": "^2.0.1"
539 | },
540 | "engines": {
541 | "node": ">= 8"
542 | }
543 | },
544 | "node_modules/debug": {
545 | "version": "4.3.2",
546 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
547 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
548 | "dev": true,
549 | "dependencies": {
550 | "ms": "2.1.2"
551 | },
552 | "engines": {
553 | "node": ">=6.0"
554 | },
555 | "peerDependenciesMeta": {
556 | "supports-color": {
557 | "optional": true
558 | }
559 | }
560 | },
561 | "node_modules/deep-is": {
562 | "version": "0.1.3",
563 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
564 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
565 | "dev": true
566 | },
567 | "node_modules/dir-glob": {
568 | "version": "3.0.1",
569 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
570 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
571 | "dev": true,
572 | "dependencies": {
573 | "path-type": "^4.0.0"
574 | },
575 | "engines": {
576 | "node": ">=8"
577 | }
578 | },
579 | "node_modules/doctrine": {
580 | "version": "3.0.0",
581 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
582 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
583 | "dev": true,
584 | "dependencies": {
585 | "esutils": "^2.0.2"
586 | },
587 | "engines": {
588 | "node": ">=6.0.0"
589 | }
590 | },
591 | "node_modules/emoji-regex": {
592 | "version": "8.0.0",
593 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
594 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
595 | "dev": true
596 | },
597 | "node_modules/enquirer": {
598 | "version": "2.3.6",
599 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
600 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
601 | "dev": true,
602 | "dependencies": {
603 | "ansi-colors": "^4.1.1"
604 | },
605 | "engines": {
606 | "node": ">=8.6"
607 | }
608 | },
609 | "node_modules/escape-string-regexp": {
610 | "version": "1.0.5",
611 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
612 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
613 | "dev": true,
614 | "engines": {
615 | "node": ">=0.8.0"
616 | }
617 | },
618 | "node_modules/eslint": {
619 | "version": "7.32.0",
620 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
621 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
622 | "dev": true,
623 | "dependencies": {
624 | "@babel/code-frame": "7.12.11",
625 | "@eslint/eslintrc": "^0.4.3",
626 | "@humanwhocodes/config-array": "^0.5.0",
627 | "ajv": "^6.10.0",
628 | "chalk": "^4.0.0",
629 | "cross-spawn": "^7.0.2",
630 | "debug": "^4.0.1",
631 | "doctrine": "^3.0.0",
632 | "enquirer": "^2.3.5",
633 | "escape-string-regexp": "^4.0.0",
634 | "eslint-scope": "^5.1.1",
635 | "eslint-utils": "^2.1.0",
636 | "eslint-visitor-keys": "^2.0.0",
637 | "espree": "^7.3.1",
638 | "esquery": "^1.4.0",
639 | "esutils": "^2.0.2",
640 | "fast-deep-equal": "^3.1.3",
641 | "file-entry-cache": "^6.0.1",
642 | "functional-red-black-tree": "^1.0.1",
643 | "glob-parent": "^5.1.2",
644 | "globals": "^13.6.0",
645 | "ignore": "^4.0.6",
646 | "import-fresh": "^3.0.0",
647 | "imurmurhash": "^0.1.4",
648 | "is-glob": "^4.0.0",
649 | "js-yaml": "^3.13.1",
650 | "json-stable-stringify-without-jsonify": "^1.0.1",
651 | "levn": "^0.4.1",
652 | "lodash.merge": "^4.6.2",
653 | "minimatch": "^3.0.4",
654 | "natural-compare": "^1.4.0",
655 | "optionator": "^0.9.1",
656 | "progress": "^2.0.0",
657 | "regexpp": "^3.1.0",
658 | "semver": "^7.2.1",
659 | "strip-ansi": "^6.0.0",
660 | "strip-json-comments": "^3.1.0",
661 | "table": "^6.0.9",
662 | "text-table": "^0.2.0",
663 | "v8-compile-cache": "^2.0.3"
664 | },
665 | "bin": {
666 | "eslint": "bin/eslint.js"
667 | },
668 | "engines": {
669 | "node": "^10.12.0 || >=12.0.0"
670 | },
671 | "funding": {
672 | "url": "https://opencollective.com/eslint"
673 | }
674 | },
675 | "node_modules/eslint-scope": {
676 | "version": "5.1.1",
677 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
678 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
679 | "dev": true,
680 | "dependencies": {
681 | "esrecurse": "^4.3.0",
682 | "estraverse": "^4.1.1"
683 | },
684 | "engines": {
685 | "node": ">=8.0.0"
686 | }
687 | },
688 | "node_modules/eslint-utils": {
689 | "version": "3.0.0",
690 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
691 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
692 | "dev": true,
693 | "dependencies": {
694 | "eslint-visitor-keys": "^2.0.0"
695 | },
696 | "engines": {
697 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
698 | },
699 | "funding": {
700 | "url": "https://github.com/sponsors/mysticatea"
701 | },
702 | "peerDependencies": {
703 | "eslint": ">=5"
704 | }
705 | },
706 | "node_modules/eslint-visitor-keys": {
707 | "version": "2.1.0",
708 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
709 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
710 | "dev": true,
711 | "engines": {
712 | "node": ">=10"
713 | }
714 | },
715 | "node_modules/eslint/node_modules/ansi-styles": {
716 | "version": "4.3.0",
717 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
718 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
719 | "dev": true,
720 | "dependencies": {
721 | "color-convert": "^2.0.1"
722 | },
723 | "engines": {
724 | "node": ">=8"
725 | },
726 | "funding": {
727 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
728 | }
729 | },
730 | "node_modules/eslint/node_modules/chalk": {
731 | "version": "4.1.2",
732 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
733 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
734 | "dev": true,
735 | "dependencies": {
736 | "ansi-styles": "^4.1.0",
737 | "supports-color": "^7.1.0"
738 | },
739 | "engines": {
740 | "node": ">=10"
741 | },
742 | "funding": {
743 | "url": "https://github.com/chalk/chalk?sponsor=1"
744 | }
745 | },
746 | "node_modules/eslint/node_modules/color-convert": {
747 | "version": "2.0.1",
748 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
749 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
750 | "dev": true,
751 | "dependencies": {
752 | "color-name": "~1.1.4"
753 | },
754 | "engines": {
755 | "node": ">=7.0.0"
756 | }
757 | },
758 | "node_modules/eslint/node_modules/color-name": {
759 | "version": "1.1.4",
760 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
761 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
762 | "dev": true
763 | },
764 | "node_modules/eslint/node_modules/escape-string-regexp": {
765 | "version": "4.0.0",
766 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
767 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
768 | "dev": true,
769 | "engines": {
770 | "node": ">=10"
771 | },
772 | "funding": {
773 | "url": "https://github.com/sponsors/sindresorhus"
774 | }
775 | },
776 | "node_modules/eslint/node_modules/eslint-utils": {
777 | "version": "2.1.0",
778 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
779 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
780 | "dev": true,
781 | "dependencies": {
782 | "eslint-visitor-keys": "^1.1.0"
783 | },
784 | "engines": {
785 | "node": ">=6"
786 | },
787 | "funding": {
788 | "url": "https://github.com/sponsors/mysticatea"
789 | }
790 | },
791 | "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
792 | "version": "1.3.0",
793 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
794 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
795 | "dev": true,
796 | "engines": {
797 | "node": ">=4"
798 | }
799 | },
800 | "node_modules/eslint/node_modules/has-flag": {
801 | "version": "4.0.0",
802 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
803 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
804 | "dev": true,
805 | "engines": {
806 | "node": ">=8"
807 | }
808 | },
809 | "node_modules/eslint/node_modules/semver": {
810 | "version": "7.3.5",
811 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
812 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
813 | "dev": true,
814 | "dependencies": {
815 | "lru-cache": "^6.0.0"
816 | },
817 | "bin": {
818 | "semver": "bin/semver.js"
819 | },
820 | "engines": {
821 | "node": ">=10"
822 | }
823 | },
824 | "node_modules/eslint/node_modules/supports-color": {
825 | "version": "7.2.0",
826 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
827 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
828 | "dev": true,
829 | "dependencies": {
830 | "has-flag": "^4.0.0"
831 | },
832 | "engines": {
833 | "node": ">=8"
834 | }
835 | },
836 | "node_modules/espree": {
837 | "version": "7.3.1",
838 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
839 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
840 | "dev": true,
841 | "dependencies": {
842 | "acorn": "^7.4.0",
843 | "acorn-jsx": "^5.3.1",
844 | "eslint-visitor-keys": "^1.3.0"
845 | },
846 | "engines": {
847 | "node": "^10.12.0 || >=12.0.0"
848 | }
849 | },
850 | "node_modules/espree/node_modules/eslint-visitor-keys": {
851 | "version": "1.3.0",
852 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
853 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
854 | "dev": true,
855 | "engines": {
856 | "node": ">=4"
857 | }
858 | },
859 | "node_modules/esprima": {
860 | "version": "4.0.1",
861 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
862 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
863 | "dev": true,
864 | "bin": {
865 | "esparse": "bin/esparse.js",
866 | "esvalidate": "bin/esvalidate.js"
867 | },
868 | "engines": {
869 | "node": ">=4"
870 | }
871 | },
872 | "node_modules/esquery": {
873 | "version": "1.4.0",
874 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
875 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
876 | "dev": true,
877 | "dependencies": {
878 | "estraverse": "^5.1.0"
879 | },
880 | "engines": {
881 | "node": ">=0.10"
882 | }
883 | },
884 | "node_modules/esquery/node_modules/estraverse": {
885 | "version": "5.2.0",
886 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
887 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
888 | "dev": true,
889 | "engines": {
890 | "node": ">=4.0"
891 | }
892 | },
893 | "node_modules/esrecurse": {
894 | "version": "4.3.0",
895 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
896 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
897 | "dev": true,
898 | "dependencies": {
899 | "estraverse": "^5.2.0"
900 | },
901 | "engines": {
902 | "node": ">=4.0"
903 | }
904 | },
905 | "node_modules/esrecurse/node_modules/estraverse": {
906 | "version": "5.2.0",
907 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
908 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
909 | "dev": true,
910 | "engines": {
911 | "node": ">=4.0"
912 | }
913 | },
914 | "node_modules/estraverse": {
915 | "version": "4.3.0",
916 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
917 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
918 | "dev": true,
919 | "engines": {
920 | "node": ">=4.0"
921 | }
922 | },
923 | "node_modules/esutils": {
924 | "version": "2.0.3",
925 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
926 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
927 | "dev": true,
928 | "engines": {
929 | "node": ">=0.10.0"
930 | }
931 | },
932 | "node_modules/fast-deep-equal": {
933 | "version": "3.1.3",
934 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
935 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
936 | "dev": true
937 | },
938 | "node_modules/fast-glob": {
939 | "version": "3.2.7",
940 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
941 | "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
942 | "dev": true,
943 | "dependencies": {
944 | "@nodelib/fs.stat": "^2.0.2",
945 | "@nodelib/fs.walk": "^1.2.3",
946 | "glob-parent": "^5.1.2",
947 | "merge2": "^1.3.0",
948 | "micromatch": "^4.0.4"
949 | },
950 | "engines": {
951 | "node": ">=8"
952 | }
953 | },
954 | "node_modules/fast-json-stable-stringify": {
955 | "version": "2.1.0",
956 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
957 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
958 | "dev": true
959 | },
960 | "node_modules/fast-levenshtein": {
961 | "version": "2.0.6",
962 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
963 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
964 | "dev": true
965 | },
966 | "node_modules/fastq": {
967 | "version": "1.11.1",
968 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz",
969 | "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==",
970 | "dev": true,
971 | "dependencies": {
972 | "reusify": "^1.0.4"
973 | }
974 | },
975 | "node_modules/file-entry-cache": {
976 | "version": "6.0.1",
977 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
978 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
979 | "dev": true,
980 | "dependencies": {
981 | "flat-cache": "^3.0.4"
982 | },
983 | "engines": {
984 | "node": "^10.12.0 || >=12.0.0"
985 | }
986 | },
987 | "node_modules/fill-range": {
988 | "version": "7.0.1",
989 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
990 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
991 | "dev": true,
992 | "dependencies": {
993 | "to-regex-range": "^5.0.1"
994 | },
995 | "engines": {
996 | "node": ">=8"
997 | }
998 | },
999 | "node_modules/flat-cache": {
1000 | "version": "3.0.4",
1001 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
1002 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
1003 | "dev": true,
1004 | "dependencies": {
1005 | "flatted": "^3.1.0",
1006 | "rimraf": "^3.0.2"
1007 | },
1008 | "engines": {
1009 | "node": "^10.12.0 || >=12.0.0"
1010 | }
1011 | },
1012 | "node_modules/flatted": {
1013 | "version": "3.2.2",
1014 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
1015 | "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
1016 | "dev": true
1017 | },
1018 | "node_modules/fs.realpath": {
1019 | "version": "1.0.0",
1020 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1021 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1022 | "dev": true
1023 | },
1024 | "node_modules/functional-red-black-tree": {
1025 | "version": "1.0.1",
1026 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1027 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1028 | "dev": true
1029 | },
1030 | "node_modules/glob": {
1031 | "version": "7.1.4",
1032 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
1033 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
1034 | "dev": true,
1035 | "dependencies": {
1036 | "fs.realpath": "^1.0.0",
1037 | "inflight": "^1.0.4",
1038 | "inherits": "2",
1039 | "minimatch": "^3.0.4",
1040 | "once": "^1.3.0",
1041 | "path-is-absolute": "^1.0.0"
1042 | },
1043 | "engines": {
1044 | "node": "*"
1045 | }
1046 | },
1047 | "node_modules/glob-parent": {
1048 | "version": "5.1.2",
1049 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1050 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1051 | "dev": true,
1052 | "dependencies": {
1053 | "is-glob": "^4.0.1"
1054 | },
1055 | "engines": {
1056 | "node": ">= 6"
1057 | }
1058 | },
1059 | "node_modules/globals": {
1060 | "version": "13.10.0",
1061 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
1062 | "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
1063 | "dev": true,
1064 | "dependencies": {
1065 | "type-fest": "^0.20.2"
1066 | },
1067 | "engines": {
1068 | "node": ">=8"
1069 | },
1070 | "funding": {
1071 | "url": "https://github.com/sponsors/sindresorhus"
1072 | }
1073 | },
1074 | "node_modules/globby": {
1075 | "version": "11.0.4",
1076 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
1077 | "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
1078 | "dev": true,
1079 | "dependencies": {
1080 | "array-union": "^2.1.0",
1081 | "dir-glob": "^3.0.1",
1082 | "fast-glob": "^3.1.1",
1083 | "ignore": "^5.1.4",
1084 | "merge2": "^1.3.0",
1085 | "slash": "^3.0.0"
1086 | },
1087 | "engines": {
1088 | "node": ">=10"
1089 | },
1090 | "funding": {
1091 | "url": "https://github.com/sponsors/sindresorhus"
1092 | }
1093 | },
1094 | "node_modules/globby/node_modules/ignore": {
1095 | "version": "5.1.8",
1096 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
1097 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
1098 | "dev": true,
1099 | "engines": {
1100 | "node": ">= 4"
1101 | }
1102 | },
1103 | "node_modules/has-flag": {
1104 | "version": "3.0.0",
1105 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1106 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1107 | "dev": true,
1108 | "engines": {
1109 | "node": ">=4"
1110 | }
1111 | },
1112 | "node_modules/ignore": {
1113 | "version": "4.0.6",
1114 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1115 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
1116 | "dev": true,
1117 | "engines": {
1118 | "node": ">= 4"
1119 | }
1120 | },
1121 | "node_modules/import-fresh": {
1122 | "version": "3.3.0",
1123 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1124 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1125 | "dev": true,
1126 | "dependencies": {
1127 | "parent-module": "^1.0.0",
1128 | "resolve-from": "^4.0.0"
1129 | },
1130 | "engines": {
1131 | "node": ">=6"
1132 | },
1133 | "funding": {
1134 | "url": "https://github.com/sponsors/sindresorhus"
1135 | }
1136 | },
1137 | "node_modules/imurmurhash": {
1138 | "version": "0.1.4",
1139 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1140 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1141 | "dev": true,
1142 | "engines": {
1143 | "node": ">=0.8.19"
1144 | }
1145 | },
1146 | "node_modules/inflight": {
1147 | "version": "1.0.6",
1148 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1149 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1150 | "dev": true,
1151 | "dependencies": {
1152 | "once": "^1.3.0",
1153 | "wrappy": "1"
1154 | }
1155 | },
1156 | "node_modules/inherits": {
1157 | "version": "2.0.4",
1158 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1159 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1160 | "dev": true
1161 | },
1162 | "node_modules/is-extglob": {
1163 | "version": "2.1.1",
1164 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1165 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1166 | "dev": true,
1167 | "engines": {
1168 | "node": ">=0.10.0"
1169 | }
1170 | },
1171 | "node_modules/is-fullwidth-code-point": {
1172 | "version": "3.0.0",
1173 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1174 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1175 | "dev": true,
1176 | "engines": {
1177 | "node": ">=8"
1178 | }
1179 | },
1180 | "node_modules/is-glob": {
1181 | "version": "4.0.1",
1182 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1183 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1184 | "dev": true,
1185 | "dependencies": {
1186 | "is-extglob": "^2.1.1"
1187 | },
1188 | "engines": {
1189 | "node": ">=0.10.0"
1190 | }
1191 | },
1192 | "node_modules/is-number": {
1193 | "version": "7.0.0",
1194 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1195 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1196 | "dev": true,
1197 | "engines": {
1198 | "node": ">=0.12.0"
1199 | }
1200 | },
1201 | "node_modules/isexe": {
1202 | "version": "2.0.0",
1203 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1204 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1205 | "dev": true
1206 | },
1207 | "node_modules/js-tokens": {
1208 | "version": "4.0.0",
1209 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1210 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1211 | "dev": true
1212 | },
1213 | "node_modules/js-yaml": {
1214 | "version": "3.13.1",
1215 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1216 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1217 | "dev": true,
1218 | "dependencies": {
1219 | "argparse": "^1.0.7",
1220 | "esprima": "^4.0.0"
1221 | },
1222 | "bin": {
1223 | "js-yaml": "bin/js-yaml.js"
1224 | }
1225 | },
1226 | "node_modules/json-schema-traverse": {
1227 | "version": "0.4.1",
1228 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1229 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1230 | "dev": true
1231 | },
1232 | "node_modules/json-stable-stringify-without-jsonify": {
1233 | "version": "1.0.1",
1234 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1235 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1236 | "dev": true
1237 | },
1238 | "node_modules/levn": {
1239 | "version": "0.4.1",
1240 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1241 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1242 | "dev": true,
1243 | "dependencies": {
1244 | "prelude-ls": "^1.2.1",
1245 | "type-check": "~0.4.0"
1246 | },
1247 | "engines": {
1248 | "node": ">= 0.8.0"
1249 | }
1250 | },
1251 | "node_modules/lodash.clonedeep": {
1252 | "version": "4.5.0",
1253 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
1254 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
1255 | "dev": true
1256 | },
1257 | "node_modules/lodash.merge": {
1258 | "version": "4.6.2",
1259 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1260 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1261 | "dev": true
1262 | },
1263 | "node_modules/lodash.truncate": {
1264 | "version": "4.4.2",
1265 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
1266 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
1267 | "dev": true
1268 | },
1269 | "node_modules/lru-cache": {
1270 | "version": "6.0.0",
1271 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1272 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1273 | "dev": true,
1274 | "dependencies": {
1275 | "yallist": "^4.0.0"
1276 | },
1277 | "engines": {
1278 | "node": ">=10"
1279 | }
1280 | },
1281 | "node_modules/merge2": {
1282 | "version": "1.4.1",
1283 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1284 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1285 | "dev": true,
1286 | "engines": {
1287 | "node": ">= 8"
1288 | }
1289 | },
1290 | "node_modules/micromatch": {
1291 | "version": "4.0.4",
1292 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
1293 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
1294 | "dev": true,
1295 | "dependencies": {
1296 | "braces": "^3.0.1",
1297 | "picomatch": "^2.2.3"
1298 | },
1299 | "engines": {
1300 | "node": ">=8.6"
1301 | }
1302 | },
1303 | "node_modules/minimatch": {
1304 | "version": "3.0.4",
1305 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1306 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1307 | "dev": true,
1308 | "dependencies": {
1309 | "brace-expansion": "^1.1.7"
1310 | },
1311 | "engines": {
1312 | "node": "*"
1313 | }
1314 | },
1315 | "node_modules/ms": {
1316 | "version": "2.1.2",
1317 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1318 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1319 | "dev": true
1320 | },
1321 | "node_modules/natural-compare": {
1322 | "version": "1.4.0",
1323 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1324 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1325 | "dev": true
1326 | },
1327 | "node_modules/once": {
1328 | "version": "1.4.0",
1329 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1330 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1331 | "dev": true,
1332 | "dependencies": {
1333 | "wrappy": "1"
1334 | }
1335 | },
1336 | "node_modules/optionator": {
1337 | "version": "0.9.1",
1338 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
1339 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
1340 | "dev": true,
1341 | "dependencies": {
1342 | "deep-is": "^0.1.3",
1343 | "fast-levenshtein": "^2.0.6",
1344 | "levn": "^0.4.1",
1345 | "prelude-ls": "^1.2.1",
1346 | "type-check": "^0.4.0",
1347 | "word-wrap": "^1.2.3"
1348 | },
1349 | "engines": {
1350 | "node": ">= 0.8.0"
1351 | }
1352 | },
1353 | "node_modules/parent-module": {
1354 | "version": "1.0.1",
1355 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1356 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1357 | "dev": true,
1358 | "dependencies": {
1359 | "callsites": "^3.0.0"
1360 | },
1361 | "engines": {
1362 | "node": ">=6"
1363 | }
1364 | },
1365 | "node_modules/path-is-absolute": {
1366 | "version": "1.0.1",
1367 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1368 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1369 | "dev": true,
1370 | "engines": {
1371 | "node": ">=0.10.0"
1372 | }
1373 | },
1374 | "node_modules/path-key": {
1375 | "version": "3.1.1",
1376 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1377 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1378 | "dev": true,
1379 | "engines": {
1380 | "node": ">=8"
1381 | }
1382 | },
1383 | "node_modules/path-type": {
1384 | "version": "4.0.0",
1385 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
1386 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
1387 | "dev": true,
1388 | "engines": {
1389 | "node": ">=8"
1390 | }
1391 | },
1392 | "node_modules/picomatch": {
1393 | "version": "2.3.0",
1394 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
1395 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
1396 | "dev": true,
1397 | "engines": {
1398 | "node": ">=8.6"
1399 | },
1400 | "funding": {
1401 | "url": "https://github.com/sponsors/jonschlinkert"
1402 | }
1403 | },
1404 | "node_modules/prelude-ls": {
1405 | "version": "1.2.1",
1406 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1407 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1408 | "dev": true,
1409 | "engines": {
1410 | "node": ">= 0.8.0"
1411 | }
1412 | },
1413 | "node_modules/progress": {
1414 | "version": "2.0.3",
1415 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1416 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1417 | "dev": true,
1418 | "engines": {
1419 | "node": ">=0.4.0"
1420 | }
1421 | },
1422 | "node_modules/punycode": {
1423 | "version": "2.1.1",
1424 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1425 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1426 | "dev": true,
1427 | "engines": {
1428 | "node": ">=6"
1429 | }
1430 | },
1431 | "node_modules/queue-microtask": {
1432 | "version": "1.2.3",
1433 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1434 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1435 | "dev": true,
1436 | "funding": [
1437 | {
1438 | "type": "github",
1439 | "url": "https://github.com/sponsors/feross"
1440 | },
1441 | {
1442 | "type": "patreon",
1443 | "url": "https://www.patreon.com/feross"
1444 | },
1445 | {
1446 | "type": "consulting",
1447 | "url": "https://feross.org/support"
1448 | }
1449 | ]
1450 | },
1451 | "node_modules/regexpp": {
1452 | "version": "3.2.0",
1453 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
1454 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
1455 | "dev": true,
1456 | "engines": {
1457 | "node": ">=8"
1458 | },
1459 | "funding": {
1460 | "url": "https://github.com/sponsors/mysticatea"
1461 | }
1462 | },
1463 | "node_modules/require-from-string": {
1464 | "version": "2.0.2",
1465 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
1466 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1467 | "dev": true,
1468 | "engines": {
1469 | "node": ">=0.10.0"
1470 | }
1471 | },
1472 | "node_modules/resolve-from": {
1473 | "version": "4.0.0",
1474 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1475 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1476 | "dev": true,
1477 | "engines": {
1478 | "node": ">=4"
1479 | }
1480 | },
1481 | "node_modules/reusify": {
1482 | "version": "1.0.4",
1483 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1484 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1485 | "dev": true,
1486 | "engines": {
1487 | "iojs": ">=1.0.0",
1488 | "node": ">=0.10.0"
1489 | }
1490 | },
1491 | "node_modules/rimraf": {
1492 | "version": "3.0.2",
1493 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1494 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1495 | "dev": true,
1496 | "dependencies": {
1497 | "glob": "^7.1.3"
1498 | },
1499 | "bin": {
1500 | "rimraf": "bin.js"
1501 | },
1502 | "funding": {
1503 | "url": "https://github.com/sponsors/isaacs"
1504 | }
1505 | },
1506 | "node_modules/run-parallel": {
1507 | "version": "1.2.0",
1508 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1509 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1510 | "dev": true,
1511 | "funding": [
1512 | {
1513 | "type": "github",
1514 | "url": "https://github.com/sponsors/feross"
1515 | },
1516 | {
1517 | "type": "patreon",
1518 | "url": "https://www.patreon.com/feross"
1519 | },
1520 | {
1521 | "type": "consulting",
1522 | "url": "https://feross.org/support"
1523 | }
1524 | ],
1525 | "dependencies": {
1526 | "queue-microtask": "^1.2.2"
1527 | }
1528 | },
1529 | "node_modules/shebang-command": {
1530 | "version": "2.0.0",
1531 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1532 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1533 | "dev": true,
1534 | "dependencies": {
1535 | "shebang-regex": "^3.0.0"
1536 | },
1537 | "engines": {
1538 | "node": ">=8"
1539 | }
1540 | },
1541 | "node_modules/shebang-regex": {
1542 | "version": "3.0.0",
1543 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1544 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1545 | "dev": true,
1546 | "engines": {
1547 | "node": ">=8"
1548 | }
1549 | },
1550 | "node_modules/slash": {
1551 | "version": "3.0.0",
1552 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
1553 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
1554 | "dev": true,
1555 | "engines": {
1556 | "node": ">=8"
1557 | }
1558 | },
1559 | "node_modules/slice-ansi": {
1560 | "version": "4.0.0",
1561 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
1562 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
1563 | "dev": true,
1564 | "dependencies": {
1565 | "ansi-styles": "^4.0.0",
1566 | "astral-regex": "^2.0.0",
1567 | "is-fullwidth-code-point": "^3.0.0"
1568 | },
1569 | "engines": {
1570 | "node": ">=10"
1571 | },
1572 | "funding": {
1573 | "url": "https://github.com/chalk/slice-ansi?sponsor=1"
1574 | }
1575 | },
1576 | "node_modules/slice-ansi/node_modules/ansi-styles": {
1577 | "version": "4.3.0",
1578 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1579 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1580 | "dev": true,
1581 | "dependencies": {
1582 | "color-convert": "^2.0.1"
1583 | },
1584 | "engines": {
1585 | "node": ">=8"
1586 | },
1587 | "funding": {
1588 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1589 | }
1590 | },
1591 | "node_modules/slice-ansi/node_modules/color-convert": {
1592 | "version": "2.0.1",
1593 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1594 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1595 | "dev": true,
1596 | "dependencies": {
1597 | "color-name": "~1.1.4"
1598 | },
1599 | "engines": {
1600 | "node": ">=7.0.0"
1601 | }
1602 | },
1603 | "node_modules/slice-ansi/node_modules/color-name": {
1604 | "version": "1.1.4",
1605 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1606 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1607 | "dev": true
1608 | },
1609 | "node_modules/sprintf-js": {
1610 | "version": "1.0.3",
1611 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1612 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1613 | "dev": true
1614 | },
1615 | "node_modules/string-width": {
1616 | "version": "4.2.2",
1617 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
1618 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
1619 | "dev": true,
1620 | "dependencies": {
1621 | "emoji-regex": "^8.0.0",
1622 | "is-fullwidth-code-point": "^3.0.0",
1623 | "strip-ansi": "^6.0.0"
1624 | },
1625 | "engines": {
1626 | "node": ">=8"
1627 | }
1628 | },
1629 | "node_modules/strip-ansi": {
1630 | "version": "6.0.0",
1631 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
1632 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
1633 | "dev": true,
1634 | "dependencies": {
1635 | "ansi-regex": "^5.0.0"
1636 | },
1637 | "engines": {
1638 | "node": ">=8"
1639 | }
1640 | },
1641 | "node_modules/strip-json-comments": {
1642 | "version": "3.1.1",
1643 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
1644 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
1645 | "dev": true,
1646 | "engines": {
1647 | "node": ">=8"
1648 | },
1649 | "funding": {
1650 | "url": "https://github.com/sponsors/sindresorhus"
1651 | }
1652 | },
1653 | "node_modules/supports-color": {
1654 | "version": "5.5.0",
1655 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1656 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1657 | "dev": true,
1658 | "dependencies": {
1659 | "has-flag": "^3.0.0"
1660 | },
1661 | "engines": {
1662 | "node": ">=4"
1663 | }
1664 | },
1665 | "node_modules/table": {
1666 | "version": "6.7.1",
1667 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
1668 | "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
1669 | "dev": true,
1670 | "dependencies": {
1671 | "ajv": "^8.0.1",
1672 | "lodash.clonedeep": "^4.5.0",
1673 | "lodash.truncate": "^4.4.2",
1674 | "slice-ansi": "^4.0.0",
1675 | "string-width": "^4.2.0",
1676 | "strip-ansi": "^6.0.0"
1677 | },
1678 | "engines": {
1679 | "node": ">=10.0.0"
1680 | }
1681 | },
1682 | "node_modules/table/node_modules/ajv": {
1683 | "version": "8.6.2",
1684 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
1685 | "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
1686 | "dev": true,
1687 | "dependencies": {
1688 | "fast-deep-equal": "^3.1.1",
1689 | "json-schema-traverse": "^1.0.0",
1690 | "require-from-string": "^2.0.2",
1691 | "uri-js": "^4.2.2"
1692 | },
1693 | "funding": {
1694 | "type": "github",
1695 | "url": "https://github.com/sponsors/epoberezkin"
1696 | }
1697 | },
1698 | "node_modules/table/node_modules/json-schema-traverse": {
1699 | "version": "1.0.0",
1700 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1701 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1702 | "dev": true
1703 | },
1704 | "node_modules/text-table": {
1705 | "version": "0.2.0",
1706 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1707 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1708 | "dev": true
1709 | },
1710 | "node_modules/to-regex-range": {
1711 | "version": "5.0.1",
1712 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1713 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1714 | "dev": true,
1715 | "dependencies": {
1716 | "is-number": "^7.0.0"
1717 | },
1718 | "engines": {
1719 | "node": ">=8.0"
1720 | }
1721 | },
1722 | "node_modules/tslib": {
1723 | "version": "1.14.1",
1724 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1725 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
1726 | "dev": true
1727 | },
1728 | "node_modules/type-check": {
1729 | "version": "0.4.0",
1730 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
1731 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
1732 | "dev": true,
1733 | "dependencies": {
1734 | "prelude-ls": "^1.2.1"
1735 | },
1736 | "engines": {
1737 | "node": ">= 0.8.0"
1738 | }
1739 | },
1740 | "node_modules/type-fest": {
1741 | "version": "0.20.2",
1742 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1743 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
1744 | "dev": true,
1745 | "engines": {
1746 | "node": ">=10"
1747 | },
1748 | "funding": {
1749 | "url": "https://github.com/sponsors/sindresorhus"
1750 | }
1751 | },
1752 | "node_modules/typescript": {
1753 | "version": "4.3.5",
1754 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
1755 | "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
1756 | "dev": true,
1757 | "bin": {
1758 | "tsc": "bin/tsc",
1759 | "tsserver": "bin/tsserver"
1760 | },
1761 | "engines": {
1762 | "node": ">=4.2.0"
1763 | }
1764 | },
1765 | "node_modules/uri-js": {
1766 | "version": "4.4.1",
1767 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1768 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1769 | "dev": true,
1770 | "dependencies": {
1771 | "punycode": "^2.1.0"
1772 | }
1773 | },
1774 | "node_modules/v8-compile-cache": {
1775 | "version": "2.3.0",
1776 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
1777 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
1778 | "dev": true
1779 | },
1780 | "node_modules/which": {
1781 | "version": "2.0.2",
1782 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1783 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1784 | "dev": true,
1785 | "dependencies": {
1786 | "isexe": "^2.0.0"
1787 | },
1788 | "bin": {
1789 | "node-which": "bin/node-which"
1790 | },
1791 | "engines": {
1792 | "node": ">= 8"
1793 | }
1794 | },
1795 | "node_modules/word-wrap": {
1796 | "version": "1.2.3",
1797 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1798 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
1799 | "dev": true,
1800 | "engines": {
1801 | "node": ">=0.10.0"
1802 | }
1803 | },
1804 | "node_modules/wrappy": {
1805 | "version": "1.0.2",
1806 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1807 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1808 | "dev": true
1809 | },
1810 | "node_modules/yallist": {
1811 | "version": "4.0.0",
1812 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1813 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1814 | "dev": true
1815 | }
1816 | },
1817 | "dependencies": {
1818 | "@babel/code-frame": {
1819 | "version": "7.12.11",
1820 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
1821 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
1822 | "dev": true,
1823 | "requires": {
1824 | "@babel/highlight": "^7.10.4"
1825 | }
1826 | },
1827 | "@babel/helper-validator-identifier": {
1828 | "version": "7.14.9",
1829 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
1830 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
1831 | "dev": true
1832 | },
1833 | "@babel/highlight": {
1834 | "version": "7.14.5",
1835 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
1836 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
1837 | "dev": true,
1838 | "requires": {
1839 | "@babel/helper-validator-identifier": "^7.14.5",
1840 | "chalk": "^2.0.0",
1841 | "js-tokens": "^4.0.0"
1842 | }
1843 | },
1844 | "@eslint/eslintrc": {
1845 | "version": "0.4.3",
1846 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
1847 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
1848 | "dev": true,
1849 | "requires": {
1850 | "ajv": "^6.12.4",
1851 | "debug": "^4.1.1",
1852 | "espree": "^7.3.0",
1853 | "globals": "^13.9.0",
1854 | "ignore": "^4.0.6",
1855 | "import-fresh": "^3.2.1",
1856 | "js-yaml": "^3.13.1",
1857 | "minimatch": "^3.0.4",
1858 | "strip-json-comments": "^3.1.1"
1859 | }
1860 | },
1861 | "@humanwhocodes/config-array": {
1862 | "version": "0.5.0",
1863 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
1864 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
1865 | "dev": true,
1866 | "requires": {
1867 | "@humanwhocodes/object-schema": "^1.2.0",
1868 | "debug": "^4.1.1",
1869 | "minimatch": "^3.0.4"
1870 | }
1871 | },
1872 | "@humanwhocodes/object-schema": {
1873 | "version": "1.2.0",
1874 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
1875 | "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
1876 | "dev": true
1877 | },
1878 | "@nodelib/fs.scandir": {
1879 | "version": "2.1.5",
1880 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1881 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1882 | "dev": true,
1883 | "requires": {
1884 | "@nodelib/fs.stat": "2.0.5",
1885 | "run-parallel": "^1.1.9"
1886 | }
1887 | },
1888 | "@nodelib/fs.stat": {
1889 | "version": "2.0.5",
1890 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1891 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1892 | "dev": true
1893 | },
1894 | "@nodelib/fs.walk": {
1895 | "version": "1.2.8",
1896 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1897 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1898 | "dev": true,
1899 | "requires": {
1900 | "@nodelib/fs.scandir": "2.1.5",
1901 | "fastq": "^1.6.0"
1902 | }
1903 | },
1904 | "@types/json-schema": {
1905 | "version": "7.0.9",
1906 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
1907 | "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
1908 | "dev": true
1909 | },
1910 | "@types/node": {
1911 | "version": "12.20.15",
1912 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz",
1913 | "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==",
1914 | "dev": true
1915 | },
1916 | "@types/vscode": {
1917 | "version": "1.53.0",
1918 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz",
1919 | "integrity": "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==",
1920 | "dev": true
1921 | },
1922 | "@typescript-eslint/eslint-plugin": {
1923 | "version": "4.29.0",
1924 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz",
1925 | "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==",
1926 | "dev": true,
1927 | "requires": {
1928 | "@typescript-eslint/experimental-utils": "4.29.0",
1929 | "@typescript-eslint/scope-manager": "4.29.0",
1930 | "debug": "^4.3.1",
1931 | "functional-red-black-tree": "^1.0.1",
1932 | "regexpp": "^3.1.0",
1933 | "semver": "^7.3.5",
1934 | "tsutils": "^3.21.0"
1935 | },
1936 | "dependencies": {
1937 | "semver": {
1938 | "version": "7.3.5",
1939 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
1940 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
1941 | "dev": true,
1942 | "requires": {
1943 | "lru-cache": "^6.0.0"
1944 | }
1945 | },
1946 | "tsutils": {
1947 | "version": "3.21.0",
1948 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
1949 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
1950 | "dev": true,
1951 | "requires": {
1952 | "tslib": "^1.8.1"
1953 | }
1954 | }
1955 | }
1956 | },
1957 | "@typescript-eslint/experimental-utils": {
1958 | "version": "4.29.0",
1959 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz",
1960 | "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==",
1961 | "dev": true,
1962 | "requires": {
1963 | "@types/json-schema": "^7.0.7",
1964 | "@typescript-eslint/scope-manager": "4.29.0",
1965 | "@typescript-eslint/types": "4.29.0",
1966 | "@typescript-eslint/typescript-estree": "4.29.0",
1967 | "eslint-scope": "^5.1.1",
1968 | "eslint-utils": "^3.0.0"
1969 | }
1970 | },
1971 | "@typescript-eslint/parser": {
1972 | "version": "4.29.0",
1973 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz",
1974 | "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==",
1975 | "dev": true,
1976 | "requires": {
1977 | "@typescript-eslint/scope-manager": "4.29.0",
1978 | "@typescript-eslint/types": "4.29.0",
1979 | "@typescript-eslint/typescript-estree": "4.29.0",
1980 | "debug": "^4.3.1"
1981 | }
1982 | },
1983 | "@typescript-eslint/scope-manager": {
1984 | "version": "4.29.0",
1985 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz",
1986 | "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==",
1987 | "dev": true,
1988 | "requires": {
1989 | "@typescript-eslint/types": "4.29.0",
1990 | "@typescript-eslint/visitor-keys": "4.29.0"
1991 | }
1992 | },
1993 | "@typescript-eslint/types": {
1994 | "version": "4.29.0",
1995 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz",
1996 | "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==",
1997 | "dev": true
1998 | },
1999 | "@typescript-eslint/typescript-estree": {
2000 | "version": "4.29.0",
2001 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz",
2002 | "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==",
2003 | "dev": true,
2004 | "requires": {
2005 | "@typescript-eslint/types": "4.29.0",
2006 | "@typescript-eslint/visitor-keys": "4.29.0",
2007 | "debug": "^4.3.1",
2008 | "globby": "^11.0.3",
2009 | "is-glob": "^4.0.1",
2010 | "semver": "^7.3.5",
2011 | "tsutils": "^3.21.0"
2012 | },
2013 | "dependencies": {
2014 | "semver": {
2015 | "version": "7.3.5",
2016 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
2017 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
2018 | "dev": true,
2019 | "requires": {
2020 | "lru-cache": "^6.0.0"
2021 | }
2022 | },
2023 | "tsutils": {
2024 | "version": "3.21.0",
2025 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
2026 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
2027 | "dev": true,
2028 | "requires": {
2029 | "tslib": "^1.8.1"
2030 | }
2031 | }
2032 | }
2033 | },
2034 | "@typescript-eslint/visitor-keys": {
2035 | "version": "4.29.0",
2036 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz",
2037 | "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==",
2038 | "dev": true,
2039 | "requires": {
2040 | "@typescript-eslint/types": "4.29.0",
2041 | "eslint-visitor-keys": "^2.0.0"
2042 | }
2043 | },
2044 | "acorn": {
2045 | "version": "7.4.1",
2046 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
2047 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
2048 | "dev": true
2049 | },
2050 | "acorn-jsx": {
2051 | "version": "5.3.2",
2052 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
2053 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
2054 | "dev": true,
2055 | "requires": {}
2056 | },
2057 | "ajv": {
2058 | "version": "6.12.6",
2059 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
2060 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
2061 | "dev": true,
2062 | "requires": {
2063 | "fast-deep-equal": "^3.1.1",
2064 | "fast-json-stable-stringify": "^2.0.0",
2065 | "json-schema-traverse": "^0.4.1",
2066 | "uri-js": "^4.2.2"
2067 | }
2068 | },
2069 | "ansi-colors": {
2070 | "version": "4.1.1",
2071 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
2072 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
2073 | "dev": true
2074 | },
2075 | "ansi-regex": {
2076 | "version": "5.0.0",
2077 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2078 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
2079 | "dev": true
2080 | },
2081 | "ansi-styles": {
2082 | "version": "3.2.1",
2083 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
2084 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
2085 | "dev": true,
2086 | "requires": {
2087 | "color-convert": "^1.9.0"
2088 | }
2089 | },
2090 | "argparse": {
2091 | "version": "1.0.10",
2092 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
2093 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
2094 | "dev": true,
2095 | "requires": {
2096 | "sprintf-js": "~1.0.2"
2097 | }
2098 | },
2099 | "array-union": {
2100 | "version": "2.1.0",
2101 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
2102 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
2103 | "dev": true
2104 | },
2105 | "astral-regex": {
2106 | "version": "2.0.0",
2107 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
2108 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
2109 | "dev": true
2110 | },
2111 | "balanced-match": {
2112 | "version": "1.0.0",
2113 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
2114 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
2115 | "dev": true
2116 | },
2117 | "brace-expansion": {
2118 | "version": "1.1.11",
2119 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
2120 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
2121 | "dev": true,
2122 | "requires": {
2123 | "balanced-match": "^1.0.0",
2124 | "concat-map": "0.0.1"
2125 | }
2126 | },
2127 | "braces": {
2128 | "version": "3.0.2",
2129 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
2130 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
2131 | "dev": true,
2132 | "requires": {
2133 | "fill-range": "^7.0.1"
2134 | }
2135 | },
2136 | "callsites": {
2137 | "version": "3.1.0",
2138 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
2139 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
2140 | "dev": true
2141 | },
2142 | "chalk": {
2143 | "version": "2.4.2",
2144 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
2145 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
2146 | "dev": true,
2147 | "requires": {
2148 | "ansi-styles": "^3.2.1",
2149 | "escape-string-regexp": "^1.0.5",
2150 | "supports-color": "^5.3.0"
2151 | }
2152 | },
2153 | "color-convert": {
2154 | "version": "1.9.3",
2155 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
2156 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
2157 | "dev": true,
2158 | "requires": {
2159 | "color-name": "1.1.3"
2160 | }
2161 | },
2162 | "color-name": {
2163 | "version": "1.1.3",
2164 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
2165 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
2166 | "dev": true
2167 | },
2168 | "concat-map": {
2169 | "version": "0.0.1",
2170 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2171 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
2172 | "dev": true
2173 | },
2174 | "cross-spawn": {
2175 | "version": "7.0.3",
2176 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
2177 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
2178 | "dev": true,
2179 | "requires": {
2180 | "path-key": "^3.1.0",
2181 | "shebang-command": "^2.0.0",
2182 | "which": "^2.0.1"
2183 | }
2184 | },
2185 | "debug": {
2186 | "version": "4.3.2",
2187 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
2188 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
2189 | "dev": true,
2190 | "requires": {
2191 | "ms": "2.1.2"
2192 | }
2193 | },
2194 | "deep-is": {
2195 | "version": "0.1.3",
2196 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
2197 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
2198 | "dev": true
2199 | },
2200 | "dir-glob": {
2201 | "version": "3.0.1",
2202 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
2203 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
2204 | "dev": true,
2205 | "requires": {
2206 | "path-type": "^4.0.0"
2207 | }
2208 | },
2209 | "doctrine": {
2210 | "version": "3.0.0",
2211 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
2212 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
2213 | "dev": true,
2214 | "requires": {
2215 | "esutils": "^2.0.2"
2216 | }
2217 | },
2218 | "emoji-regex": {
2219 | "version": "8.0.0",
2220 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2221 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2222 | "dev": true
2223 | },
2224 | "enquirer": {
2225 | "version": "2.3.6",
2226 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
2227 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
2228 | "dev": true,
2229 | "requires": {
2230 | "ansi-colors": "^4.1.1"
2231 | }
2232 | },
2233 | "escape-string-regexp": {
2234 | "version": "1.0.5",
2235 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
2236 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
2237 | "dev": true
2238 | },
2239 | "eslint": {
2240 | "version": "7.32.0",
2241 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
2242 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
2243 | "dev": true,
2244 | "requires": {
2245 | "@babel/code-frame": "7.12.11",
2246 | "@eslint/eslintrc": "^0.4.3",
2247 | "@humanwhocodes/config-array": "^0.5.0",
2248 | "ajv": "^6.10.0",
2249 | "chalk": "^4.0.0",
2250 | "cross-spawn": "^7.0.2",
2251 | "debug": "^4.0.1",
2252 | "doctrine": "^3.0.0",
2253 | "enquirer": "^2.3.5",
2254 | "escape-string-regexp": "^4.0.0",
2255 | "eslint-scope": "^5.1.1",
2256 | "eslint-utils": "^2.1.0",
2257 | "eslint-visitor-keys": "^2.0.0",
2258 | "espree": "^7.3.1",
2259 | "esquery": "^1.4.0",
2260 | "esutils": "^2.0.2",
2261 | "fast-deep-equal": "^3.1.3",
2262 | "file-entry-cache": "^6.0.1",
2263 | "functional-red-black-tree": "^1.0.1",
2264 | "glob-parent": "^5.1.2",
2265 | "globals": "^13.6.0",
2266 | "ignore": "^4.0.6",
2267 | "import-fresh": "^3.0.0",
2268 | "imurmurhash": "^0.1.4",
2269 | "is-glob": "^4.0.0",
2270 | "js-yaml": "^3.13.1",
2271 | "json-stable-stringify-without-jsonify": "^1.0.1",
2272 | "levn": "^0.4.1",
2273 | "lodash.merge": "^4.6.2",
2274 | "minimatch": "^3.0.4",
2275 | "natural-compare": "^1.4.0",
2276 | "optionator": "^0.9.1",
2277 | "progress": "^2.0.0",
2278 | "regexpp": "^3.1.0",
2279 | "semver": "^7.2.1",
2280 | "strip-ansi": "^6.0.0",
2281 | "strip-json-comments": "^3.1.0",
2282 | "table": "^6.0.9",
2283 | "text-table": "^0.2.0",
2284 | "v8-compile-cache": "^2.0.3"
2285 | },
2286 | "dependencies": {
2287 | "ansi-styles": {
2288 | "version": "4.3.0",
2289 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2290 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2291 | "dev": true,
2292 | "requires": {
2293 | "color-convert": "^2.0.1"
2294 | }
2295 | },
2296 | "chalk": {
2297 | "version": "4.1.2",
2298 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2299 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2300 | "dev": true,
2301 | "requires": {
2302 | "ansi-styles": "^4.1.0",
2303 | "supports-color": "^7.1.0"
2304 | }
2305 | },
2306 | "color-convert": {
2307 | "version": "2.0.1",
2308 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2309 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2310 | "dev": true,
2311 | "requires": {
2312 | "color-name": "~1.1.4"
2313 | }
2314 | },
2315 | "color-name": {
2316 | "version": "1.1.4",
2317 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2318 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2319 | "dev": true
2320 | },
2321 | "escape-string-regexp": {
2322 | "version": "4.0.0",
2323 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2324 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2325 | "dev": true
2326 | },
2327 | "eslint-utils": {
2328 | "version": "2.1.0",
2329 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
2330 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
2331 | "dev": true,
2332 | "requires": {
2333 | "eslint-visitor-keys": "^1.1.0"
2334 | },
2335 | "dependencies": {
2336 | "eslint-visitor-keys": {
2337 | "version": "1.3.0",
2338 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
2339 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
2340 | "dev": true
2341 | }
2342 | }
2343 | },
2344 | "has-flag": {
2345 | "version": "4.0.0",
2346 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2347 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2348 | "dev": true
2349 | },
2350 | "semver": {
2351 | "version": "7.3.5",
2352 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
2353 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
2354 | "dev": true,
2355 | "requires": {
2356 | "lru-cache": "^6.0.0"
2357 | }
2358 | },
2359 | "supports-color": {
2360 | "version": "7.2.0",
2361 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2362 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2363 | "dev": true,
2364 | "requires": {
2365 | "has-flag": "^4.0.0"
2366 | }
2367 | }
2368 | }
2369 | },
2370 | "eslint-scope": {
2371 | "version": "5.1.1",
2372 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
2373 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
2374 | "dev": true,
2375 | "requires": {
2376 | "esrecurse": "^4.3.0",
2377 | "estraverse": "^4.1.1"
2378 | }
2379 | },
2380 | "eslint-utils": {
2381 | "version": "3.0.0",
2382 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
2383 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
2384 | "dev": true,
2385 | "requires": {
2386 | "eslint-visitor-keys": "^2.0.0"
2387 | }
2388 | },
2389 | "eslint-visitor-keys": {
2390 | "version": "2.1.0",
2391 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
2392 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
2393 | "dev": true
2394 | },
2395 | "espree": {
2396 | "version": "7.3.1",
2397 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
2398 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
2399 | "dev": true,
2400 | "requires": {
2401 | "acorn": "^7.4.0",
2402 | "acorn-jsx": "^5.3.1",
2403 | "eslint-visitor-keys": "^1.3.0"
2404 | },
2405 | "dependencies": {
2406 | "eslint-visitor-keys": {
2407 | "version": "1.3.0",
2408 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
2409 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
2410 | "dev": true
2411 | }
2412 | }
2413 | },
2414 | "esprima": {
2415 | "version": "4.0.1",
2416 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
2417 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
2418 | "dev": true
2419 | },
2420 | "esquery": {
2421 | "version": "1.4.0",
2422 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
2423 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
2424 | "dev": true,
2425 | "requires": {
2426 | "estraverse": "^5.1.0"
2427 | },
2428 | "dependencies": {
2429 | "estraverse": {
2430 | "version": "5.2.0",
2431 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
2432 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
2433 | "dev": true
2434 | }
2435 | }
2436 | },
2437 | "esrecurse": {
2438 | "version": "4.3.0",
2439 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
2440 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
2441 | "dev": true,
2442 | "requires": {
2443 | "estraverse": "^5.2.0"
2444 | },
2445 | "dependencies": {
2446 | "estraverse": {
2447 | "version": "5.2.0",
2448 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
2449 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
2450 | "dev": true
2451 | }
2452 | }
2453 | },
2454 | "estraverse": {
2455 | "version": "4.3.0",
2456 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
2457 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
2458 | "dev": true
2459 | },
2460 | "esutils": {
2461 | "version": "2.0.3",
2462 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
2463 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
2464 | "dev": true
2465 | },
2466 | "fast-deep-equal": {
2467 | "version": "3.1.3",
2468 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2469 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2470 | "dev": true
2471 | },
2472 | "fast-glob": {
2473 | "version": "3.2.7",
2474 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
2475 | "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
2476 | "dev": true,
2477 | "requires": {
2478 | "@nodelib/fs.stat": "^2.0.2",
2479 | "@nodelib/fs.walk": "^1.2.3",
2480 | "glob-parent": "^5.1.2",
2481 | "merge2": "^1.3.0",
2482 | "micromatch": "^4.0.4"
2483 | }
2484 | },
2485 | "fast-json-stable-stringify": {
2486 | "version": "2.1.0",
2487 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
2488 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
2489 | "dev": true
2490 | },
2491 | "fast-levenshtein": {
2492 | "version": "2.0.6",
2493 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2494 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
2495 | "dev": true
2496 | },
2497 | "fastq": {
2498 | "version": "1.11.1",
2499 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz",
2500 | "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==",
2501 | "dev": true,
2502 | "requires": {
2503 | "reusify": "^1.0.4"
2504 | }
2505 | },
2506 | "file-entry-cache": {
2507 | "version": "6.0.1",
2508 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
2509 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
2510 | "dev": true,
2511 | "requires": {
2512 | "flat-cache": "^3.0.4"
2513 | }
2514 | },
2515 | "fill-range": {
2516 | "version": "7.0.1",
2517 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
2518 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
2519 | "dev": true,
2520 | "requires": {
2521 | "to-regex-range": "^5.0.1"
2522 | }
2523 | },
2524 | "flat-cache": {
2525 | "version": "3.0.4",
2526 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
2527 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
2528 | "dev": true,
2529 | "requires": {
2530 | "flatted": "^3.1.0",
2531 | "rimraf": "^3.0.2"
2532 | }
2533 | },
2534 | "flatted": {
2535 | "version": "3.2.2",
2536 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
2537 | "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
2538 | "dev": true
2539 | },
2540 | "fs.realpath": {
2541 | "version": "1.0.0",
2542 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2543 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
2544 | "dev": true
2545 | },
2546 | "functional-red-black-tree": {
2547 | "version": "1.0.1",
2548 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
2549 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
2550 | "dev": true
2551 | },
2552 | "glob": {
2553 | "version": "7.1.4",
2554 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
2555 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
2556 | "dev": true,
2557 | "requires": {
2558 | "fs.realpath": "^1.0.0",
2559 | "inflight": "^1.0.4",
2560 | "inherits": "2",
2561 | "minimatch": "^3.0.4",
2562 | "once": "^1.3.0",
2563 | "path-is-absolute": "^1.0.0"
2564 | }
2565 | },
2566 | "glob-parent": {
2567 | "version": "5.1.2",
2568 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
2569 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
2570 | "dev": true,
2571 | "requires": {
2572 | "is-glob": "^4.0.1"
2573 | }
2574 | },
2575 | "globals": {
2576 | "version": "13.10.0",
2577 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
2578 | "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
2579 | "dev": true,
2580 | "requires": {
2581 | "type-fest": "^0.20.2"
2582 | }
2583 | },
2584 | "globby": {
2585 | "version": "11.0.4",
2586 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
2587 | "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
2588 | "dev": true,
2589 | "requires": {
2590 | "array-union": "^2.1.0",
2591 | "dir-glob": "^3.0.1",
2592 | "fast-glob": "^3.1.1",
2593 | "ignore": "^5.1.4",
2594 | "merge2": "^1.3.0",
2595 | "slash": "^3.0.0"
2596 | },
2597 | "dependencies": {
2598 | "ignore": {
2599 | "version": "5.1.8",
2600 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
2601 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
2602 | "dev": true
2603 | }
2604 | }
2605 | },
2606 | "has-flag": {
2607 | "version": "3.0.0",
2608 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2609 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2610 | "dev": true
2611 | },
2612 | "ignore": {
2613 | "version": "4.0.6",
2614 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
2615 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
2616 | "dev": true
2617 | },
2618 | "import-fresh": {
2619 | "version": "3.3.0",
2620 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
2621 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
2622 | "dev": true,
2623 | "requires": {
2624 | "parent-module": "^1.0.0",
2625 | "resolve-from": "^4.0.0"
2626 | }
2627 | },
2628 | "imurmurhash": {
2629 | "version": "0.1.4",
2630 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2631 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2632 | "dev": true
2633 | },
2634 | "inflight": {
2635 | "version": "1.0.6",
2636 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2637 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2638 | "dev": true,
2639 | "requires": {
2640 | "once": "^1.3.0",
2641 | "wrappy": "1"
2642 | }
2643 | },
2644 | "inherits": {
2645 | "version": "2.0.4",
2646 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2647 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2648 | "dev": true
2649 | },
2650 | "is-extglob": {
2651 | "version": "2.1.1",
2652 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2653 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
2654 | "dev": true
2655 | },
2656 | "is-fullwidth-code-point": {
2657 | "version": "3.0.0",
2658 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2659 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2660 | "dev": true
2661 | },
2662 | "is-glob": {
2663 | "version": "4.0.1",
2664 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
2665 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
2666 | "dev": true,
2667 | "requires": {
2668 | "is-extglob": "^2.1.1"
2669 | }
2670 | },
2671 | "is-number": {
2672 | "version": "7.0.0",
2673 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2674 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2675 | "dev": true
2676 | },
2677 | "isexe": {
2678 | "version": "2.0.0",
2679 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2680 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2681 | "dev": true
2682 | },
2683 | "js-tokens": {
2684 | "version": "4.0.0",
2685 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2686 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2687 | "dev": true
2688 | },
2689 | "js-yaml": {
2690 | "version": "3.13.1",
2691 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
2692 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
2693 | "dev": true,
2694 | "requires": {
2695 | "argparse": "^1.0.7",
2696 | "esprima": "^4.0.0"
2697 | }
2698 | },
2699 | "json-schema-traverse": {
2700 | "version": "0.4.1",
2701 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2702 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2703 | "dev": true
2704 | },
2705 | "json-stable-stringify-without-jsonify": {
2706 | "version": "1.0.1",
2707 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2708 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
2709 | "dev": true
2710 | },
2711 | "levn": {
2712 | "version": "0.4.1",
2713 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2714 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
2715 | "dev": true,
2716 | "requires": {
2717 | "prelude-ls": "^1.2.1",
2718 | "type-check": "~0.4.0"
2719 | }
2720 | },
2721 | "lodash.clonedeep": {
2722 | "version": "4.5.0",
2723 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
2724 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
2725 | "dev": true
2726 | },
2727 | "lodash.merge": {
2728 | "version": "4.6.2",
2729 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2730 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2731 | "dev": true
2732 | },
2733 | "lodash.truncate": {
2734 | "version": "4.4.2",
2735 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
2736 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
2737 | "dev": true
2738 | },
2739 | "lru-cache": {
2740 | "version": "6.0.0",
2741 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
2742 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
2743 | "dev": true,
2744 | "requires": {
2745 | "yallist": "^4.0.0"
2746 | }
2747 | },
2748 | "merge2": {
2749 | "version": "1.4.1",
2750 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2751 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2752 | "dev": true
2753 | },
2754 | "micromatch": {
2755 | "version": "4.0.4",
2756 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
2757 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
2758 | "dev": true,
2759 | "requires": {
2760 | "braces": "^3.0.1",
2761 | "picomatch": "^2.2.3"
2762 | }
2763 | },
2764 | "minimatch": {
2765 | "version": "3.0.4",
2766 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2767 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2768 | "dev": true,
2769 | "requires": {
2770 | "brace-expansion": "^1.1.7"
2771 | }
2772 | },
2773 | "ms": {
2774 | "version": "2.1.2",
2775 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2776 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2777 | "dev": true
2778 | },
2779 | "natural-compare": {
2780 | "version": "1.4.0",
2781 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2782 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2783 | "dev": true
2784 | },
2785 | "once": {
2786 | "version": "1.4.0",
2787 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2788 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2789 | "dev": true,
2790 | "requires": {
2791 | "wrappy": "1"
2792 | }
2793 | },
2794 | "optionator": {
2795 | "version": "0.9.1",
2796 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
2797 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
2798 | "dev": true,
2799 | "requires": {
2800 | "deep-is": "^0.1.3",
2801 | "fast-levenshtein": "^2.0.6",
2802 | "levn": "^0.4.1",
2803 | "prelude-ls": "^1.2.1",
2804 | "type-check": "^0.4.0",
2805 | "word-wrap": "^1.2.3"
2806 | }
2807 | },
2808 | "parent-module": {
2809 | "version": "1.0.1",
2810 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2811 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2812 | "dev": true,
2813 | "requires": {
2814 | "callsites": "^3.0.0"
2815 | }
2816 | },
2817 | "path-is-absolute": {
2818 | "version": "1.0.1",
2819 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2820 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2821 | "dev": true
2822 | },
2823 | "path-key": {
2824 | "version": "3.1.1",
2825 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2826 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2827 | "dev": true
2828 | },
2829 | "path-type": {
2830 | "version": "4.0.0",
2831 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2832 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2833 | "dev": true
2834 | },
2835 | "picomatch": {
2836 | "version": "2.3.0",
2837 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
2838 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
2839 | "dev": true
2840 | },
2841 | "prelude-ls": {
2842 | "version": "1.2.1",
2843 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2844 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2845 | "dev": true
2846 | },
2847 | "progress": {
2848 | "version": "2.0.3",
2849 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2850 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
2851 | "dev": true
2852 | },
2853 | "punycode": {
2854 | "version": "2.1.1",
2855 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2856 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2857 | "dev": true
2858 | },
2859 | "queue-microtask": {
2860 | "version": "1.2.3",
2861 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2862 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2863 | "dev": true
2864 | },
2865 | "regexpp": {
2866 | "version": "3.2.0",
2867 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
2868 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
2869 | "dev": true
2870 | },
2871 | "require-from-string": {
2872 | "version": "2.0.2",
2873 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
2874 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
2875 | "dev": true
2876 | },
2877 | "resolve-from": {
2878 | "version": "4.0.0",
2879 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2880 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2881 | "dev": true
2882 | },
2883 | "reusify": {
2884 | "version": "1.0.4",
2885 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2886 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2887 | "dev": true
2888 | },
2889 | "rimraf": {
2890 | "version": "3.0.2",
2891 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2892 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2893 | "dev": true,
2894 | "requires": {
2895 | "glob": "^7.1.3"
2896 | }
2897 | },
2898 | "run-parallel": {
2899 | "version": "1.2.0",
2900 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2901 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2902 | "dev": true,
2903 | "requires": {
2904 | "queue-microtask": "^1.2.2"
2905 | }
2906 | },
2907 | "shebang-command": {
2908 | "version": "2.0.0",
2909 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2910 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2911 | "dev": true,
2912 | "requires": {
2913 | "shebang-regex": "^3.0.0"
2914 | }
2915 | },
2916 | "shebang-regex": {
2917 | "version": "3.0.0",
2918 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2919 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2920 | "dev": true
2921 | },
2922 | "slash": {
2923 | "version": "3.0.0",
2924 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
2925 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
2926 | "dev": true
2927 | },
2928 | "slice-ansi": {
2929 | "version": "4.0.0",
2930 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
2931 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
2932 | "dev": true,
2933 | "requires": {
2934 | "ansi-styles": "^4.0.0",
2935 | "astral-regex": "^2.0.0",
2936 | "is-fullwidth-code-point": "^3.0.0"
2937 | },
2938 | "dependencies": {
2939 | "ansi-styles": {
2940 | "version": "4.3.0",
2941 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2942 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2943 | "dev": true,
2944 | "requires": {
2945 | "color-convert": "^2.0.1"
2946 | }
2947 | },
2948 | "color-convert": {
2949 | "version": "2.0.1",
2950 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2951 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2952 | "dev": true,
2953 | "requires": {
2954 | "color-name": "~1.1.4"
2955 | }
2956 | },
2957 | "color-name": {
2958 | "version": "1.1.4",
2959 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2960 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2961 | "dev": true
2962 | }
2963 | }
2964 | },
2965 | "sprintf-js": {
2966 | "version": "1.0.3",
2967 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2968 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2969 | "dev": true
2970 | },
2971 | "string-width": {
2972 | "version": "4.2.2",
2973 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
2974 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
2975 | "dev": true,
2976 | "requires": {
2977 | "emoji-regex": "^8.0.0",
2978 | "is-fullwidth-code-point": "^3.0.0",
2979 | "strip-ansi": "^6.0.0"
2980 | }
2981 | },
2982 | "strip-ansi": {
2983 | "version": "6.0.0",
2984 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2985 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2986 | "dev": true,
2987 | "requires": {
2988 | "ansi-regex": "^5.0.0"
2989 | }
2990 | },
2991 | "strip-json-comments": {
2992 | "version": "3.1.1",
2993 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2994 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2995 | "dev": true
2996 | },
2997 | "supports-color": {
2998 | "version": "5.5.0",
2999 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3000 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3001 | "dev": true,
3002 | "requires": {
3003 | "has-flag": "^3.0.0"
3004 | }
3005 | },
3006 | "table": {
3007 | "version": "6.7.1",
3008 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
3009 | "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
3010 | "dev": true,
3011 | "requires": {
3012 | "ajv": "^8.0.1",
3013 | "lodash.clonedeep": "^4.5.0",
3014 | "lodash.truncate": "^4.4.2",
3015 | "slice-ansi": "^4.0.0",
3016 | "string-width": "^4.2.0",
3017 | "strip-ansi": "^6.0.0"
3018 | },
3019 | "dependencies": {
3020 | "ajv": {
3021 | "version": "8.6.2",
3022 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
3023 | "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
3024 | "dev": true,
3025 | "requires": {
3026 | "fast-deep-equal": "^3.1.1",
3027 | "json-schema-traverse": "^1.0.0",
3028 | "require-from-string": "^2.0.2",
3029 | "uri-js": "^4.2.2"
3030 | }
3031 | },
3032 | "json-schema-traverse": {
3033 | "version": "1.0.0",
3034 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
3035 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
3036 | "dev": true
3037 | }
3038 | }
3039 | },
3040 | "text-table": {
3041 | "version": "0.2.0",
3042 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
3043 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
3044 | "dev": true
3045 | },
3046 | "to-regex-range": {
3047 | "version": "5.0.1",
3048 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3049 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3050 | "dev": true,
3051 | "requires": {
3052 | "is-number": "^7.0.0"
3053 | }
3054 | },
3055 | "tslib": {
3056 | "version": "1.14.1",
3057 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
3058 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
3059 | "dev": true
3060 | },
3061 | "type-check": {
3062 | "version": "0.4.0",
3063 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
3064 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
3065 | "dev": true,
3066 | "requires": {
3067 | "prelude-ls": "^1.2.1"
3068 | }
3069 | },
3070 | "type-fest": {
3071 | "version": "0.20.2",
3072 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
3073 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
3074 | "dev": true
3075 | },
3076 | "typescript": {
3077 | "version": "4.3.5",
3078 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
3079 | "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
3080 | "dev": true
3081 | },
3082 | "uri-js": {
3083 | "version": "4.4.1",
3084 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3085 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3086 | "dev": true,
3087 | "requires": {
3088 | "punycode": "^2.1.0"
3089 | }
3090 | },
3091 | "v8-compile-cache": {
3092 | "version": "2.3.0",
3093 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
3094 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
3095 | "dev": true
3096 | },
3097 | "which": {
3098 | "version": "2.0.2",
3099 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3100 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3101 | "dev": true,
3102 | "requires": {
3103 | "isexe": "^2.0.0"
3104 | }
3105 | },
3106 | "word-wrap": {
3107 | "version": "1.2.3",
3108 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
3109 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
3110 | "dev": true
3111 | },
3112 | "wrappy": {
3113 | "version": "1.0.2",
3114 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3115 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3116 | "dev": true
3117 | },
3118 | "yallist": {
3119 | "version": "4.0.0",
3120 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3121 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
3122 | "dev": true
3123 | }
3124 | }
3125 | }
3126 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vscode-android-webview-debug",
3 | "displayName": "Android WebView Debugging",
4 | "description": "Debug your JavaScript code running in WebViews on any Android device from VS Code.",
5 | "version": "1.2.3",
6 | "icon": "images/icon.png",
7 | "author": {
8 | "name": "Michael Potthoff"
9 | },
10 | "license": "LGPL-3.0",
11 | "repository": {
12 | "type": "git",
13 | "url": "https://github.com/mpotthoff/vscode-android-webview-debug"
14 | },
15 | "publisher": "mpotthoff",
16 | "bugs": {
17 | "url": "https://github.com/mpotthoff/vscode-android-webview-debug/issues"
18 | },
19 | "engines": {
20 | "vscode": "^1.53.0"
21 | },
22 | "categories": [
23 | "Debuggers"
24 | ],
25 | "keywords": [
26 | "android",
27 | "webview",
28 | "chrome",
29 | "debug",
30 | "debugging",
31 | "multi-root ready"
32 | ],
33 | "main": "./out/extension",
34 | "extensionKind": [
35 | "workspace"
36 | ],
37 | "activationEvents": [
38 | "onDebugInitialConfigurations",
39 | "onDebugResolve:android-webview"
40 | ],
41 | "contributes": {
42 | "configuration": {
43 | "type": "object",
44 | "title": "Android WebView Debugging",
45 | "properties": {
46 | "android-webview-debug.adbPath": {
47 | "type": "string",
48 | "default": "adb",
49 | "description": "Specifies the path to the ADB executable."
50 | },
51 | "android-webview-debug.adbArgs": {
52 | "type": "array",
53 | "items": {
54 | "type": "string"
55 | },
56 | "default": [],
57 | "description": "Specifies extra arguments for the ADB executable."
58 | }
59 | }
60 | },
61 | "debuggers": [
62 | {
63 | "type": "android-webview",
64 | "label": "Android WebView",
65 | "configurationAttributes": {
66 | "attach": {
67 | "required": [],
68 | "properties": {
69 | "device": {
70 | "type": "string",
71 | "description": "The serial of the device to attach to.",
72 | "default": "A1B2C3D4E5F6"
73 | },
74 | "application": {
75 | "type": "string",
76 | "description": "The package name of the application to attach to.",
77 | "default": "com.example.app"
78 | },
79 | "port": {
80 | "type": "number",
81 | "default": 9222
82 | },
83 | "connectTimeout": {
84 | "type": "number",
85 | "description": "The time the extension will wait for the webview to be ready in milliseconds.",
86 | "default": 0
87 | }
88 | }
89 | }
90 | },
91 | "initialConfigurations": [
92 | {
93 | "type": "android-webview",
94 | "request": "attach",
95 | "name": "Attach to Android WebView",
96 | "webRoot": "${workspaceFolder}"
97 | }
98 | ],
99 | "configurationSnippets": [
100 | {
101 | "label": "Android WebView: Attach",
102 | "description": "Attach to an Android WebView",
103 | "body": {
104 | "type": "android-webview",
105 | "request": "attach",
106 | "name": "${1:Attach to Android WebView}",
107 | "webRoot": "^\"${2:\\${workspaceFolder\\}}\""
108 | }
109 | }
110 | ]
111 | }
112 | ]
113 | },
114 | "scripts": {
115 | "vscode:prepublish": "npm run compile",
116 | "lint": "eslint .",
117 | "compile": "tsc -p ./",
118 | "watch": "tsc -watch -p ./"
119 | },
120 | "devDependencies": {
121 | "@types/node": "12.20.15",
122 | "@types/vscode": "1.53.0",
123 | "@typescript-eslint/eslint-plugin": "4.29.0",
124 | "@typescript-eslint/parser": "4.29.0",
125 | "eslint": "7.32.0",
126 | "typescript": "4.3.5"
127 | },
128 | "extensionDependencies": [
129 | "ms-vscode.js-debug"
130 | ]
131 | }
132 |
--------------------------------------------------------------------------------
/src/adb.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as child_process from "child_process";
21 |
22 | export type DeviceState = "device" | "connecting" | "offline" | "unknown" | "bootloader" | "recovery" | "download" | "unauthorized" | "host" | "no permissions";
23 |
24 | export interface Device {
25 | serial: string;
26 | state: DeviceState;
27 | usb?: string;
28 | product?: string;
29 | model?: string;
30 | device?: string;
31 | features?: string;
32 | transportId?: string;
33 | }
34 |
35 | export interface ForwardedSocket {
36 | local: string;
37 | remote: string;
38 | }
39 |
40 | export interface AdbOptions {
41 | executable: string;
42 | arguments: string[];
43 | }
44 |
45 | export interface ShellOptions extends AdbOptions {
46 | serial: string;
47 | command: string;
48 | }
49 |
50 | export interface ForwardOptions extends AdbOptions {
51 | serial: string;
52 | local: string;
53 | remote: string;
54 | }
55 |
56 | export interface UnforwardOptions extends AdbOptions {
57 | local: string;
58 | }
59 |
60 | function adb(options: AdbOptions, ...args: string[]): Promise {
61 | return new Promise((resolve, reject) => {
62 | let outBuff = Buffer.alloc(0);
63 | let errBuff = Buffer.alloc(0);
64 |
65 | const process = child_process.spawn(options.executable, [...options.arguments, ...args]);
66 |
67 | process.stdout.on("data", (data) => {
68 | outBuff = Buffer.concat([outBuff, Buffer.from(data)]);
69 | });
70 | process.stderr.on("data", (data) => {
71 | errBuff = Buffer.concat([errBuff, Buffer.from(data)]);
72 | });
73 |
74 | process.on("error", (err) => {
75 | reject(err);
76 | });
77 | process.on("close", (code) => {
78 | if (code !== 0) {
79 | reject(new Error(errBuff.toString("UTF-8")));
80 | }
81 |
82 | resolve(outBuff.toString("UTF-8"));
83 | });
84 | });
85 | }
86 |
87 | export async function version(options: AdbOptions): Promise {
88 | return await adb(options, "version");
89 | }
90 |
91 | export async function devices(options: AdbOptions): Promise {
92 | const output = await adb(options, "devices", "-l");
93 |
94 | const result: Device[] = [];
95 |
96 | const regex = /^([a-zA-Z0-9_-]+(?:\s?[\.a-zA-Z0-9_-]+)?(?:\:\d{1,})?)\s+(device|connecting|offline|unknown|bootloader|recovery|download|unauthorized|host|no permissions)(?:(?:\s+usb:([^:]+))|(?:\s+([0-9]+\-[0-9]+(?:\.[0-9]+)*)))?(?:\s+product:([^:]+))?(?:\s+model\:([\S]+))?(?:\s+device\:([\S]+))?(?:\s+features:([^:]+))?(?:\s+transport_id:([^:]+))?$/gim;
97 | let match;
98 | while ((match = regex.exec(output)) !== null) {
99 | result.push({
100 | serial: match[1],
101 | state: match[2] as DeviceState,
102 | usb: match[3] || match[4],
103 | product: match[5],
104 | model: match[6],
105 | device: match[7],
106 | features: match[8],
107 | transportId: match[9]
108 | });
109 | }
110 |
111 | return result;
112 | }
113 |
114 | export async function shell(options: ShellOptions): Promise {
115 | return await adb(options, "-s", options.serial, "shell", options.command);
116 | }
117 |
118 | export async function forward(options: ForwardOptions): Promise {
119 | const output = await adb(options, "-s", options.serial, "forward", options.local, options.remote);
120 |
121 | if (options.local === "tcp:0") {
122 | return {
123 | local: `tcp:${parseInt(output.trim(), 10)}`,
124 | remote: options.remote
125 | };
126 | } else {
127 | return {
128 | local: options.local,
129 | remote: options.remote
130 | };
131 | }
132 | }
133 |
134 | export async function unforward(options: UnforwardOptions): Promise {
135 | await adb(options, "forward", "--remove", options.local);
136 | }
137 |
--------------------------------------------------------------------------------
/src/bridge.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as os from "os";
21 | import * as path from "path";
22 |
23 | import * as vscode from "vscode";
24 |
25 | import * as adb from "./adb";
26 | import * as http from "./http";
27 |
28 | export type Device = adb.Device;
29 |
30 | export type WebViewType = "chrome" | "webview" | "crosswalk" | "unknown";
31 |
32 | export interface WebView {
33 | device: Device;
34 | socket: string;
35 | type: WebViewType;
36 | packageName?: string;
37 | versionName?: string;
38 | }
39 |
40 | export interface WebViewPage {
41 | url: string;
42 | title: string;
43 | webSocketDebuggerUrl: string;
44 | }
45 |
46 | interface Process {
47 | pid: number;
48 | name: string;
49 | }
50 |
51 | interface Package {
52 | packageName: string;
53 | versionName: string;
54 | }
55 |
56 | function resolvePath(from: string): string {
57 | const substituted = from.replace(
58 | /(?:^(~|\.{1,2}))(?=\/)|\$(\w+)/g,
59 | (_, tilde?: string, env?: string) => {
60 | // $HOME/adb -> /Users//adb
61 | if (env) return process.env[env] ?? "";
62 |
63 | // ~/adb -> /Users//adb
64 | if (tilde === "~") return os.homedir();
65 |
66 | const fsPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
67 | if (!fsPath) return "";
68 |
69 | // ./adb -> /adb
70 | if (tilde === ".") return fsPath;
71 |
72 | // ../adb -> /../adb
73 | if (tilde === "..") return fsPath + "/..";
74 |
75 | return "";
76 | }
77 | );
78 |
79 | if (substituted.includes("/")) {
80 | // Resolve the path if it contains a path seperator.
81 | return path.resolve(substituted);
82 | } else {
83 | // Otherwise we treat it as a command that exists in PATH.
84 | return substituted;
85 | }
86 | }
87 |
88 | function getAdbExecutable(): string {
89 | const adbPath = vscode.workspace
90 | .getConfiguration("android-webview-debug")
91 | .get("adbPath");
92 |
93 | if (adbPath) {
94 | return resolvePath(adbPath);
95 | } else {
96 | return "adb";
97 | }
98 | }
99 |
100 | function getAdbArguments(): string[] {
101 | const adbArgs = vscode.workspace
102 | .getConfiguration("android-webview-debug")
103 | .get("adbArgs");
104 |
105 | if (adbArgs) {
106 | return adbArgs;
107 | } else {
108 | return [];
109 | }
110 | }
111 |
112 | export async function test(): Promise {
113 | try {
114 | await adb.version({
115 | executable: getAdbExecutable(),
116 | arguments: getAdbArguments()
117 | });
118 | } catch (err: unknown) {
119 | if ((err as NodeJS.ErrnoException | undefined)?.code === "ENOENT") {
120 | throw new Error("Failed to locate ADB executable.");
121 | }
122 |
123 | throw err;
124 | }
125 | }
126 |
127 | export async function findDevices(): Promise {
128 | return await adb.devices({
129 | executable: getAdbExecutable(),
130 | arguments: getAdbArguments()
131 | });
132 | }
133 |
134 | async function getSockets(serial: string): Promise {
135 | const output = await adb.shell({
136 | executable: getAdbExecutable(),
137 | arguments: getAdbArguments(),
138 | serial: serial,
139 | command: "cat /proc/net/unix"
140 | });
141 |
142 | /**
143 | * Parse 'cat /proc/net/unix' output which on Android looks like this:
144 | *
145 | * Num RefCount Protocol Flags Type St Inode Path
146 | * 0000000000000000: 00000002 00000000 00010000 0001 01 27955 /data/fpc/oem
147 | * 0000000000000000: 00000002 00000000 00010000 0001 01 3072 @chrome_devtools_remote
148 | *
149 | * We need to find records with paths starting from '@' (abstract socket)
150 | * and containing the channel pattern ("_devtools_remote").
151 | */
152 |
153 | const result: string[] = [];
154 |
155 | for (const line of output.split(/[\r\n]+/g)) {
156 | const columns = line.split(/\s+/g);
157 | if (columns.length < 8) {
158 | continue;
159 | }
160 |
161 | if (columns[3] !== "00010000" || columns[5] !== "01") {
162 | continue;
163 | }
164 |
165 | const colPath = columns[7];
166 | if (!colPath.startsWith("@") || !colPath.includes("_devtools_remote")) {
167 | continue;
168 | }
169 |
170 | result.push(colPath.substr(1));
171 | }
172 |
173 | return result;
174 | }
175 |
176 | async function getProcesses(serial: string): Promise {
177 | const output = await adb.shell({
178 | executable: getAdbExecutable(),
179 | arguments: getAdbArguments(),
180 | serial: serial,
181 | command: "ps"
182 | });
183 |
184 | /**
185 | * Parse 'ps' output which on Android looks like this:
186 | *
187 | * USER PID PPID VSZ RSS WCHAN ADDR S NAME
188 | * root 1 0 24128 1752 0 0 S init
189 | * u0_a100 22100 1307 1959228 128504 0 0 S com.android.chrome
190 | */
191 |
192 | const result: Process[] = [];
193 |
194 | for (const line of output.split(/[\r\n]+/g)) {
195 | const columns = line.split(/\s+/g);
196 | if (columns.length < 9) {
197 | continue;
198 | }
199 |
200 | const pid = parseInt(columns[1], 10);
201 | if (isNaN(pid)) {
202 | continue;
203 | }
204 |
205 | result.push({
206 | pid: pid,
207 | name: columns[8]
208 | });
209 | }
210 |
211 | return result;
212 | }
213 |
214 | async function getPackages(serial: string): Promise {
215 | const output = await adb.shell({
216 | executable: getAdbExecutable(),
217 | arguments: getAdbArguments(),
218 | serial: serial,
219 | command: "dumpsys package packages"
220 | });
221 |
222 | /**
223 | * Parse 'dumpsys package packages' output which on Android looks like this:
224 | *
225 | * Packages:
226 | * Package [com.android.chrome] (76d4737):
227 | * userId=10100
228 | * pkg=Package{3e86c27 com.android.chrome}
229 | * codePath=/data/app/com.android.chrome-MMpc6mFfM3KpEYJ7RaZaTA==
230 | * resourcePath=/data/app/com.android.chrome-MMpc6mFfM3KpEYJ7RaZaTA==
231 | * legacyNativeLibraryDir=/data/app/com.android.chrome-MMpc6mFfM3KpEYJ7RaZaTA==/lib
232 | * primaryCpuAbi=armeabi-v7a
233 | * secondaryCpuAbi=arm64-v8a
234 | * versionCode=344009152 minSdk=24 targetSdk=28
235 | * versionName=68.0.3440.91
236 | */
237 |
238 | const result: Package[] = [];
239 |
240 | let packageName: string | undefined;
241 |
242 | for (const line of output.split(/[\r\n]+/g)) {
243 | const columns = line.trim().split(/\s+/g);
244 |
245 | if (!packageName) {
246 | if (columns[0] === "Package") {
247 | packageName = columns[1].substring(1, columns[1].length - 1);
248 | }
249 | } else {
250 | if (columns[0].startsWith("versionName=")) {
251 | result.push({
252 | packageName: packageName,
253 | versionName: columns[0].substr(12)
254 | });
255 |
256 | packageName = undefined;
257 | }
258 | }
259 | }
260 |
261 | return result;
262 | }
263 |
264 | export async function findWebViews(device: Device): Promise {
265 | const [
266 | sockets,
267 | processes,
268 | packages
269 | ] = await Promise.all([
270 | getSockets(device.serial),
271 | getProcesses(device.serial),
272 | getPackages(device.serial)
273 | ]);
274 |
275 | const result: WebView[] = [];
276 |
277 | for (const socket of sockets) {
278 | let type: WebViewType;
279 | let packageName: string | undefined;
280 | let versionName: string | undefined;
281 |
282 | if (socket === "chrome_devtools_remote") {
283 | type = "chrome";
284 | packageName = "com.android.chrome";
285 | } else if (socket.startsWith("webview_devtools_remote_")) {
286 | type = "webview";
287 |
288 | const pid = parseInt(socket.substr(24), 10);
289 | if (!isNaN(pid)) {
290 | const process = processes.find((el) => el.pid === pid);
291 | if (process) {
292 | packageName = process.name;
293 | }
294 | }
295 | } else if (socket.endsWith("_devtools_remote")) {
296 | type = "crosswalk";
297 | packageName = socket.substring(0, socket.length - 16) || undefined;
298 | } else {
299 | type = "unknown";
300 | }
301 |
302 | if (packageName) {
303 | const aPackage = packages.find((el) => el.packageName === packageName);
304 | if (aPackage) {
305 | versionName = aPackage.versionName;
306 | }
307 | }
308 |
309 | result.push({
310 | device: device,
311 | socket: socket,
312 | type: type,
313 | packageName: packageName,
314 | versionName: versionName
315 | });
316 | }
317 |
318 | return result;
319 | }
320 |
321 | const forwardedSockets: adb.ForwardedSocket[] = [];
322 |
323 | export async function forwardDebugger(application: WebView, port?: number): Promise {
324 | if (port) {
325 | const idx = forwardedSockets.findIndex((el) => el.local === `tcp:${port}`);
326 | if (idx >= 0) {
327 | forwardedSockets.splice(idx, 1);
328 |
329 | try {
330 | await adb.unforward({
331 | executable: getAdbExecutable(),
332 | arguments: getAdbArguments(),
333 | local: `tcp:${port}`
334 | });
335 | } catch {
336 | // Ignore
337 | }
338 | }
339 | }
340 |
341 | const socket = await adb.forward({
342 | executable: getAdbExecutable(),
343 | arguments: getAdbArguments(),
344 | serial: application.device.serial,
345 | local: `tcp:${port || 0}`,
346 | remote: `localabstract:${application.socket}`
347 | });
348 |
349 | forwardedSockets.push(socket);
350 |
351 | return parseInt(socket.local.substr(4), 10);
352 | }
353 |
354 | export async function unforwardDebuggers(): Promise {
355 | const promises: Promise[] = [];
356 |
357 | for (const socket of forwardedSockets) {
358 | const promise = adb.unforward({
359 | executable: getAdbExecutable(),
360 | arguments: getAdbArguments(),
361 | local: socket.local
362 | });
363 | promises.push(promise.catch(() => { /* Ignore */ }));
364 | }
365 |
366 | await Promise.all(promises);
367 |
368 | forwardedSockets.splice(0);
369 | }
370 |
371 | export async function getWebViewPages(port: number): Promise {
372 | return JSON.parse(await http.get(`http://127.0.0.1:${port}/json/list`)) as WebViewPage[];
373 | }
374 |
--------------------------------------------------------------------------------
/src/debugConfigurationProvider.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as vscode from "vscode";
21 |
22 | import * as bridge from "./bridge";
23 | import * as tasks from "./tasks";
24 | import * as ui from "./ui";
25 |
26 | export class DebugConfigurationProvider implements vscode.DebugConfigurationProvider {
27 | public async resolveDebugConfiguration?(folder: vscode.WorkspaceFolder | undefined, debugConfiguration: vscode.DebugConfiguration, token?: vscode.CancellationToken): Promise {
28 | if (!debugConfiguration.type || !debugConfiguration.request) {
29 | // Empty configurations are unsupported
30 | return null;
31 | }
32 |
33 | if (debugConfiguration.request !== "attach") {
34 | // Only attach is supported right now
35 | return null;
36 | }
37 |
38 | if (debugConfiguration.preLaunchTask) {
39 | // Workaround for a configured preLaunchTask.
40 | // The debug configuration is resolved before the preLaunchTask gets executed.
41 | // This means the debugging connection would be established before the task gets executed,
42 | // which would prevent the task from deploying the application.
43 |
44 | const task = await tasks.findTask(debugConfiguration.preLaunchTask);
45 | if (!task) {
46 | let item;
47 | if (typeof debugConfiguration.preLaunchTask === "string") {
48 | item = await vscode.window.showErrorMessage(`Could not find the task '${debugConfiguration.preLaunchTask}'.`, {
49 | modal: true
50 | }, "Debug Anyway", "Configure Task", "Open launch.json");
51 | } else {
52 | item = await vscode.window.showErrorMessage("Could not find the specified task.", {
53 | modal: true
54 | }, "Debug Anyway", "Configure Task", "Open launch.json");
55 | }
56 |
57 | if (item === "Debug Anyway") {
58 | // Continue
59 | } else if (item === "Configure Task") {
60 | vscode.commands.executeCommand("workbench.action.tasks.configureTaskRunner");
61 | return undefined;
62 | } else if (item === "Open launch.json") {
63 | return null;
64 | } else {
65 | return undefined;
66 | }
67 | } else {
68 | const result = await tasks.executeTask(task);
69 | if (!result) {
70 | return undefined;
71 | }
72 | }
73 |
74 | delete debugConfiguration.preLaunchTask;
75 | }
76 |
77 | const useNewDebugger = vscode.workspace.getConfiguration("debug.javascript").get("usePreview") ?? true;
78 |
79 | // Rewrite type to chrome
80 | debugConfiguration.type = useNewDebugger ? "pwa-chrome" : "chrome";
81 |
82 | // Test the bridge to ensure that the required executables exist
83 | await bridge.test();
84 |
85 | return await vscode.window.withProgress({
86 | location: vscode.ProgressLocation.Notification
87 | }, async (progress) => {
88 | let device: bridge.Device | undefined;
89 | let webView: bridge.WebView | undefined;
90 |
91 | progress.report({ message: "Loading devices..." });
92 |
93 | // Find the connected devices
94 | const devices = await bridge.findDevices();
95 | if (devices.length < 1) {
96 | vscode.window.showErrorMessage(`No devices found`);
97 | return undefined;
98 | }
99 |
100 | if (debugConfiguration.device) {
101 | // Try to find the configured device
102 | const found = devices.find((el) => el.serial === debugConfiguration.device);
103 | if (!found) {
104 | vscode.window.showErrorMessage(`Device '${debugConfiguration.device as string}' not found`);
105 | return undefined;
106 | }
107 |
108 | device = found;
109 | }
110 |
111 | if (!device) {
112 | if (debugConfiguration.application) {
113 | progress.report({ message: "Loading WebViews..." });
114 |
115 | const webViews = await withTimeoutRetries(debugConfiguration.connectTimeout ?? 0, 500, async () => {
116 | // Find all devices that have the application running
117 | const promises = devices.map(async (dev) => {
118 | const webViews = await bridge.findWebViews(dev).catch((err: Error): bridge.WebView[] => {
119 | vscode.window.showWarningMessage(err.message);
120 | return [];
121 | });
122 | return webViews.find((el) => el.packageName === debugConfiguration.application);
123 | });
124 | const result = await Promise.all(promises);
125 |
126 | const filtered = result.filter((el) => el ? true : false) as bridge.WebView[];
127 | if (filtered.length < 1) {
128 | return undefined;
129 | }
130 |
131 | return filtered;
132 | });
133 |
134 | if (!webViews || webViews.length < 1) {
135 | vscode.window.showErrorMessage(`No matching WebViews found on any device`);
136 | return undefined;
137 | }
138 |
139 | if (webViews.length === 1) {
140 | device = webViews[0].device;
141 | webView = webViews[0];
142 | } else {
143 | // Ask the user to select a device
144 | const filteredDevices = Array.from(new Set(webViews.map((el) => el.device)));
145 | const pickedDevice = await ui.pickDevice(filteredDevices);
146 | if (!pickedDevice) {
147 | return undefined;
148 | }
149 |
150 | device = pickedDevice;
151 |
152 | const filtered = webViews.filter((el) => el.device === pickedDevice);
153 | if (filtered.length < 1) {
154 | return undefined;
155 | }
156 |
157 | if (filtered.length > 1) {
158 | // Ask the user to select a webview
159 | const pickedWebView = await ui.pickWebView(webViews);
160 | if (!pickedWebView) {
161 | return undefined;
162 | }
163 |
164 | webView = pickedWebView;
165 | } else {
166 | webView = filtered[0];
167 | }
168 | }
169 | } else {
170 | // Ask the user to select a connected device
171 | const pickedDevice = await ui.pickDevice(devices);
172 | if (!pickedDevice) {
173 | return undefined;
174 | }
175 |
176 | device = pickedDevice;
177 | }
178 | }
179 |
180 | if (!webView) {
181 | progress.report({ message: "Loading WebViews..." });
182 |
183 | const webViews = await withTimeoutRetries(debugConfiguration.connectTimeout ?? 0, 500, async () => {
184 | // Find the running applications
185 | const webViews = await bridge.findWebViews(device!);
186 | if (webViews.length < 1) {
187 | return undefined;
188 | }
189 |
190 | if (debugConfiguration.application) {
191 | // Try to find the configured application
192 | const filtered = webViews.filter((el) => el.packageName === debugConfiguration.application);
193 | if (filtered.length < 1) {
194 | return undefined;
195 | }
196 |
197 | return filtered;
198 | } else {
199 | return webViews;
200 | }
201 | });
202 |
203 | if (!webViews || webViews.length < 1) {
204 | vscode.window.showErrorMessage(`No matching WebViews found`);
205 | return undefined;
206 | }
207 |
208 | // Ask the user to select a webview
209 | const pickedWebView = await ui.pickWebView(webViews);
210 | if (!pickedWebView) {
211 | return undefined;
212 | }
213 |
214 | webView = pickedWebView;
215 | }
216 |
217 | progress.report({ message: "Forwarding debugger..." });
218 |
219 | // Forward the debugger to the local port
220 | debugConfiguration.port = await bridge.forwardDebugger(webView, debugConfiguration.port);
221 | debugConfiguration.browserAttachLocation = "workspace";
222 |
223 | // In case the old debugger is used and neither url and urlFilter are configured we are going to try and
224 | // retrieve the list of available pages. If more than one is available we will allow the user to choose one to debug.
225 | if (!useNewDebugger && !debugConfiguration.url && !debugConfiguration.urlFilter) {
226 | try {
227 | const pages = await bridge.getWebViewPages(debugConfiguration.port);
228 | if (pages.length > 1) {
229 | const picked = await ui.pickWebViewPage(pages);
230 | if (!picked) {
231 | return undefined;
232 | }
233 |
234 | debugConfiguration.websocketUrl = picked.webSocketDebuggerUrl;
235 | }
236 | } catch (err) {
237 | console.error(err);
238 | }
239 | }
240 |
241 | vscode.window.showInformationMessage(`Connected to ${webView.packageName ?? "unknown"} on ${webView.device.serial}`);
242 |
243 | return debugConfiguration;
244 | });
245 | }
246 | }
247 |
248 | function withTimeoutRetries(timeout: number, interval: number, func: () => Promise): Promise {
249 | const startTime = new Date().valueOf();
250 |
251 | const run = async (): Promise => {
252 | const result = await func();
253 | if (result || startTime + timeout <= new Date().valueOf()) {
254 | return result;
255 | }
256 |
257 | await new Promise((resolve) => setTimeout(resolve, interval));
258 |
259 | return run();
260 | };
261 |
262 | return run();
263 | }
264 |
--------------------------------------------------------------------------------
/src/extension.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as vscode from "vscode";
21 |
22 | import * as bridge from "./bridge";
23 | import { DebugConfigurationProvider } from "./debugConfigurationProvider";
24 |
25 | export function activate(context: vscode.ExtensionContext): void {
26 | context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("android-webview", new DebugConfigurationProvider()));
27 | context.subscriptions.push(vscode.debug.onDidTerminateDebugSession(bridge.unforwardDebuggers));
28 | }
29 |
30 | export async function deactivate(): Promise {
31 | await bridge.unforwardDebuggers();
32 | }
33 |
--------------------------------------------------------------------------------
/src/http.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import { request } from "http";
21 |
22 | export function get(url: string): Promise {
23 | return new Promise((resolve, reject) => {
24 | let data = "";
25 | const req = request(url, (res) => {
26 | res.on("data", (chunk) => {
27 | data += chunk;
28 | });
29 | res.on("error", reject);
30 | res.on("close", () => resolve(data));
31 | });
32 | req.on("error", reject);
33 | req.end();
34 | });
35 | }
36 |
--------------------------------------------------------------------------------
/src/tasks.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as vscode from "vscode";
21 |
22 | export async function findTask(name: string): Promise {
23 | const tasks = await vscode.tasks.fetchTasks();
24 | return tasks.find((task) => task.name === name);
25 | }
26 |
27 | export async function executeTask(task: vscode.Task): Promise {
28 | const activeTask = vscode.tasks.taskExecutions.find((t) => t.task.name === task.name);
29 | if (activeTask && activeTask.task.isBackground) {
30 | return true;
31 | }
32 |
33 | return new Promise((resolve, reject) => {
34 | let execution: vscode.TaskExecution | undefined;
35 | vscode.tasks.executeTask(task).then((exec) => {
36 | execution = exec;
37 | });
38 |
39 | if (task.isBackground) {
40 | resolve(true);
41 | } else {
42 | const endEvent = vscode.tasks.onDidEndTask((e) => {
43 | if (e.execution === execution) {
44 | endEvent.dispose();
45 |
46 | resolve(true);
47 | }
48 | });
49 | }
50 | });
51 | }
52 |
--------------------------------------------------------------------------------
/src/ui.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2018-2024 Michael Potthoff
3 | *
4 | * This file is part of vscode-android-webview-debug.
5 | *
6 | * vscode-android-webview-debug is free software: you can redistribute it and/or modify
7 | * it under the terms of the GNU Lesser General Public License as published by
8 | * the Free Software Foundation, either version 3 of the License, or
9 | * (at your option) any later version.
10 | *
11 | * vscode-android-webview-debug is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU Lesser General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Lesser General Public License
17 | * along with vscode-android-webview-debug. If not, see .
18 | */
19 |
20 | import * as vscode from "vscode";
21 |
22 | import * as bridge from "./bridge";
23 |
24 | interface DeviceQuickPickItem extends vscode.QuickPickItem {
25 | device: bridge.Device;
26 | }
27 |
28 | interface WebViewQuickPickItem extends vscode.QuickPickItem {
29 | webView: bridge.WebView;
30 | }
31 |
32 | interface PageQuickPickItem extends vscode.QuickPickItem {
33 | page: bridge.WebViewPage;
34 | }
35 |
36 | export async function pickDevice(devices: bridge.Device[]): Promise {
37 | const items = devices.map((device): DeviceQuickPickItem => {
38 | return {
39 | label: device.model || device.state,
40 | description: device.serial,
41 | device: device
42 | };
43 | });
44 |
45 | const item = await vscode.window.showQuickPick(items, {
46 | placeHolder: "Select a device"
47 | });
48 |
49 | if (!item) {
50 | return undefined;
51 | }
52 |
53 | return item.device;
54 | }
55 |
56 | export async function pickWebView(webViews: bridge.WebView[]): Promise {
57 | const items = webViews.map((application): WebViewQuickPickItem => {
58 | let label: string;
59 | if (application.type === "chrome") {
60 | label = "Chrome";
61 | } else {
62 | if (application.type === "webview") {
63 | label = "WebView ";
64 | } else if (application.type === "crosswalk") {
65 | label = "Crosswalk ";
66 | } else {
67 | label = "";
68 | }
69 |
70 | if (application.packageName) {
71 | label += application.packageName;
72 | } else {
73 | label += application.socket;
74 | }
75 | }
76 |
77 | return {
78 | label: label,
79 | description: application.versionName,
80 | webView: application
81 | };
82 | });
83 |
84 | const item = await vscode.window.showQuickPick(items, {
85 | placeHolder: "Select a WebView"
86 | });
87 |
88 | if (!item) {
89 | return undefined;
90 | }
91 |
92 | return item.webView;
93 | }
94 |
95 | export async function pickWebViewPage(pages: bridge.WebViewPage[]): Promise {
96 | const items = pages.map((page): PageQuickPickItem => {
97 | return {
98 | label: page.title,
99 | description: page.url,
100 | page: page
101 | };
102 | });
103 |
104 | const item = await vscode.window.showQuickPick(items, {
105 | placeHolder: "Select a page"
106 | });
107 |
108 | if (!item) {
109 | return undefined;
110 | }
111 |
112 | return item.page;
113 | }
114 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "rootDir": "src",
4 | "outDir": "out",
5 | "module": "commonjs",
6 | "target": "es6",
7 | "lib": [ "es6" ],
8 | "strict": true,
9 | "noImplicitReturns": true,
10 | "noEmitOnError": true,
11 | "sourceMap": true
12 | },
13 | "exclude": [
14 | "node_modules",
15 | ".vscode-test"
16 | ]
17 | }
--------------------------------------------------------------------------------