├── .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 | logo 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 | GitHub Release 14 | Visual Studio Marketplace Release 15 | GitHub Actions Build Status 16 | License 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 | ![Demo](images/demo.gif) 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 | } --------------------------------------------------------------------------------