From faaf0fbe6f957f937b0b6a29e89718b736d3c5c6 Mon Sep 17 00:00:00 2001 From: "Brian V. Hughes" Date: Thu, 15 Jul 2021 16:30:21 -0700 Subject: [PATCH] Initial commit --- .env.sample | 6 + .eslintrc.json | 21 + .github/workflows/node.js.yml | 24 + .gitignore | 5 + .nvmrc | 1 + LICENSE | 339 + README.md | 26 + package-lock.json | 8903 ++++++++++++++++++++++++++ package.json | 49 + resources/blinkhash-logo-circle.png | Bin 0 -> 17996 bytes resources/blinkhash-logo-text.png | Bin 0 -> 38875 bytes resources/blinkhash-logo-text2.png | Bin 0 -> 36083 bytes resources/blinkhash-logo-text3.png | Bin 0 -> 61874 bytes resources/blinkhash-logo-trimmed.png | Bin 0 -> 4764 bytes resources/blinkhash-logo.png | Bin 0 -> 5293 bytes scripts/algorithms.js | 32 + scripts/blocks.js | 162 + scripts/candidates.js | 145 + scripts/daemon.js | 178 + scripts/difficulty.js | 124 + scripts/index.js | 22 + scripts/manager.js | 242 + scripts/merkle.js | 40 + scripts/miner-id.js | 71 + scripts/peer.js | 253 + scripts/pool.js | 663 ++ scripts/stratum.js | 481 ++ scripts/transactions.js | 107 + scripts/util.js | 301 + test/merkle_test.js | 20 + 30 files changed, 12215 insertions(+) create mode 100644 .env.sample create mode 100644 .eslintrc.json create mode 100644 .github/workflows/node.js.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 resources/blinkhash-logo-circle.png create mode 100644 resources/blinkhash-logo-text.png create mode 100644 resources/blinkhash-logo-text2.png create mode 100644 resources/blinkhash-logo-text3.png create mode 100644 resources/blinkhash-logo-trimmed.png create mode 100644 resources/blinkhash-logo.png create mode 100644 scripts/algorithms.js create mode 100644 scripts/blocks.js create mode 100644 scripts/candidates.js create mode 100644 scripts/daemon.js create mode 100644 scripts/difficulty.js create mode 100644 scripts/index.js create mode 100644 scripts/manager.js create mode 100644 scripts/merkle.js create mode 100644 scripts/miner-id.js create mode 100644 scripts/peer.js create mode 100644 scripts/pool.js create mode 100644 scripts/stratum.js create mode 100644 scripts/transactions.js create mode 100644 scripts/util.js create mode 100644 test/merkle_test.js diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..5c2dd47 --- /dev/null +++ b/.env.sample @@ -0,0 +1,6 @@ +PREV_MINERID_PK=cRKcg5RGqyFUtGe2o1hPPn2CHYhBxQhRUNSCsP3hEn9ak7tv9Spr +MINERID_PK=cRKcg5RGqyFUtGe2o1hPPn2CHYhBxQhRUNSCsP3hEn9ak7tv9Spr +VCTX=09aa21bb5484c500a3bb40b0df7644e794c6c9ab35e7db151d85992a59423194 +MINERID_NAME=CylonJager +MINERID_EMAIL=n/a +MINERID_MAPI=api.demo.com diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..419ef6c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "env": { + "browser": true, + "commonjs": true, + "es2021": true + }, + "extends": [ + "airbnb-base" + ], + "parserOptions": { + "ecmaVersion": 12 + }, + "rules": { + "func-names": ["error", "never"], + "no-bitwise": "off", + "no-console": "off", + "no-param-reassign": "off", + "no-underscore-dangle": "off", + "comma-dangle": ["error", "only-multiline"] + } +} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..67a8fcc --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,24 @@ +name: Node.js CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build --if-present + - run: npm test + env: + CI: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d65be5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +.env +.nyc_output/ +coverage/ +npm-debug.log diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..82f87fa --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v12.18.4 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d7f1051 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b17cbf --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ + + +
+ + Status + + + GNU License + +
+ + +
+

+ + + +

+ + + +

Carrot Pool Stratum

+ +

+ High-performance, SHA-256 Stratum Protocol Server +

diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..226889d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8903 @@ +{ + "name": "carrot-pool-stratum", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.1.0", + "license": "GPL-2.0", + "dependencies": { + "async": "1.5.2", + "base58-native": "0.1.4", + "bignum": "^0.13.1", + "bitcoinjs-lib": "^5.2.0", + "bsv": "^1.5.4", + "dotenv": "^8.2.0", + "promise": "^8.1.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^7.10.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.22.1", + "mocha": "^8.1.3", + "nyc": "^15.1.0", + "sinon": "^9.2.0" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.2.0.tgz", + "integrity": "sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "node_modules/acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-includes/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flat/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.map/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base58-native": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base58-native/-/base58-native-0.1.4.tgz", + "integrity": "sha1-u5I0qN8mYtBLC3Fa7uH4mxX+8TQ=", + "dependencies": { + "bignum": ">=0.6.1" + } + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/bignum": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/bignum/-/bignum-0.13.1.tgz", + "integrity": "sha512-sPtvw/knt6nmBm4fPgsu+FtNypM5y2Org723h9fAOl7UDgc8nyIbVbcBCatVR/nOJWCsKctSE14u+3bW5sAkFA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip174": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.0.1.tgz", + "integrity": "sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" + }, + "node_modules/bitcoinjs-lib": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", + "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "dependencies": { + "bech32": "^1.1.2", + "bip174": "^2.0.1", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bsv": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/bsv/-/bsv-1.5.4.tgz", + "integrity": "sha512-CQVMS1jYveYbeq9Qdh5wXYq0Os3yduh7P+30d4oyHOMermiupbwR4IfBs2nfJEzaLxGjwNx4E4Z1rUYguZFRLw==", + "dependencies": { + "aes-js": "^3.1.2", + "bn.js": "=4.11.8", + "bs58": "=4.0.1", + "clone-deep": "^4.0.1", + "elliptic": "6.5.3", + "hash.js": "^1.1.7", + "inherits": "2.0.3", + "unorm": "1.4.1" + } + }, + "node_modules/bsv/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/bsv/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001245", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", + "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.777", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.777.tgz", + "integrity": "sha512-gO0VEU2esNUOu51DTtp7E7xy0d+yZdbC06EACvou1cbPM9Wwyz8ixPa6T1tqDXlT4/AefXtzx0i9OLwKkLOHQA==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "dependencies": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "node_modules/es-get-iterator/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.10.0.tgz", + "integrity": "sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/just-extend": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", + "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.1" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/nise": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/promise.allsettled/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "dependencies": { + "bitcoin-ops": "^1.3.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/sinon": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.0.tgz", + "integrity": "sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.2.0", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimend/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimstart/node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tiny-secp256k1": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.5.tgz", + "integrity": "sha512-duE2hSLSQIpHGzmK48OgRrGTi+4OTkXLC6aa86uOYQ6LLCYZSarVKIAvEtY7MoXjoL6bOXMSerEGMzrvW4SkDw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, + "node_modules/unorm": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", + "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/yargs-unparser/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "@sinonjs/samsam": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.2.0.tgz", + "integrity": "sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base58-native": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base58-native/-/base58-native-0.1.4.tgz", + "integrity": "sha1-u5I0qN8mYtBLC3Fa7uH4mxX+8TQ=", + "requires": { + "bignum": ">=0.6.1" + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "bignum": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/bignum/-/bignum-0.13.1.tgz", + "integrity": "sha512-sPtvw/knt6nmBm4fPgsu+FtNypM5y2Org723h9fAOl7UDgc8nyIbVbcBCatVR/nOJWCsKctSE14u+3bW5sAkFA==", + "requires": { + "bindings": "^1.5.0", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip174": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.0.1.tgz", + "integrity": "sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==" + }, + "bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "requires": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" + }, + "bitcoinjs-lib": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", + "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "requires": { + "bech32": "^1.1.2", + "bip174": "^2.0.1", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + } + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "bsv": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/bsv/-/bsv-1.5.4.tgz", + "integrity": "sha512-CQVMS1jYveYbeq9Qdh5wXYq0Os3yduh7P+30d4oyHOMermiupbwR4IfBs2nfJEzaLxGjwNx4E4Z1rUYguZFRLw==", + "requires": { + "aes-js": "^3.1.2", + "bn.js": "=4.11.8", + "bs58": "=4.0.1", + "clone-deep": "^4.0.1", + "elliptic": "6.5.3", + "hash.js": "^1.1.7", + "inherits": "2.0.3", + "unorm": "1.4.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001245", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", + "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "electron-to-chromium": { + "version": "1.3.777", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.777.tgz", + "integrity": "sha512-gO0VEU2esNUOu51DTtp7E7xy0d+yZdbC06EACvou1cbPM9Wwyz8ixPa6T1tqDXlT4/AefXtzx0i9OLwKkLOHQA==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.10.0.tgz", + "integrity": "sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "just-extend": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", + "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nise": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "requires": { + "bitcoin-ops": "^1.3.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sinon": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.0.tgz", + "integrity": "sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.2.0", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + } + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tiny-secp256k1": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.5.tgz", + "integrity": "sha512-duE2hSLSQIpHGzmK48OgRrGTi+4OTkXLC6aa86uOYQ6LLCYZSarVKIAvEtY7MoXjoL6bOXMSerEGMzrvW4SkDw==", + "requires": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, + "unorm": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", + "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "requires": { + "bs58check": "<3.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..83dad40 --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "carrot-pool-stratum", + "version": "0.1.0", + "description": "High performance SHA256 Stratum Server in Node.js", + "keywords": [ + "stratum", + "mining", + "pool", + "server", + "poolserver", + "bitcoin", + "bitcoin-sv" + ], + "license": "GPL-3.0", + "author": "HashRabbit, Inc. (https://hashrabbit.com)", + "main": "scripts/index.js", + "private": true, + "repository": "github:hashrabbit/carrot-pool-stratum", + "homepage": "https://github.com/hashrabbit/carrot-pool-stratum", + "bugs": "https://github.com/hashrabbit/carrot-pool-stratum/issues", + "scripts": { + "clean": "eslint . --ext .js --ignore-pattern node_modules/", + "test": "mocha 'test/**/**_test.js'", + "dot": "mocha --exit --reporter dot 'test/**/**_test.js'", + "cover": "nyc --reporter=lcov --reporter=text-summary npm run dot" + }, + "dependencies": { + "async": "1.5.2", + "base58-native": "0.1.4", + "bignum": "^0.13.1", + "bitcoinjs-lib": "^5.2.0", + "bsv": "^1.5.4", + "dotenv": "^8.2.0", + "promise": "^8.1.0" + }, + "engines": { + "node": ">= 12.0.0", + "npm": ">= 7.0.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^7.10.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.22.1", + "mocha": "^8.1.3", + "nyc": "^15.1.0", + "sinon": "^9.2.0" + } +} diff --git a/resources/blinkhash-logo-circle.png b/resources/blinkhash-logo-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..bd655d1befc715c19e5d7715f099f689ff176db2 GIT binary patch literal 17996 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 literal 0 HcmV?d00001 diff --git a/resources/blinkhash-logo-text.png b/resources/blinkhash-logo-text.png new file mode 100644 index 0000000000000000000000000000000000000000..052d075fcb6fdf7778375c99a70722d0c9159e49 GIT binary patch literal 38875 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 UKKleP`fqWNy1rVCihb070Mm$qHvj+t literal 0 HcmV?d00001 diff --git a/scripts/algorithms.js b/scripts/algorithms.js new file mode 100644 index 0000000..9796716 --- /dev/null +++ b/scripts/algorithms.js @@ -0,0 +1,32 @@ +/* + * + * Algorithms (Updated) + * + */ + +// Import Required Modules +const util = require('./util.js'); + +// Algorithms Main Function +const algorithms = { + // Sha256 Algorithm + sha256: { + hash() { + return function (...args) { + return util.sha256d.apply(this, args); + }; + }, + // Difficulty constant + diff1: 0x00000000ffff0000000000000000000000000000000000000000000000000000 + }, +}; + +// Set Default Multiplier +Object.keys(algorithms).forEach((algo) => { + if (!algorithms[algo].multiplier) { + algorithms[algo].multiplier = 1; + } +}); + +// Export Algorithms +module.exports = algorithms; diff --git a/scripts/blocks.js b/scripts/blocks.js new file mode 100644 index 0000000..74e0f75 --- /dev/null +++ b/scripts/blocks.js @@ -0,0 +1,162 @@ +/* + * + * Blocks (Updated) + * + */ + +// Import Required Modules +const bignum = require('bignum'); +const util = require('./util.js'); + +// Import Required Modules +const Merkle = require('./merkle.js'); +const Transactions = require('./transactions.js'); +const algorithms = require('./algorithms.js'); + +// BlockTemplate Main Function +const BlockTemplate = function (jobId, rpcData, extraNoncePlaceholder, options) { + // Establish Block Variables + this.rpcData = rpcData; + this.jobId = jobId; + this.submits = []; + + // Calculate Block Target/Difficulty + this.target = rpcData.target ? bignum(rpcData.target, 16) : util.bignumFromBitsHex(rpcData.bits); + const { diff1 } = algorithms[options.coin.algorithm]; + this.difficulty = parseFloat((diff1 / this.target.toNumber()).toFixed(9)); + + // Function to get Transaction Buffers + function getTransactionBuffers(txs) { + const txHashes = txs.map((tx) => { + if (tx.txid !== undefined) { + return util.uint256BufferFromHash(tx.txid); + } + return util.uint256BufferFromHash(tx.hash); + }); + return [null].concat(txHashes); + } + + // Create Generation Transaction + function createGeneration(rpcDataArg, extraNoncePlaceholderArg, optionsArg) { + const transactions = new Transactions(); + switch (options.coin.algorithm) { + default: + return transactions.bitcoin(rpcDataArg, extraNoncePlaceholderArg, optionsArg); + } + } + + // Establish Block Historical Hashes + this.prevHashReversed = util.reverseByteOrder(Buffer.from(rpcData.previousblockhash, 'hex')).toString('hex'); + if (rpcData.finalsaplingroothash) { + this.hashReserved = util.reverseBuffer(Buffer.from(rpcData.finalsaplingroothash, 'hex')).toString('hex'); + } else { + this.hashReserved = '0000000000000000000000000000000000000000000000000000000000000000'; + } + + // Push Submissions to Array + this.registerSubmit = function (extraNonce1, extraNonce2, nTime, nonce) { + const submission = extraNonce1 + extraNonce2 + nTime + nonce; + if (this.submits.indexOf(submission) === -1) { + this.submits.push(submission); + return true; + } + return false; + }; + + // Establish Merkle Variables + this.merkleBranch = new Merkle(getTransactionBuffers(rpcData.transactions)).branch; + this.merkleBranchHex = this.merkleBranch.map((step) => step.toString('hex')); + + // Structure Block Transaction Data + this.generation = createGeneration(rpcData, extraNoncePlaceholder, options); + this.transactions = Buffer.concat(rpcData.transactions.map((tx) => Buffer.from(tx.data, 'hex'))); + + // Serialize Block Coinbase + this.serializeCoinbase = function (extraNonce1, extraNonce2, optionsArg) { + switch (optionsArg.coin.algorithm) { + default: + return Buffer.concat([ + this.generation[0], + extraNonce1, + extraNonce2, + this.generation[1], + ]); + } + }; + + // Serialize Block Headers + this.serializeHeader = function (merkleRoot, nTime, nonce, optionsArg) { + const headerBuf = Buffer.alloc(80); + let position = 0; + switch (optionsArg.coin.algorithm) { + default: + headerBuf.write(nonce, position, 4, 'hex'); + headerBuf.write(this.rpcData.bits, position += 4, 4, 'hex'); + headerBuf.write(nTime, position += 4, 4, 'hex'); + headerBuf.write(merkleRoot, position += 4, 32, 'hex'); + headerBuf.write(this.rpcData.previousblockhash, position += 32, 32, 'hex'); + headerBuf.writeUInt32BE(this.rpcData.version, position + 32); + return util.reverseBuffer(headerBuf); + } + }; + + // Serialize Entire Block + this.serializeBlock = function (header, coinbase, optionsArg) { + switch (optionsArg.coin.algorithm) { + default: + return Buffer.concat([ + header, + util.varIntBuffer(this.rpcData.transactions.length + 1), + coinbase, + this.transactions, + Buffer.from([]), + ]); + } + }; + + // Serialize and return the crafted block header, and also return + // a continuation function for constructing the full solution to submit if desired + this.startSolution = function (coinbaseBuffer, merkleRoot, nTime, nonce, optionsArg) { + const headerBuffer = this.serializeHeader(merkleRoot, nTime, nonce, optionsArg); + const finishSolution = function () { + return this.serializeBlock(headerBuffer, coinbaseBuffer, optionsArg).toString('hex'); + }.bind(this); + return [headerBuffer, finishSolution]; + }; + + // Get Current Job Parameters + this.getJobParams = function (optionsArg) { + switch (optionsArg.coin.algorithm) { + default: + if (!this.jobParams) { + this.jobParams = [ + this.jobId, + this.prevHashReversed, + this.generation[0].toString('hex'), + this.generation[1].toString('hex'), + this.merkleBranchHex, + util.packInt32BE(this.rpcData.version).toString('hex'), + this.rpcData.bits, + util.packUInt32BE(this.rpcData.curtime).toString('hex'), + true, + ]; + } + return this.jobParams; + } + }; + + this.hasSameParent = function (other) { + return this.rpcData.previousblockhash === other.previousblockhash; + }; + + this.hasSameDifficulty = function (other) { + return this.rpcData.bits === other.bits; + }; + + this.isMoreRecent = function (other) { + return this.rpcData.height > other.height; + }; +}; + +// Export BlockTemplate +module.exports = BlockTemplate; diff --git a/scripts/candidates.js b/scripts/candidates.js new file mode 100644 index 0000000..e027130 --- /dev/null +++ b/scripts/candidates.js @@ -0,0 +1,145 @@ +/* + * + * Candidate blocks via GetMiningCandidate + * + */ + +// Import Required Modules +const bignum = require('bignum'); +const util = require('./util.js'); +const Transactions = require('./transactions.js'); +const algorithms = require('./algorithms.js'); + +// MiningTemplate Main Function +const MiningCandidate = function (jobId, rawRpcData, extraNoncePlaceholder, options) { + // Decorate rawRpcData to make it property-compatible with getblocktemplate rpcData + const rpcData = Object.assign(rawRpcData, + { + previousblockhash: rawRpcData.prevhash, + coinbasevalue: rawRpcData.coinbaseValue, + coinbaseaux: { flags: false }, + bits: rawRpcData.nBits, + curtime: rawRpcData.time + }); + + // Establish Block Variables + this.rpcData = rpcData; + this.jobId = jobId; + this.submits = []; + + // Calculate Block Target/Difficulty + this.target = rpcData.target ? bignum(rpcData.target, 16) : util.bignumFromBitsHex(rpcData.bits); + const { diff1 } = algorithms[options.coin.algorithm]; + this.difficulty = parseFloat((diff1 / this.target.toNumber()).toFixed(9)); + + // Create Generation Transaction + function createGeneration(rpcDataArg, extraNoncePlaceholderArg, optionsArg) { + const transactions = new Transactions(); + switch (options.coin.algorithm) { + default: + return transactions.bitcoin(rpcDataArg, extraNoncePlaceholderArg, optionsArg); + } + } + + // Establish Block Historical Hashes + this.prevHashReversed = util.reverseByteOrder(Buffer.from(rpcData.previousblockhash, 'hex')).toString('hex'); + + // Push Submissions to Array + this.registerSubmit = function (extraNonce1, extraNonce2, nTime, nonce) { + const submission = extraNonce1 + extraNonce2 + nTime + nonce; + if (this.submits.indexOf(submission) === -1) { + this.submits.push(submission); + return true; + } + return false; + }; + + // Establish Merkle Variables + this.merkleBranch = + this.rpcData.merkleProof.map((step) => util.reverseBuffer(Buffer.from(step, 'hex'))); + this.merkleBranchHex = this.merkleBranch.map((step) => step.toString('hex')); + + // Structure Block Transaction Data + this.generation = createGeneration(rpcData, extraNoncePlaceholder, options); + + // Serialize Block Coinbase + this.serializeCoinbase = function (extraNonce1, extraNonce2, optionsArg) { + switch (optionsArg.coin.algorithm) { + default: + return Buffer.concat([ + this.generation[0], + extraNonce1, + extraNonce2, + this.generation[1], + ]); + } + }; + + // Serialize Block Headers + this.serializeHeader = function (merkleRoot, nTime, nonce, optionsArg) { + const headerBuf = Buffer.alloc(80); + let position = 0; + switch (optionsArg.coin.algorithm) { + default: + headerBuf.write(nonce, position, 4, 'hex'); + headerBuf.write(this.rpcData.bits, position += 4, 4, 'hex'); + headerBuf.write(nTime, position += 4, 4, 'hex'); + headerBuf.write(merkleRoot, position += 4, 32, 'hex'); + headerBuf.write(this.rpcData.previousblockhash, position += 32, 32, 'hex'); + headerBuf.writeUInt32BE(this.rpcData.version, position + 32); + return util.reverseBuffer(headerBuf); + } + }; + + // Serialize and return the crafted block header, and also return + // a continuation function for constructing the full solution to submit if desired + this.startSolution = function (coinbaseBuffer, merkleRoot, nTime, nonce, optionsArg) { + const headerBuffer = this.serializeHeader(merkleRoot, nTime, nonce, optionsArg); + const finishSolution = function () { + return { + id: this.rpcData.id, + nonce: parseInt(nonce, 16), + coinbase: coinbaseBuffer.toString('hex'), + time: parseInt(nTime, 16), + version: this.rpcData.version + }; + }.bind(this); + return [headerBuffer, finishSolution]; + }; + + // Get Current Job Parameters + this.getJobParams = function (optionsArg) { + switch (optionsArg.coin.algorithm) { + default: + if (!this.jobParams) { + this.jobParams = [ + this.jobId, + this.prevHashReversed, + this.generation[0].toString('hex'), + this.generation[1].toString('hex'), + this.merkleBranchHex, + util.packInt32BE(this.rpcData.version).toString('hex'), + this.rpcData.bits, + util.packUInt32BE(this.rpcData.curtime).toString('hex'), + true, + ]; + } + return this.jobParams; + } + }; + + this.hasSameParent = function (other) { + return this.rpcData.previousblockhash === other.prevhash; + }; + + this.hasSameDifficulty = function (other) { + return this.rpcData.bits === other.nBits; + }; + + this.isMoreRecent = function (other) { + return this.rpcData.height > other.height; + }; +}; + +// Export BlockTemplate +module.exports = MiningCandidate; diff --git a/scripts/daemon.js b/scripts/daemon.js new file mode 100644 index 0000000..b8f2425 --- /dev/null +++ b/scripts/daemon.js @@ -0,0 +1,178 @@ +/* + * + * Daemon (Updated) + * + */ + +// Import Required Modules +const http = require('http'); +require('child_process'); +const events = require('events'); +const async = require('async'); + +/** + * The Daemon interface interacts with the coin Daemon by using the RPC interface. + * in order to make it work it needs, as constructor, an array of objects containing + * - 'host' : hostname where the coin lives + * - 'port' : port where the coin accepts RPC connections + * - 'user' : username of the coin for the RPC interface + * - 'password': password for the RPC interface of the coin +* */ + +// DaemonInterface Main Function +const DaemonInterface = function (daemons, loggerArg) { + // Establish Private Daemon Variables + const _this = this; + const logger = loggerArg || function (severity, message) { + console.log(`${severity}: ${message}`); + }; + + // Index Daemons from Parameter + function indexDaemons() { + const daemonsArray = daemons; + for (let i = 0; i < daemons.length; i += 1) { + daemonsArray[i].index = i; + } + return daemonsArray; + } + + // Establish Instances + const instances = indexDaemons(); + + // Configure Daemon HTTP Requests + function performHttpRequest(instance, jsonData, callback) { + // Establish HTTP Options + const options = { + hostname: (typeof (instance.host) === 'undefined' ? '127.0.0.1' : instance.host), + port: instance.port, + method: 'POST', + auth: `${instance.user}:${instance.password}`, + headers: { + 'Content-Length': jsonData.length, + }, + }; + + // Attempt to Parse JSON from Response + const parseJson = function (res, data) { + let dataJson; + if ((res.statusCode === 401) || (res.statusCode === 403)) { + logger('error', 'Unauthorized RPC access - invalid RPC username or password'); + return; + } + try { + dataJson = JSON.parse(data); + } catch (e) { + if (data.indexOf(':-nan') !== -1) { + const saniData = data.replace(/:-nan,/g, ':0'); + parseJson(res, saniData); + return; + } + logger('error', `Could not parse RPC data from daemon instance ${instance.index + }\nRequest Data: ${jsonData + }\nReponse Data: ${data}`); + } + if (dataJson) { + callback(dataJson.error, dataJson, data); + } + }; + + // Establish HTTP Request + const req = http.request(options, (res) => { + let data = ''; + res.setEncoding('utf8'); + res.on('data', (chunk) => { + data += chunk; + }); + res.on('end', () => { + parseJson(res, data); + }); + }); + + // Configure Error Behavior + req.on('error', (e) => { + if (e.code === 'ECONNREFUSED') callback({ type: 'offline', message: e.message }, null); + else callback({ type: 'request error', message: e.message }, null); + }); + + // Return JSON Output + req.end(jsonData); + } + + // Batch RPC Commands + function batchCmd(cmdArray, callback) { + const requestJson = []; + for (let i = 0; i < cmdArray.length; i += 1) { + requestJson.push({ + method: cmdArray[i][0], + params: cmdArray[i][1], + id: Date.now() + Math.floor(Math.random() * 10) + i, + }); + } + const serializedRequest = JSON.stringify(requestJson); + performHttpRequest(instances[0], serializedRequest, (error, result) => { + callback(error, result); + }); + } + + // Single RPC Command + function cmd(method, params, callback, streamResults, returnRawData) { + const results = []; + async.each(instances, (instance, eachCallback) => { + let itemFinished = function (error, result, data) { + const returnObj = { + error, + response: (result || {}).result, + instance, + method, + params + }; + if (returnRawData) returnObj.data = data; + if (streamResults) callback(returnObj); + else results.push(returnObj); + eachCallback(); + itemFinished = function () {}; + }; + const requestJson = JSON.stringify({ + method, + params, + id: Date.now() + Math.floor(Math.random() * 10), + }); + performHttpRequest(instance, requestJson, (error, result, data) => { + itemFinished(error, result, data); + }); + }, () => { + if (!streamResults) { + callback(results); + } + }); + } + + // Check if All Daemons are Online + function isOnline(callback) { + cmd('getpeerinfo', [], (results) => { + const allOnline = results.every(() => !results.error); + callback(allOnline); + if (!allOnline) { + _this.emit('connectionFailed', results); + } + }); + } + + // Initialize Daemons + function initDaemons() { + isOnline((online) => { + if (online) { + _this.emit('online'); + } + }); + } + + // Establish Public Daemon Variables + this.init = initDaemons; + this.isOnline = isOnline; + this.cmd = cmd; + this.batchCmd = batchCmd; +}; + +exports.Interface = DaemonInterface; +Object.setPrototypeOf(DaemonInterface.prototype, events.EventEmitter.prototype); diff --git a/scripts/difficulty.js b/scripts/difficulty.js new file mode 100644 index 0000000..e5074c1 --- /dev/null +++ b/scripts/difficulty.js @@ -0,0 +1,124 @@ +/* + * + * Difficulty (Updated) + * + */ + +// Import Required Modules +const events = require('events'); + +// Truncate Integer to Fixed Decimal Places +function toFixed(num, len) { + return parseFloat(num.toFixed(len)); +} + +// RingBuffer Main Function +function RingBuffer(maxSize) { + // Establish Manager Variables + let data = []; + let cursor = 0; + let isFull = false; + + // Append to Ring Buffer + this.append = function (x) { + if (isFull) { + data[cursor] = x; + cursor = (cursor + 1) % maxSize; + } else { + data.push(x); + cursor += 1; + if (data.length === maxSize) { + cursor = 0; + isFull = true; + } + } + }; + + // Average Ring Buffer + this.avg = function () { + const sum = data.reduce((a, b) => a + b); + return sum / (isFull ? maxSize : cursor); + }; + + // Size of Ring Buffer + this.size = function () { + return isFull ? maxSize : cursor; + }; + + // Clear Ring Buffer + this.clear = function () { + data = []; + cursor = 0; + isFull = false; + }; +} + +// Difficulty Main Function +const Difficulty = function (port, difficultyOptions) { + // Establish Difficulty Variables + const _this = this; + const variance = difficultyOptions.targetTime * (difficultyOptions.variancePercent / 100); + const bufferSize = difficultyOptions.retargetTime / (difficultyOptions.targetTime * 4); + const tMin = difficultyOptions.targetTime - variance; + const tMax = difficultyOptions.targetTime + variance; + + // Manage Individual Clients + this.manageClient = function (client) { + // Check if Client is Connected to VarDiff Port + const stratumPort = client.socket.localPort; + if (stratumPort !== port) { + console.error('Handling a client which is not of this vardiff?'); + } + + // Establish Client Variables + const options = difficultyOptions; + let lastTs; + let lastRtc; + let timeBuffer; + + // Manage Client Submission + client.on('submit', () => { + const ts = (Date.now() / 1000) | 0; + if (!lastRtc) { + lastRtc = ts - options.retargetTime / 2; + lastTs = ts; + timeBuffer = new RingBuffer(bufferSize); + return; + } + const sinceLast = ts - lastTs; + timeBuffer.append(sinceLast); + lastTs = ts; + if ((ts - lastRtc) < options.retargetTime && timeBuffer.size() > 0) { + return; + } + lastRtc = ts; + const avg = timeBuffer.avg(); + let ddiff = options.targetTime / avg; + if (avg > tMax && client.difficulty > options.minDiff) { + if (options.x2mode) { + ddiff = 0.5; + } + if (ddiff * client.difficulty < options.minDiff) { + ddiff = options.minDiff / client.difficulty; + } + } else if (avg < tMin) { + if (options.x2mode) { + ddiff = 2; + } + const diffMax = options.maxDiff; + if (ddiff * client.difficulty > diffMax) { + ddiff = diffMax / client.difficulty; + } + } else { + return; + } + const newDiff = toFixed(client.difficulty * ddiff, 8); + timeBuffer.clear(); + _this.emit('newDifficulty', client, newDiff); + }); + }; +}; + +// Export Difficulty +module.exports = Difficulty; +Object.setPrototypeOf(Difficulty.prototype, events.EventEmitter.prototype); diff --git a/scripts/index.js b/scripts/index.js new file mode 100644 index 0000000..7aa1201 --- /dev/null +++ b/scripts/index.js @@ -0,0 +1,22 @@ +/* + * + * Index (Updated) + * + */ + +// Import Required Modules +require('net'); +require('events'); + +// Load Hashing Algorithms +require('./algorithms.js'); + +// Establish Main Pool Exports +const Pool = require('./pool.js'); +exports.daemon = require('./daemon.js'); +exports.difficulty = require('./difficulty.js'); + +exports.createPool = function (poolOptions, authorizeFn) { + const newPool = new Pool(poolOptions, authorizeFn); + return newPool; +}; diff --git a/scripts/manager.js b/scripts/manager.js new file mode 100644 index 0000000..4684c51 --- /dev/null +++ b/scripts/manager.js @@ -0,0 +1,242 @@ +/* + * + * Manager (Updated) + * + */ + +// Import Required Modules +const events = require('events'); +const crypto = require('crypto'); +const bignum = require('bignum'); +const algorithms = require('./algorithms'); +const util = require('./util'); + +// Import BlockTemplate Module +const BlockTemplate = require('./blocks'); +// Import MiningCandidate Module +const MiningCandidate = require('./candidates'); + +// Generate Unique ExtraNonce for each Subscriber +const ExtraNonceCounter = function (configInstanceId) { + const instanceId = configInstanceId || crypto.randomBytes(4).readUInt32LE(0); + let counter = instanceId << 27; + this.size = 4; + this.next = function () { + const extraNonce = util.packUInt32BE(Math.abs(counter)); + counter += 1; + return extraNonce.toString('hex'); + }; +}; + +// Generate Unique Job for each Block +const JobCounter = function () { + let counter = 0; + this.next = function () { + counter += 1; + if (counter % 0xffff === 0) counter = 1; + return this.cur(); + }; + this.cur = function () { + return counter.toString(16); + }; +}; + +/** + * Emits: + * - newBlock(BlockTemplate) - When a new block (previously unknown to the JobManager) is added, + * use this event to broadcast new jobs + * - share(shareData, blockHex) - When a worker submits a share, + * it will have blockHex if a block was found +* */ + +// Manager Main Function +const Manager = function (options) { + // Establish Private Manager Variables + const _this = this; + const jobCounter = new JobCounter(); + const shareMultiplier = algorithms[options.coin.algorithm].multiplier; + const hashDigest = algorithms[options.coin.algorithm].hash(options.coin); + const { diff1 } = algorithms[options.coin.algorithm]; + const BlockBuilder = options.extensions.miningCandidateApi ? MiningCandidate : BlockTemplate; + + // Establish Public Manager Variables + this.currentJob = undefined; + this.validJobs = {}; + this.extraNonceCounter = new ExtraNonceCounter(options.instanceId); + this.extraNoncePlaceholder = Buffer.from('f000000ff111111f', 'hex'); + this.extraNonce2Size = this.extraNoncePlaceholder.length - this.extraNonceCounter.size; + + // Determine Block Hash Function + function blockHash() { + switch (options.coin.algorithm) { + default: + return function (d) { + return util.reverseBuffer(util.sha256d(d)); + }; + } + } + + // Determine Coinbase Hash Function + function coinbaseHash() { + switch (options.coin.algorithm) { + default: + return util.sha256d; + } + } + + // Establish Main Hash Functions + const blockHasher = blockHash(); + const coinbaseHasher = coinbaseHash(); + + // Update Current Managed Job + function updateCurrentJob(rpcData) { + const tmpBlockTemplate = new BlockBuilder( + jobCounter.next(), + rpcData, + _this.extraNoncePlaceholder, + options, + ); + _this.currentJob = tmpBlockTemplate; + _this.emit('updatedBlock', tmpBlockTemplate, true); + _this.validJobs[tmpBlockTemplate.jobId] = tmpBlockTemplate; + } + + // Check if New Block is Processed + this.updateCurrentJob = updateCurrentJob; + + this.processBlock = function (rpcData) { + // When given a fresh job, updates the current job and returns true + // When given a stale job, returns false + + const hasCurrentJob = typeof (_this.currentJob) !== 'undefined'; + if (hasCurrentJob) { + // Given a current job, any older block will never be a new job + if (_this.currentJob.isMoreRecent(rpcData)) { + return false; + } + + // If the 'new' block has the old difficulty and parent, no need to treat it as new + if (_this.currentJob.hasSameParent(rpcData) && _this.currentJob.hasSameDifficulty(rpcData)) { + return false; + } + } + + // If we don't have a current job, or the block meets the criteria to count as the next job... + // Update Current Managed Block + updateCurrentJob(rpcData); + return true; + }; + + // Process New Submitted Share + this.processShare = function (jobId, previousPoolDifficulty, poolDifficulty, extraNonce1, + extraNonce2, nTime, nonce, ipAddress, port, workerName) { + // Share is Invalid + const shareError = function (error) { + _this.emit('share', { + job: jobId, + ip: ipAddress, + worker: workerName, + difficulty: poolDifficulty, + port, + error: error[1], + }); + return { error, result: null }; + }; + + // Handle Shares by Algorithm + switch (options.coin.algorithm) { + // Default Share Handling + default: { + // Edge Cases to Check if Share is Invalid + const submitTime = Math.trunc(Date.now() / 1000); + if (extraNonce2.length / 2 !== _this.extraNonce2Size) return shareError([20, 'incorrect size of extranonce2']); + const job = this.validJobs[jobId]; + if (typeof job === 'undefined' || job.jobId !== jobId) { + return shareError([21, 'job not found']); + } + if (nTime.length !== 8) { + return shareError([20, 'incorrect size of ntime']); + } + const nTimeInt = parseInt(nTime, 16); + if (nTimeInt < job.rpcData.curtime || nTimeInt > submitTime + 7200) { + return shareError([20, 'ntime out of range']); + } + if (nonce.length !== 8) { + return shareError([20, 'incorrect size of nonce']); + } + if (!job.registerSubmit(extraNonce1, extraNonce2, nTime, nonce)) { + return shareError([22, 'duplicate share']); + } + + // Establish Share Information + const extraNonce1Buffer = Buffer.from(extraNonce1, 'hex'); + const extraNonce2Buffer = Buffer.from(extraNonce2, 'hex'); + const coinbaseBuffer = job.serializeCoinbase(extraNonce1Buffer, extraNonce2Buffer, options); + const coinbaseHashOutput = coinbaseHasher(coinbaseBuffer); + + const merkleRoot = util.reverseBuffer( + job.merkleBranch.reduce( + (acc, step) => util.sha256d(Buffer.concat([acc, step])), + coinbaseHashOutput + ) + ).toString('hex'); + + const [headerBuffer, finishSolution] = job.startSolution( + coinbaseBuffer, merkleRoot, nTime, nonce, options + ); + const headerHash = hashDigest(headerBuffer, nTimeInt); + const headerBigNum = bignum.fromBuffer(headerHash, { endian: 'little', size: 32 }); + + // Establish Share Variables + let blockHashInvalid; + let blockHeaderHash; + let blockSolution; + let difficulty = poolDifficulty; + + // Calculate Share Difficulty + const shareDiff = (diff1 / headerBigNum.toNumber()) * shareMultiplier; + const blockDiffAdjusted = job.difficulty * shareMultiplier; + + // Check if Share is Valid Block Candidate + if (job.target.ge(headerBigNum)) { + blockSolution = finishSolution(); + blockHeaderHash = blockHasher(headerBuffer, nTime).toString('hex'); + } else { + if (options.emitInvalidBlockHashes) { + blockHashInvalid = util.reverseBuffer(util.sha256d(headerBuffer)).toString('hex'); + } + if (shareDiff / poolDifficulty < 0.99) { + if (previousPoolDifficulty && shareDiff >= previousPoolDifficulty) { + difficulty = previousPoolDifficulty; + } else { + return shareError([23, `low difficulty share of ${shareDiff}`]); + } + } + } + + // Share is Valid + _this.emit('share', { + job: jobId, + ip: ipAddress, + port, + worker: workerName, + height: job.rpcData.height, + blockReward: job.rpcData.coinbasevalue, + difficulty, + shareDiff: shareDiff.toFixed(8), + blockDiff: blockDiffAdjusted, + blockDiffActual: job.difficulty, + blockHash: blockHeaderHash, + blockHashInvalid, + }, blockSolution); + + // Return Valid Share + return { result: true, error: null, blockHeaderHash }; + } + } + }; +}; + +// Export Manager +module.exports = Manager; +Object.setPrototypeOf(Manager.prototype, events.EventEmitter.prototype); diff --git a/scripts/merkle.js b/scripts/merkle.js new file mode 100644 index 0000000..84989a3 --- /dev/null +++ b/scripts/merkle.js @@ -0,0 +1,40 @@ +/* + * + * Merkle (Updated) + * + */ + +// Import Required Modules +const util = require('./util.js'); + +// Merkle Main Function +const Merkle = function (txHashArray) { + // Concat Hashes Together + function concatHash(h1, h2) { + const joined = Buffer.concat([h1, h2]); + const dhashed = util.sha256d(joined); + return dhashed; + } + + // Calculate Merkle Branch + function calculateBranch(txHashes) { + const inner = function (hashes, steps) { + const len = hashes.length; + if (len <= 1) return steps; + + steps.push(hashes[1]); + if (len % 2) hashes.push(hashes[len - 1]); + const next = util.range(2, len, 2).map((i) => concatHash(hashes[i], hashes[i + 1])); + next.unshift(null); + return inner(next, steps); + }; + + return inner(txHashes, []); + } + + // Establish merkle branch + this.branch = calculateBranch(txHashArray); +}; + +// Export Merkle +module.exports = Merkle; diff --git a/scripts/miner-id.js b/scripts/miner-id.js new file mode 100644 index 0000000..d3125b5 --- /dev/null +++ b/scripts/miner-id.js @@ -0,0 +1,71 @@ +require('dotenv').config() +const bsv = require('bsv') +const protocolName = 'ac1eed88' +const cbdVersion = '0.1' + +function createCoinbaseDocument (height, minerId, prevMinerIdPrivKey, vcTx, optionalData) { + let prevMinerId = prevMinerIdPrivKey.toPublicKey().toString() + + prevMinerId = prevMinerId || minerId + + const minerIdSigPayload = Buffer.concat([ + Buffer.from(prevMinerId, 'hex'), + Buffer.from(minerId, 'hex'), + Buffer.from(vcTx, 'hex') + ]) + + const hash = bsv.crypto.Hash.sha256(minerIdSigPayload) + const prevMinerIdSig = bsv.crypto.ECDSA.sign(hash, prevMinerIdPrivKey).toString() + + const doc = { + version: cbdVersion, + height: height, + + prevMinerId: prevMinerId, + prevMinerIdSig: prevMinerIdSig, + + minerId: minerId, + + vctx: { + txId: vcTx, + vout: 0 + } + } + if (optionalData) { + doc.minerContact = optionalData + } + return doc +} + +function createMinerIdOpReturn (height, minerIdPrivKey, prevMinerIdPrivKey, vcTx, mc) { + const minerId = minerIdPrivKey.toPublicKey().toString() + const doc = createCoinbaseDocument(height, minerId, prevMinerIdPrivKey, vcTx, mc) + + const payload = JSON.stringify(doc) + + const hash = bsv.crypto.Hash.sha256(Buffer.from(payload)) + const signature = bsv.crypto.ECDSA.sign(hash, minerIdPrivKey).toString() + + const opReturnScript = bsv.Script.buildSafeDataOut([protocolName, payload, signature]).toBuffer() + return opReturnScript +} + +exports.generate = function (height) { + try { + const v = process.env.VCTX + const mc = { + name: process.env.MINERID_NAME.toString(), + email: process.env.MINERID_EMAIL.toString(), + merchantAPIEndPoint: process.env.MINERID_MAPI.toString() + } + const prevMinerIdPrivKey = bsv.PrivateKey.fromWIF(process.env.PREV_MINERID_PK.toString()) + const minerIdPrivKey = bsv.PrivateKey.fromWIF(process.env.MINERID_PK.toString()) + const minerIdPayload = createMinerIdOpReturn(height, minerIdPrivKey, prevMinerIdPrivKey, v, mc) + + return minerIdPayload + } catch (e) { + console.log( + 'Incorrect miner-id parameters, please make sure .env file is setup correctly: ', e + ) + } +} diff --git a/scripts/peer.js b/scripts/peer.js new file mode 100644 index 0000000..a6177bf --- /dev/null +++ b/scripts/peer.js @@ -0,0 +1,253 @@ +/* + * + * Peer (Updated) + * + */ + +// Import Required Modules +const net = require('net'); +const crypto = require('crypto'); +const events = require('events'); +const util = require('./util'); + +// Generate String Buffer from Parameter Length +const fixedLenStringBuffer = function (s, len) { + const buff = Buffer.alloc(len); + buff.fill(0); + buff.write(s); + return buff; +}; + +// Generate Command String Buffer +const commandStringBuffer = function (s) { + return fixedLenStringBuffer(s, 12); +}; + +/* Reads a set amount of bytes from a flowing stream, argument descriptions: + - stream to read from, must have data emitter + - amount of bytes to read + - preRead argument can be used to set start with an existing data buffer + - callback returns 1) data buffer and 2) lopped/over-read data */ + +// Read Bytes Functionality +const readFlowingBytes = function (stream, amount, preRead, callback) { + let buff = preRead || Buffer.from([]); + const readData = function (data) { + buff = Buffer.concat([buff, data]); + if (buff.length >= amount) { + const returnData = buff.slice(0, amount); + const lopped = buff.length > amount ? buff.slice(amount) : null; + callback(returnData, lopped); + } else stream.once('data', readData); + }; + readData(Buffer.from([])); +}; + +// Peer Main Function +const Peer = function (options) { + // Establish Peer Variables + const _this = this; + let client; + const magic = Buffer.from(options.testnet ? options.coin.peerMagicTestnet : options.coin.peerMagic, 'hex'); + const magicInt = magic.readUInt32LE(0); + let verack = false; + let validConnectionConfig = true; + + // Bitcoin Inventory Codes + const invCodes = { + error: 0, + tx: 1, + block: 2, + }; + + // Establish Network Variables + const networkServices = Buffer.from('0100000000000000', 'hex'); // NODE_NETWORK services (value 1 packed as uint64) + const emptyNetAddress = Buffer.from('010000000000000000000000000000000000ffff000000000000', 'hex'); + const userAgent = util.varStringBuffer('/node-stratum/'); + const blockStartHeight = Buffer.from('00000000', 'hex'); // block start_height, can be empty + const relayTransactions = options.p2p.disableTransactions === true ? Buffer.from([false]) + : Buffer.from([]); + + // Establish Peer Commands + const commands = { + version: commandStringBuffer('version'), + inv: commandStringBuffer('inv'), + verack: commandStringBuffer('verack'), + addr: commandStringBuffer('addr'), + getblocks: commandStringBuffer('getblocks'), + }; + + // Broadcast/Send Peer Messages + function sendMessage(command, payload) { + const message = Buffer.concat([ + magic, + command, + util.packUInt32LE(payload.length), + util.sha256d(payload).slice(0, 4), + payload, + ]); + client.write(message); + _this.emit('sentMessage', message); + } + + // Broadcast/Send Peer Version + function sendVersion() { + const payload = Buffer.concat([ + util.packUInt32LE(options.protocolVersion), + networkServices, + util.packInt64LE(Math.trunc(Date.now() / 1000)), + emptyNetAddress, + emptyNetAddress, + crypto.pseudoRandomBytes(8), + userAgent, + blockStartHeight, + relayTransactions, + ]); + sendMessage(commands.version, payload); + } + + // Handle Peer Inventory + function handleInventory(payload) { + let count = payload.readUInt8(0); + let payloadCursor = payload.slice(1); + if (count >= 0xfd) { + count = payloadCursor.readUInt16LE(0); + payloadCursor = payloadCursor.slice(2); + } + while (count) { + count -= 1; + switch (payloadCursor.readUInt32LE(0)) { + case invCodes.tx: + // TODO(rschifflin): Investigate dead code here; why is `tx` being parsed and thrown away? + // var tx = payloadCursor.slice(4, 36).toString('hex'); + break; + case invCodes.block: { + const block = payloadCursor.slice(4, 36).toString('hex'); + _this.emit('blockFound', block); + break; + } + default: // invCodes.error plus all unrecognized values: + break; + } + payloadCursor = payloadCursor.slice(36); + } + } + + // Handle Peer Messages + function handleMessage(command, payload) { + _this.emit('peerMessage', { command, payload }); + switch (command) { + case commands.inv.toString(): + handleInventory(payload); + break; + case commands.verack.toString(): + if (!verack) { + verack = true; + _this.emit('connected'); + } + break; + case commands.version.toString(): + sendMessage(commands.verack, Buffer.alloc(0)); + break; + default: + break; + } + } + + // Establish Peer Message Parser + function setupMessageParser() { + const beginReadingMessage = function (preRead) { + readFlowingBytes(client, 24, preRead, (header, afterHeader) => { + const msgMagic = header.readUInt32LE(0); + if (msgMagic !== magicInt) { + let headerCursor = header; + _this.emit('error', 'bad magic number from peer'); + while (headerCursor.readUInt32LE(0) !== magicInt && headerCursor.length >= 4) { + headerCursor = headerCursor.slice(1); + } + if (headerCursor.readUInt32LE(0) === magicInt) { + // TODO(rschifflin): + // This logic seems wrong. The argument being passed should be + // `Buffer.concat([headerCursor, afterHeader])`. Since we found the real start of + // the header, then some of the valid header lies in the contiguous 'after' bits + // that we're currently discarding. + beginReadingMessage(headerCursor); + } else { + // TODO(rschifflin): + // This logic seems wrong. The argument being passed should be + // `afterHeader`. Since we exhausted the header bits without finding the start of + // the header, the true start might lie in the 'after' bits that we're currently + // discarding. + beginReadingMessage(Buffer.from([])); + } + return; + } + const msgCommand = header.slice(4, 16).toString(); + const msgLength = header.readUInt32LE(16); + const msgChecksum = header.readUInt32LE(20); + // TODO(rschifflin): Seems dangerous to allow untrusted data to determine an + // arbitrary read length. `msgLength` should probably clamp + // at a maximum payload size. + readFlowingBytes(client, msgLength, afterHeader, (payload, afterPayload) => { + if (util.sha256d(payload).readUInt32LE(0) !== msgChecksum) { + _this.emit('error', 'bad payload - failed checksum'); + // TODO(rschifflin): + // This logic seems wrong. The argument being passed should be + // `Buffer.concat([header.slice(4), payload, afterPayload])`. If the checksum + // fails, the entire header+payload is garbage, and the next message could be + // anywhere in the bytes past the misinterpreted magic int32. Currently we discard + // all bytes, which means we could be missing the true start of the next valid + // message. + beginReadingMessage(null); + return; + } + handleMessage(msgCommand, payload); + beginReadingMessage(afterPayload); + }); + }); + }; + beginReadingMessage(null); + } + + // Establish Peer Connection + function connectPeer() { + client = net.connect({ + host: options.p2p.host, + port: options.p2p.port, + }, () => { + sendVersion(); + }); + + // Manage Peer Close Functionality + client.on('close', () => { + if (verack) { + _this.emit('disconnected'); + verack = false; + connectPeer(); + } else if (validConnectionConfig) _this.emit('connectionRejected'); + }); + + // Manage Peer Error Functionality + client.on('error', (e) => { + if (e.code === 'ECONNREFUSED') { + validConnectionConfig = false; + _this.emit('connectionFailed'); + } else _this.emit('socketError', e); + }); + + // Allow Peer to Receive/Send Messages + setupMessageParser(); + } + + // Initialize Peer Connection + function initializePeer() { + connectPeer(); + } + + // Initialize Peer Connection + initializePeer(); +}; + +// Export Peer +module.exports = Peer; +Object.setPrototypeOf(Peer.prototype, events.EventEmitter.prototype); diff --git a/scripts/pool.js b/scripts/pool.js new file mode 100644 index 0000000..66e116e --- /dev/null +++ b/scripts/pool.js @@ -0,0 +1,663 @@ +/* + * + * Pool (Updated) + * + */ + +// Import Required Modules +const events = require('events'); +// TODO(rschifflin): Why was async required and not used? Maybe a leftover from an earlier revision +const algorithms = require('./algorithms'); +const util = require('./util'); + +// Import Required Modules +const Difficulty = require('./difficulty.js'); +const Daemon = require('./daemon.js'); +const Manager = require('./manager.js'); +const Peer = require('./peer.js'); +const Stratum = require('./stratum.js'); + +// Pool Main Function +const Pool = function (initialOptions, authorizeFn) { + // Establish Pool Variables + const _this = this; + const options = initialOptions; + + // TODO(rschifflin) Why were we declaring this interval id if we never use it? + // let blockPollingIntervalId; + const emitLog = function (text) { _this.emit('log', 'debug', text); }; + const emitWarningLog = function (text) { _this.emit('log', 'warning', text); }; + const emitErrorLog = function (text) { _this.emit('log', 'error', text); }; + const emitSpecialLog = function (text) { _this.emit('log', 'special', text); }; + + // Check if Algorithm is Supported + if (!(options.coin.algorithm in algorithms)) { + emitErrorLog(`The ${options.coin.algorithm} hashing algorithm is not supported.`); + throw new Error(); + } + + // Assign fn for getting and submitting next work block + if (options.extensions.miningCandidateApi) { // When using the getMiningCandidate api... + this.cmdGetBlock = (...args) => _this.daemon.cmd.apply( + _this, ['getminingcandidate', [false]].concat(args) + ); + this.cmdSubmitBlock = (miningSolution, ...rest) => _this.daemon.cmd.apply( + _this, ['submitminingsolution', [miningSolution]].concat(rest) + ); + } else { // When using the getblocktemplate api... + this.cmdGetBlock = (...args) => { + const fixedArgs = ['getblocktemplate', [{ + capabilities: ['coinbasetxn', 'workid', 'coinbase/append'], + rules: ['segwit'] + }]]; + return _this.daemon.cmd.apply(_this, fixedArgs.concat(args)); + }; + this.cmdSubmitBlock = (blockHex, ...rest) => { + let rpcCommand; + let rpcArgs; + if (options.hasSubmitMethod) { + rpcCommand = 'submitblock'; + rpcArgs = [blockHex]; + } else { + rpcCommand = 'getblocktemplate'; + rpcArgs = [{ mode: 'submit', data: blockHex }]; + } + + return _this.daemon.cmd.apply(_this, [rpcCommand, rpcArgs].concat(rest)); + }; + } + + this.cmdProcessBlock = (callback) => { + _this.cmdGetBlock( + (result) => { + if (result.error) { + emitErrorLog(`call ${result.method} + with params ${JSON.stringify(result.params)} + failed for daemon instance ${result.instance.index} + with error ${JSON.stringify(result.error)}`); + callback(result.error); + } else { + const isNewBlock = _this.manager.processBlock(result.response); + callback(null, result.response, isNewBlock); + // TODO(rschifflin): Why were we 'undefining' the callback here? + } + }, + true + ); + }; + + // Process Block when Found + this.processBlockNotify = function (blockHash, sourceTrigger) { + emitLog(`Block notification via ${sourceTrigger}`); + // TODO(rschifflin): Why is this not flagged for line length by the linter? + if (typeof (_this.manager.currentJob) !== 'undefined' && blockHash !== _this.manager.currentJob.rpcData.previousblockhash) { + _this.cmdProcessBlock((error) => { + if (error) { + emitErrorLog(`Block notify error getting block for ${options.coin.name}`); + } + }); + } + }; + + // Configure Port Difficulty + this.setDifficulty = function (port, difficultyConfig) { + if (typeof (_this.difficulty[port]) !== 'undefined') { + _this.difficulty[port].removeAllListeners(); + } + const difficultyInstance = new Difficulty(port, difficultyConfig); + _this.difficulty[port] = difficultyInstance; + _this.difficulty[port].on('newDifficulty', (client, newDiff) => { + client.enqueueNextDifficulty(newDiff); + }); + }; + + // Initialize Pool Difficulty + function setupDifficulty() { + _this.difficulty = {}; + Object.keys(options.ports).forEach((port) => { + if (options.ports[port].difficulty) { + _this.setDifficulty(port, options.ports[port].difficulty); + } + }); + } + + // Initialize Pool Daemon + function setupDaemonInterface(callback) { + // Check to Ensure Daemons are Configured + if (!Array.isArray(options.daemons) || options.daemons.length < 1) { + emitErrorLog('No daemons have been configured - pool cannot start'); + return; + } + + // Establish Daemon + _this.daemon = new Daemon.Interface(options.daemons, ((severity, message) => { + _this.emit('log', severity, message); + })); + + // Establish Online Functionality + _this.daemon.once('online', () => { + callback(); + }); + + // Establish Failed Connection Functionality + _this.daemon.on('connectionFailed', (error) => { + emitErrorLog(`Failed to connect daemon(s): ${JSON.stringify(error)}`); + }); + + // Establish Error Functionality + _this.daemon.on('error', (message) => { + emitErrorLog(message); + }); + + // Initialize Daemon + _this.daemon.init(); + } + + // Initialize Pool Data + function setupPoolData(callback) { + // Define Initial RPC Calls + const batchRPCCommand = [ + ['validateaddress', [options.addresses.address]], + ['getdifficulty', []], + ['getmininginfo', []], + // TODO(rschifflin): Make this contingent on options.extensions.miningCandidateApi + ['submitblock', []], + ]; + + // Check if Coin has GetInfo Defined + if (options.coin.hasGetInfo) { + batchRPCCommand.push(['getinfo', []]); + } else { + batchRPCCommand.push(['getblockchaininfo', []], ['getnetworkinfo', []]); + } + + // Manage RPC Batches + _this.daemon.batchCmd(batchRPCCommand, (error, results) => { + if (error || !results) { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog(`Could not start pool, error with init batch RPC call: ${JSON.stringify(error)}`); + return; + } + + // Check Results of Each RPC Call + const rpcResults = {}; + for (let i = 0; i < results.length; i += 1) { + const rpcCall = batchRPCCommand[i][0]; + const r = results[i]; + rpcResults[rpcCall] = r.result || r.error; + + if (rpcCall !== 'submitblock' && (r.error || !r.result)) { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog(`Could not start pool, error with init RPC ${rpcCall} - ${JSON.stringify(r.error)}`); + return; + } + } + + // Check Pool Address is Valid + if (!rpcResults.validateaddress.isvalid) { + emitErrorLog('Daemon reports address is not valid'); + return; + } + + // Check if Mainnet/Testnet is Active + options.testnet = (rpcResults.getblockchaininfo.chain === 'test'); + options.network = (options.testnet ? options.coin.testnet + : options.coin.mainnet); + + // Establish Coin Protocol Version + options.poolAddress = rpcResults.validateaddress.address; + options.protocolVersion = (options.coin.hasGetInfo + ? rpcResults.getinfo.protocolversion + : rpcResults.getnetworkinfo.protocolversion); + let difficulty = options.coin.hasGetInfo ? rpcResults.getinfo.difficulty + : rpcResults.getblockchaininfo.difficulty; + if (typeof (difficulty) === 'object') { + difficulty = difficulty['proof-of-work']; + } + + // Establish Coin Initial Statistics + options.initStats = { + connections: (options.coin.hasGetInfo ? rpcResults.getinfo.connections + : rpcResults.getnetworkinfo.connections), + difficulty: difficulty * algorithms[options.coin.algorithm].multiplier, + networkHashRate: rpcResults.getmininginfo.networkhashps, + }; + + // Check if Pool is Able to Submit Blocks + if (rpcResults.submitblock.message === 'Method not found') { + options.hasSubmitMethod = false; + } else if (rpcResults.submitblock.code === -1) { + options.hasSubmitMethod = true; + } else { + emitErrorLog(`Could not detect block submission RPC method, ${JSON.stringify(results)}`); + return; + } + + // Send Callback + callback(); + }); + } + + // Initialize Pool Recipients + function setupRecipients() { + const recipients = []; + options.feePercent = 0; + options.rewardRecipients = options.rewardRecipients || {}; + Object.keys(options.rewardRecipients).forEach((r) => { + const percent = options.rewardRecipients[r]; + const rObj = { + percent: percent / 100, + }; + try { + if (r.length === 40) rObj.script = util.miningKeyToScript(r); + else rObj.script = util.addressToScript(options.network, r); + recipients.push(rObj); + options.feePercent += percent; + } catch (e) { + emitErrorLog(`Error generating transaction output script for ${r} in rewardRecipients`); + } + }); + if (recipients.length === 0) { + emitErrorLog('No rewardRecipients have been setup which means no fees will be taken'); + } + options.recipients = recipients; + } + + // Check Whether Block was Accepted by Daemon + function checkBlockAccepted(blockHash, callback) { + _this.daemon.cmd('getblock', [blockHash], (results) => { + const validResults = results.filter((result) => result.response + && (result.response.hash === blockHash)); + if (validResults.length >= 1) { + callback(true, validResults[0].response.tx[0]); + } else { + callback(false); + } + }); + } + + // Submit Block to Stratum Server + function submitBlock(submitArg, callback) { + // Establish Submission Functionality + _this.cmdSubmitBlock(submitArg, + (results) => { + for (let i = 0; i < results.length; i += 1) { + const result = results[i]; + if (result.error) { + emitErrorLog(`RPC error with daemon instance ${ + result.instance.index} when submitting block with ${result.method} ${ + JSON.stringify(result.error)}`); + return; + } + if (result.response === 'rejected') { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog(`Daemon instance ${result.instance.index} rejected a supposedly valid block`); + return; + } + + emitLog(`Submitted Block using ${result.method} successfully to daemon instance(s)`); + } + callback(); + }); + } + + // Initialize Pool Job Manager + function setupJobManager() { + // Establish Manager + _this.manager = new Manager(options); + + // Establish Log Functionality + _this.manager.on('log', (severity, message) => { + _this.emit('log', severity, message); + }); + + // Establish New Block Functionality + _this.manager.on('newBlock', (block) => { + if (_this.stratumServer) { + _this.stratumServer.broadcastMiningJobs(block.getJobParams(options)); + } + }); + + // Establish Share Functionality + _this.manager.on('share', (rawShareData, blockSolution) => { + const shareData = rawShareData; + const isValidShare = !shareData.error; + let isValidBlock = !!blockSolution; + const emitShare = function () { + _this.emit('share', isValidShare, isValidBlock, shareData); + }; + if (!isValidBlock) emitShare(); + else { + submitBlock(blockSolution, () => { + checkBlockAccepted(shareData.blockHash, (isAccepted, tx) => { + isValidBlock = isAccepted; + shareData.txHash = tx; + emitShare(); + _this.cmdProcessBlock((error, result, foundNewBlock) => { + if (foundNewBlock) emitLog('Block notification via RPC after block submission'); + }); + }); + }); + } + }); + + // Establish Updated Block Functionality + _this.manager.on('updatedBlock', (block) => { + if (_this.stratumServer) { + const job = block.getJobParams(options); + job[8] = false; + _this.stratumServer.broadcastMiningJobs(job); + } + }); + } + + // Wait Until Blockchain is Fully Synced + function syncBlockchain(syncedCallback) { + // Calculate Current Progress on Sync + const generateProgress = function () { + const cmd = options.coin.hasGetInfo ? 'getinfo' : 'getblockchaininfo'; + _this.daemon.cmd(cmd, [], (getInfoResults) => { + const sortedGetInfo = getInfoResults.sort((a, b) => b.response.blocks - a.response.blocks); + const blockCount = sortedGetInfo[0].response.blocks; + + // Compare with Peers to Get Percentage Synced + _this.daemon.cmd('getpeerinfo', [], (results) => { + const peers = results[0].response; + const sortedPeerInfo = peers.sort((a, b) => b.startingheight - a.startingheight); + const totalBlocks = sortedPeerInfo[0].startingheight; + const percent = ((blockCount / totalBlocks) * 100).toFixed(2); + emitWarningLog(`Downloaded ${percent}% of blockchain from ${peers.length} peers`); + }); + }); + }; + + // Check for Blockchain to be Fully Synced + const checkSynced = function (displayNotSynced) { + _this.cmdGetBlock((results) => { + // NOTE: getblocktemplate and getminingcandidate have an identical error response api + const synced = results.every((r) => !r.error || r.error.code !== -10); + if (synced) { + syncedCallback(); + } else { + if (displayNotSynced) { + displayNotSynced(); + } + setTimeout(checkSynced, 5000); + if (!process.env.forkId || process.env.forkId === '0') { + generateProgress(); + } + } + }); + }; + + // Check and Return Message if Not Synced + checkSynced(() => { + if (!process.env.forkId || process.env.forkId === '0') { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog('Daemon is still syncing with network (download blockchain) - server will be started once synced'); + } + }); + } + + // Initialize Pool First Job + function setupFirstJob(callback) { + // Establish First Block Template + _this.cmdProcessBlock((error) => { + if (error) { + emitErrorLog('Error with getting block on creating first job, server cannot start'); + return; + } + + // Check for Difficulty/Warnings + const portWarnings = []; + const networkDiffAdjusted = options.initStats.difficulty; + Object.keys(options.ports).forEach((port) => { + const portDiff = options.ports[port].diff; + if (networkDiffAdjusted < portDiff) portWarnings.push(`port ${port} w/ diff ${portDiff}`); + }); + if (portWarnings.length > 0 && (!process.env.forkId || process.env.forkId === '0')) { + const warnMessage = `Network diff of ${networkDiffAdjusted} is lower than ${ + portWarnings.join(' and ')}`; + emitWarningLog(warnMessage); + } + + // Send Callback + callback(); + }); + } + + // Initialize Pool Block Polling + function setupBlockPolling() { + if (typeof options.blockRefreshInterval !== 'number' + || options.blockRefreshInterval <= 0) { + emitLog('Block template polling has been disabled'); + return; + } + const pollingInterval = options.blockRefreshInterval; + // TODO(rschifflin) Why were we capturing the setInterval result if we never unset it? + /* blockPollingIntervalId = */ setInterval(() => { + _this.cmdProcessBlock((error, _result, foundNewBlock) => { + if (foundNewBlock) emitLog('Block notification via RPC polling'); + }); + }, pollingInterval); + } + + // Initialize Pool Peers + function setupPeer() { + // Check for P2P Configuration + if (!options.p2p || !options.p2p.enabled) return; + if (options.testnet && !options.coin.peerMagicTestnet) { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog('p2p cannot be enabled in testnet without peerMagicTestnet set in coin configuration'); + return; + } if (!options.coin.peerMagic) { + emitErrorLog('p2p cannot be enabled without peerMagic set in coin configuration'); + return; + } + + // Establish Peer + _this.peer = new Peer(options); + + // Establish Connection Functionality + _this.peer.on('connected', () => {}); + _this.peer.on('disconnected', () => {}); + + // Establish Rejected Connection Functionality + _this.peer.on('connectionRejected', () => { + emitErrorLog('p2p connection failed - likely incorrect p2p magic value'); + }); + + // Establish Failed Connection Functionality + _this.peer.on('connectionFailed', () => { + emitErrorLog('p2p connection failed - likely incorrect host or port'); + }); + + // Establish Socket Error Functionality + _this.peer.on('socketError', (e) => { + emitErrorLog(`p2p had a socket error ${JSON.stringify(e)}`); + }); + + // Establish Error Functionality + _this.peer.on('error', (msg) => { + emitWarningLog(`p2p had an error ${msg}`); + }); + + // Establish Found Block Functionality + _this.peer.on('blockFound', (hash) => { + _this.processBlockNotify(hash, 'p2p'); + }); + } + + // Start Pool Stratum Server + function startStratumServer(callback) { + // Establish Stratum Server + _this.stratumServer = new Stratum.Server(options, authorizeFn); + + // Establish Started Functionality + _this.stratumServer.on('started', () => { + let stratumPorts = Object.keys(options.ports); + stratumPorts = stratumPorts.filter((port) => options.ports[port].enabled === true); + options.initStats.stratumPorts = stratumPorts; + _this.stratumServer.broadcastMiningJobs(_this.manager.currentJob.getJobParams(options)); + callback(); + }); + + // Establish Timeout Functionality + _this.stratumServer.on('broadcastTimeout', () => { + if (options.debug) { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitLog(`No new blocks for ${options.jobRebroadcastTimeout} seconds - updating transactions & rebroadcasting work`); + } + + // TODO(rschifflin): Why is this raw call here?? + // _this.daemon.cmd('getblocktemplate', [], () => {}); + + _this.cmdProcessBlock((error, rpcData, isNewBlock) => { + if (error || isNewBlock) return; + _this.manager.updateCurrentJob(rpcData); + }); + }); + + // Establish New Connection Functionality + _this.stratumServer.on('client.connected', (client) => { + // Manage/Record Client Difficulty + if (typeof (_this.difficulty[client.socket.localPort]) !== 'undefined') { + _this.difficulty[client.socket.localPort].manageClient(client); + } + + // Establish Client Difficulty Functionality + client.on('difficultyChanged', (diff) => { + _this.emit('difficultyUpdate', client.workerName, diff); + }); + + // Establish Client Subscription Functionality + client.on('subscription', function (params, resultCallback) { + const extraNonce = _this.manager.extraNonceCounter.next(); + const { extraNonce2Size } = _this.manager; + resultCallback(null, extraNonce, extraNonce2Size); + if (typeof (options.ports[client.socket.localPort]) !== 'undefined' + && options.ports[client.socket.localPort].diff) { + this.sendDifficulty(options.ports[client.socket.localPort].diff); + } else { + this.sendDifficulty(8); + } + this.sendMiningJob(_this.manager.currentJob.getJobParams(options)); + }); + + // Establish Client Submission Functionality + client.on('submit', (params, resultCallback) => { + const result = _this.manager.processShare( + params.jobId, + client.previousDifficulty, + client.difficulty, + client.extraNonce1, + params.extraNonce2, + params.nTime, + params.nonce, + client.remoteAddress, + client.socket.localPort, + params.name, + ); + resultCallback(result.error, result.result ? true : null); + }); + + // Establish Client Error Messaging Functionality + client.on('malformedMessage', () => {}); + + // Establish Client Socket Error Functionality + client.on('socketError', (e) => { + emitWarningLog(`Socket error from ${client.getLabel()}: ${JSON.stringify(e)}`); + }); + + // Establish Client Socket Timeout Functionality + client.on('socketTimeout', (reason) => { + emitWarningLog(`Connected timed out for ${client.getLabel()}: ${reason}`); + }); + + // Establish Client Disconnect Functionality + client.on('socketDisconnect', () => {}); + + // Establish Client Banned Functionality + client.on('kickedBannedIP', (remainingBanTime) => { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitLog(`Rejected incoming connection from ${client.remoteAddress} banned for ${remainingBanTime} more seconds`); + }); + + // Establish Client Forgiveness Functionality + client.on('forgaveBannedIP', () => { + emitLog(`Forgave banned IP ${client.remoteAddress}`); + }); + + // Establish Client Unknown Stratum Functionality + client.on('unknownStratumMethod', (fullMessage) => { + emitLog(`Unknown stratum method from ${client.getLabel()}: ${fullMessage.method}`); + }); + + // Establish Client DDOS Functionality + client.on('socketFlooded', () => { + emitWarningLog(`Detected socket flooding from ${client.getLabel()}`); + }); + + // Establish Client TCP Error Functionality + client.on('tcpProxyError', (data) => { + // TODO(rschifflin): Why is this not flagged for line length by the linter? + emitErrorLog(`Client IP detection failed, tcpProxyProtocol is enabled yet did not receive proxy protocol message, instead got data: ${data}`); + }); + + // Establish Client Banning Functionality + client.on('triggerBan', (reason) => { + emitWarningLog(`Banned triggered for ${client.getLabel()}: ${reason}`); + _this.emit('banIP', client.remoteAddress, client.workerName); + }); + }); + } + + // Output Derived Pool Information + function outputPoolInfo() { + const startMessage = `Stratum Pool Server Started for ${options.coin.name + } [${options.coin.symbol.toUpperCase()}] {${options.coin.algorithm}}`; + if (process.env.forkId && process.env.forkId !== '0') { + emitLog(startMessage); + return; + } + const infoLines = [startMessage, + `Network Connected:\t${options.testnet ? 'Testnet' : 'Mainnet'}`, + `Current Block Height:\t${_this.manager.currentJob.rpcData.height}`, + `Current Connect Peers:\t${options.initStats.connections}`, + // TODO(rschifflin): Why is this not flagged for line length by the linter? + `Current Block Diff:\t${_this.manager.currentJob.difficulty * algorithms[options.coin.algorithm].multiplier}`, + `Network Difficulty:\t${options.initStats.difficulty}`, + `Stratum Port(s):\t${options.initStats.stratumPorts.join(', ')}`, + `Pool Fee Percent:\t${options.feePercent}%`, + ]; + if (typeof options.blockRefreshInterval === 'number' + && options.blockRefreshInterval > 0) { + infoLines.push(`Block Polling Every:\t${options.blockRefreshInterval} ms`); + } + emitSpecialLog(infoLines.join('\n\t\t\t\t\t\t')); + } + + // Initialize Pool Server + this.start = function () { + setupDifficulty(); + setupDaemonInterface(() => { + setupPoolData(() => { + setupRecipients(); + setupJobManager(); + syncBlockchain(() => { + setupFirstJob(() => { + setupBlockPolling(); + setupPeer(); + startStratumServer(() => { + outputPoolInfo(); + _this.emit('started'); + }); + }); + }); + }); + }); + }; +}; + +module.exports = Pool; +Object.setPrototypeOf(Pool.prototype, events.EventEmitter.prototype); diff --git a/scripts/stratum.js b/scripts/stratum.js new file mode 100644 index 0000000..ed780d8 --- /dev/null +++ b/scripts/stratum.js @@ -0,0 +1,481 @@ +// Import Required Modules +const net = require('net'); +const events = require('events'); +const util = require('./util.js'); + +// Increment Count for Each Subscription +const SubscriptionCounter = function () { + let count = 0; + const padding = 'deadbeefcafebabe'; + return { + next() { + count += 1; + if (Number.MAX_VALUE === count) count = 0; + return padding + util.packInt64LE(count).toString('hex'); + }, + }; +}; + +/** + * Defining each client that connects to the stratum server. + * Emits: + * - subscription(obj, cback(error, extraNonce1, extraNonce2Size)) + * - submit(data(name, jobID, extraNonce2, ntime, nonce)) +* */ + +// Stratum Client Main Function +const StratumClient = function (options) { + // Establish Private Stratum Variables + const _this = this; + const { banning } = options; + let pendingDifficulty = null; + + // Establish Public Stratum Variables + this.lastActivity = Date.now(); + this.socket = options.socket; + this.remoteAddress = options.socket.remoteAddress; + this.shares = { valid: 0, invalid: 0 }; + + // Helper Function if Banning is Disabled + function banningDisabled() { + return false; + } + + // Helper Function if Banning is Enabled + function banningEnabled(shareValid) { + if (shareValid === true) { + _this.shares.valid += 1; + } else { + _this.shares.invalid += 1; + } + const totalShares = _this.shares.valid + _this.shares.invalid; + if (totalShares >= banning.checkThreshold) { + const percentBad = (_this.shares.invalid / totalShares) * 100; + if (percentBad < banning.invalidPercent) { + this.shares = { valid: 0, invalid: 0 }; + } else { + _this.emit('triggerBan', `${_this.shares.invalid} out of the last ${totalShares} shares were invalid`); + _this.socket.destroy(); + return true; + } + } + return false; + } + + // Determine Whether to Consider Banning + const considerBan = (!banning || !banning.enabled) ? banningDisabled : banningEnabled; + + // Manage JSON Functionality + function sendJson(...args) { + let response = ''; + for (let i = 0; i < args.length; i += 1) { + response += `${JSON.stringify(args[i])}\n`; + } + options.socket.write(response); + } + + // Get Label of Stratum Client + this.getLabel = function () { + return `${_this.workerName || '(unauthorized)'} [${_this.remoteAddress}]`; + }; + + // Push Updated Difficulty to Difficulty Queue + this.enqueueNextDifficulty = function (requestedNewDifficulty) { + pendingDifficulty = requestedNewDifficulty; + return true; + }; + + // Broadcast Difficulty to Stratum Client + this.sendDifficulty = function (difficulty) { + if (difficulty === this.difficulty) return false; + _this.previousDifficulty = _this.difficulty; + _this.difficulty = difficulty; + sendJson({ + id: null, + method: 'mining.set_difficulty', + params: [difficulty], + }); + return true; + }; + + // Manage Stratum Subscription + function handleSubscribe(message) { + if (!_this.authorized) { + _this.requestedSubscriptionBeforeAuth = true; + } + _this.emit('subscription', {}, (error, extraNonce1, extraNonce2Size) => { + if (error) { + sendJson({ + id: message.id, + result: null, + error, + }); + return; + } + _this.extraNonce1 = extraNonce1; + sendJson({ + id: message.id, + result: [ + [ + ['mining.set_difficulty', options.subscriptionId], + ['mining.notify', options.subscriptionId], + ], + extraNonce1, + extraNonce2Size, + ], + error: null, + }); + }); + } + + // Manage Stratum Authorization + function handleAuthorize(message, replyToSocket) { + [_this.workerName, _this.workerPass] = message.params; + const args = [ + _this.remoteAddress, options.socket.localPort, _this.workerName, _this.workerPass]; + options.authorizeFn(...args, (result) => { + _this.authorized = (!result.error && result.authorized); + if (replyToSocket) { + sendJson({ + id: message.id, + result: _this.authorized, + error: result.error, + }); + } + if (result.disconnect === true) { + options.socket.destroy(); + } + }); + } + + // Manage Stratum Submission + function handleSubmit(message) { + if (!_this.authorized) { + sendJson({ + id: message.id, + result: null, + error: [24, 'unauthorized worker', null], + }); + considerBan(false); + return; + } + if (!_this.extraNonce1) { + sendJson({ + id: message.id, + result: null, + error: [25, 'not subscribed', null], + }); + considerBan(false); + return; + } + _this.emit('submit', + { + name: message.params[0], + jobId: message.params[1], + extraNonce2: message.params[2], + nTime: message.params[3].toLowerCase(), + nonce: message.params[4].toLowerCase(), + }, + (error, result) => { + if (!considerBan(result)) { + sendJson({ + id: message.id, + result, + error, + }); + } + }); + } + + // Handle Stratum Messages + function handleMessage(message) { + switch (message.method) { + // Manage Stratum Subscription + case 'mining.subscribe': + handleSubscribe(message); + break; + + // Manage Stratum Authorization + case 'mining.authorize': + handleAuthorize(message, true); + break; + + // Manage Stratum Submission + case 'mining.submit': + _this.lastActivity = Date.now(); + handleSubmit(message); + break; + + // Manage Transactions + case 'mining.get_transactions': + sendJson({ + id: null, + result: [], + error: true, + }); + break; + + // Manage Extranonce Capabilities + case 'mining.extranonce.subscribe': + sendJson({ + id: message.id, + result: false, + error: [20, 'Not supported.', null], + }); + break; + + // Unknown Stratum Method + default: + _this.emit('unknownStratumMethod', message); + break; + } + } + + // Establish Stratum Connection + function setupSocket() { + // Setup Main Socket Connection + let dataBuffer = ''; + const { socket } = options; + socket.setEncoding('utf8'); + if (options.tcpProxyProtocol === true) { + socket.once('data', (d) => { + if (d.indexOf('PROXY') === 0) { + [, _this.remoteAddress] = d.split(' '); + } else { + _this.emit('tcpProxyError', d); + } + _this.emit('checkBan'); + }); + } else { + _this.emit('checkBan'); + } + + // Manage Stratum Data Functionality + socket.on('data', (d) => { + dataBuffer += d; + if (Buffer.byteLength(dataBuffer, 'utf8') > 10240) { + dataBuffer = ''; + _this.emit('socketFlooded'); + socket.destroy(); + return; + } + if (dataBuffer.indexOf('\n') !== -1) { + const messages = dataBuffer.split('\n'); + const incomplete = dataBuffer.slice(-1) === '\n' ? '' : messages.pop(); + messages.forEach((message) => { + if (message === '') return; + let messageJson; + try { + messageJson = JSON.parse(message); + } catch (e) { + if (options.tcpProxyProtocol !== true || d.indexOf('PROXY') !== 0) { + _this.emit('malformedMessage', message); + socket.destroy(); + } + return; + } + if (messageJson) { + handleMessage(messageJson); + } + }); + dataBuffer = incomplete; + } + }); + + // Manage Stratum Close Functionality + socket.on('close', () => { + _this.emit('socketDisconnect'); + }); + + // Manage Stratum Error Functionality + socket.on('error', (err) => { + if (err.code !== 'ECONNRESET') _this.emit('socketError', err); + }); + } + + // Initialize Stratum Connection + function initializeClient() { + setupSocket(); + } + + // Broadcast Mining Job to Stratum Client + this.sendMiningJob = function (jobParams) { + const lastActivityAgo = Date.now() - _this.lastActivity; + if (lastActivityAgo > options.connectionTimeout * 1000) { + _this.emit( + 'socketTimeout', + `last submitted a share was ${(lastActivityAgo / 1000 | 0)} seconds ago`, + ); + _this.socket.destroy(); + return; + } + if (pendingDifficulty !== null) { + const result = _this.sendDifficulty(pendingDifficulty); + pendingDifficulty = null; + if (result) { + _this.emit('difficultyChanged', _this.difficulty); + } + } + sendJson({ + id: null, + method: 'mining.notify', + params: jobParams, + }); + }; + + // Manually Authorize Stratum Client + this.manuallyAuthClient = function (username, password) { + handleAuthorize({ id: 1, params: [username, password] }, false); + }; + + // Manually Copy Values from Stratum Client + this.manuallySetValues = function (otherClient) { + _this.extraNonce1 = otherClient.extraNonce1; + _this.previousDifficulty = otherClient.previousDifficulty; + _this.difficulty = otherClient.difficulty; + }; + + // Initialize Stratum Connection + this.init = initializeClient; +}; + +/** + * The actual stratum server. + * It emits the following Events: + * - 'client.connected'(StratumClientInstance) - when a new miner connects + * - 'client.disconnected'(StratumClientInstance) - when a miner disconnects. + * Be aware that the socket cannot be used anymore. + * - 'started' - when the server is up and running + * */ + +// Stratum Client Main Function +const StratumServer = function (options, authorizeFn) { + // Establish Private Stratum Variables + const _this = this; + const stratumClients = {}; + const subscriptionCounter = SubscriptionCounter(); + let rebroadcastTimeout; + const bannedIPs = {}; + + // Determine Length of Client Ban + const bannedMS = options.banning ? options.banning.time * 1000 : null; + + // Check Regarding Banned Clients + function checkBan(client) { + if (options.banning && options.banning.enabled && client.remoteAddress in bannedIPs) { + const bannedTime = bannedIPs[client.remoteAddress]; + const bannedTimeAgo = Date.now() - bannedTime; + const timeLeft = bannedMS - bannedTimeAgo; + if (timeLeft > 0) { + client.socket.destroy(); + client.emit('kickedBannedIP', timeLeft / 1000 | 0); + } else { + delete bannedIPs[client.remoteAddress]; + client.emit('forgaveBannedIP'); + } + } + } + + // Manage New Client Connections + this.handleNewClient = function (socket) { + // Establish New Stratum Client + socket.setKeepAlive(true); + const subscriptionId = subscriptionCounter.next(); + const client = new StratumClient({ + subscriptionId, + authorizeFn, + socket, + banning: options.banning, + connectionTimeout: options.connectionTimeout, + tcpProxyProtocol: options.tcpProxyProtocol, + }); + stratumClients[subscriptionId] = client; + + // Manage Client Behaviors + _this.emit('client.connected', client); + client.on('socketDisconnect', () => { + _this.manuallyRemoveStratumClient(subscriptionId); + _this.emit('client.disconnected', client); + }).on('checkBan', () => { + checkBan(client); + }).on('triggerBan', () => { + _this.addBannedIP(client.remoteAddress); + }).init(); + + // Return Client Subscription ID + return subscriptionId; + }; + + // Broadcast New Jobs to Clients + this.broadcastMiningJobs = function (jobParams) { + Object.values(stratumClients).forEach((client) => { + client.sendMiningJob(jobParams); + }); + clearTimeout(rebroadcastTimeout); + rebroadcastTimeout = setTimeout(() => { + _this.emit('broadcastTimeout'); + }, options.jobRebroadcastTimeout * 1000); + }; + + // Add Banned IP to List of Banned IPs + this.addBannedIP = function (ipAddress) { + bannedIPs[ipAddress] = Date.now(); + }; + + // Return Current Connected Clients + this.getStratumClients = function () { + return stratumClients; + }; + + // Manually Add Stratum Client to Stratum Server + this.manuallyAddStratumClient = function (clientObj) { + const subId = _this.handleNewClient(clientObj.socket); + if (subId != null) { // not banned! + stratumClients[subId].manuallyAuthClient(clientObj.workerName, clientObj.workerPass); + stratumClients[subId].manuallySetValues(clientObj); + } + }; + + // Manually Remove Stratum Client from Stratum Server + this.manuallyRemoveStratumClient = function (subscriptionId) { + delete stratumClients[subscriptionId]; + }; + + // Initialize Stratum Connection + function initializeServer() { + // Interval to Clear Old Bans from BannedIPs + if (options.banning && options.banning.enabled) { + setInterval(() => { + Object.keys(bannedIPs).forEach((ip) => { + const banTime = bannedIPs[ip]; + if (Date.now() - banTime > options.banning.time) delete bannedIPs[ip]; + }); + }, 1000 * options.banning.purgeInterval); + } + + // Start Individual Stratum Ports + let serversStarted = 0; + let stratumPorts = Object.keys(options.ports); + stratumPorts = stratumPorts.filter((port) => options.ports[port].enabled === true); + + // Start Individual Stratum Servers + stratumPorts.forEach((port) => { + net.createServer({ allowHalfOpen: false }, (socket) => { + _this.handleNewClient(socket); + }).listen(parseInt(port, 10), () => { + serversStarted += 1; + if (serversStarted === stratumPorts.length) { + _this.emit('started'); + } + }); + }); + } + + // Initialize Stratum Connection + initializeServer(); +}; + +// Export Stratum Client/Server +exports.Server = StratumServer; +Object.setPrototypeOf(StratumClient.prototype, events.EventEmitter.prototype); +Object.setPrototypeOf(StratumServer.prototype, events.EventEmitter.prototype); diff --git a/scripts/transactions.js b/scripts/transactions.js new file mode 100644 index 0000000..8bec445 --- /dev/null +++ b/scripts/transactions.js @@ -0,0 +1,107 @@ +// Import Required Modules +const minerId = require('./miner-id') +const util = require('./util.js'); + +// Generate Combined Transactions (Bitcoin) +const Transactions = function () { + // Structure Bitcoin Protocol Transaction + this.bitcoin = function (rpcData, extraNoncePlaceholder, options) { + // Establish Transactions Variables [1] + const txLockTime = 0; + const txInSequence = 0; + const txInPrevOutHash = ''; + const txInPrevOutIndex = 2 ** 32 - 1; + const txVersion = options.coin.txMessages === true ? 2 : 1; + + // Establish Transactions Variables [2] + const reward = rpcData.coinbasevalue; + let rewardToPool = reward; + const txOutputBuffers = []; + const coinbaseAux = rpcData.coinbaseaux.flags ? Buffer.from(rpcData.coinbaseaux.flags, 'hex') : Buffer.from([]); + const poolAddressScript = util.addressToScript(options.network, options.poolAddress); + + // Handle Comments if Necessary + const txComment = options.coin.txMessages === true + ? util.serializeString('CylonJaeger') + : Buffer.from([]); + + // Handle ScriptSig [1] + const scriptSigPart1 = Buffer.concat([ + util.serializeNumber(rpcData.height), + coinbaseAux, + util.serializeNumber(Date.now() / 1000 | 0), + Buffer.from([extraNoncePlaceholder.length]), + ]); + + // Handle ScriptSig [2] + const scriptSigPart2 = util.serializeString('/CylonJaeger/'); + const bufLens = scriptSigPart1.length + extraNoncePlaceholder.length + scriptSigPart2.length; + + // Combine Transaction [1] + const p1 = Buffer.concat([ + util.packUInt32LE(txVersion), + util.varIntBuffer(1), + util.uint256BufferFromHash(txInPrevOutHash), + util.packUInt32LE(txInPrevOutIndex), + util.varIntBuffer(bufLens), + scriptSigPart1, + ]); + + // Handle Block Transactions + for (let i = 0; i < options.recipients.length; i += 1) { + const recipientReward = Math.floor(options.recipients[i].percent * reward); + rewardToPool -= recipientReward; + txOutputBuffers.push(Buffer.concat([ + util.packInt64LE(recipientReward), + util.varIntBuffer(options.recipients[i].script.length), + options.recipients[i].script, + ])); + } + + // Handle Pool Transaction + txOutputBuffers.unshift(Buffer.concat([ + util.packInt64LE(rewardToPool), + util.varIntBuffer(poolAddressScript.length), + poolAddressScript, + ])); + + // Handle Witness Commitment + if (rpcData.default_witness_commitment !== undefined) { + const witnessCommitment = Buffer.from(rpcData.default_witness_commitment, 'hex'); + txOutputBuffers.unshift(Buffer.concat([ + util.packInt64LE(0), + util.varIntBuffer(witnessCommitment.length), + witnessCommitment, + ])); + } + + // Handle MinerId op_return + const minerIdBuffer = minerId.generate(rpcData.height); + txOutputBuffers.push(Buffer.concat([ + util.packInt64LE(0), + util.varIntBuffer(minerIdBuffer.length), + minerIdBuffer + ])); + + // Combine All Transactions + const outputTransactions = Buffer.concat([ + util.varIntBuffer(txOutputBuffers.length), + Buffer.concat(txOutputBuffers), + ]); + + // Combine Transaction [2] + const p2 = Buffer.concat([ + scriptSigPart2, + util.packUInt32LE(txInSequence), + outputTransactions, + util.packUInt32LE(txLockTime), + txComment, + ]); + + // Return Generated Transaction + return [p1, p2]; + }; +}; + +// Export Transactions +module.exports = Transactions; diff --git a/scripts/util.js b/scripts/util.js new file mode 100644 index 0000000..57f2077 --- /dev/null +++ b/scripts/util.js @@ -0,0 +1,301 @@ +// Import Required Modules +const crypto = require('crypto'); +const base58 = require('base58-native'); +const bignum = require('bignum'); +const bitcoin = require('bitcoinjs-lib'); + +// Hash Address from exAddress + Key +exports.addressFromEx = function (exAddress, ripdm160Key) { + try { + const versionByte = exports.getVersionByte(exAddress); + const addrBase = Buffer.concat([versionByte, Buffer.from(ripdm160Key, 'hex')]); + const checksum = exports.sha256d(addrBase).slice(0, 4); + const address = Buffer.concat([addrBase, checksum]); + return base58.encode(address); + } catch (e) { + return null; + } +}; + +// Convert Address to Script +exports.addressToScript = function (network, addr) { + if (typeof network !== 'undefined' && network !== null) { + return bitcoin.address.toOutputScript(addr, network); + } + + return Buffer.concat( + [ + Buffer.from([0x76, 0xa9, 0x14]), + bitcoin.address.fromBase58Check(addr).hash, + Buffer.from([0x88, 0xac]) + ] + ); +}; + +// Convert Bits into Target Bignum +exports.bignumFromBitsBuffer = function (bitsBuff) { + const numBytes = bitsBuff.readUInt8(0); + const bigBits = bignum.fromBuffer(bitsBuff.slice(1)); + const target = bigBits.mul( + bignum(2).pow( + bignum(8).mul( + numBytes - 3, + ), + ), + ); + return target; +}; + +// Convert Bits into Target Bignum +exports.bignumFromBitsHex = function (bitsString) { + const bitsBuff = Buffer.from(bitsString, 'hex'); + return exports.bignumFromBitsBuffer(bitsBuff); +}; + +// Convert Buffer to Compact Bits +exports.bufferToCompactBits = function (startingBuff) { + const bigNum = bignum.fromBuffer(startingBuff); + let buff = bigNum.toBuffer(); + buff = buff.readUInt8(0) > 0x7f ? Buffer.concat([Buffer.from([0x00]), buff]) : buff; + buff = Buffer.concat([Buffer.from([buff.length]), buff]); + const compact = buff.slice(0, 4); + return compact; +}; + +// Convert Bits to Buffer +exports.convertBitsToBuff = function (bitsBuff) { + const target = exports.bignumFromBitsBuffer(bitsBuff); + const resultBuff = target.toBuffer(); + const buff256 = Buffer.alloc(32); + buff256.fill(0); + resultBuff.copy(buff256, buff256.length - resultBuff.length); + return buff256; +}; + +// Get Truncated Difficulty +exports.getTruncatedDiff = function (shift) { + return exports.convertBitsToBuff(exports.bufferToCompactBits(exports.shiftMax256Right(shift))); +}; + +// Get Address Version Byte +exports.getVersionByte = function (addr) { + const versionByte = base58.decode(addr).slice(0, 1); + return versionByte; +}; + +// Generate Hex String from Input Buffer +exports.hexFromReversedBuffer = function (buffer) { + return exports.reverseBuffer(buffer).toString('hex'); +}; + +// Convert Mining Key to Script +exports.miningKeyToScript = function (key) { + const keyBuffer = Buffer.from(key, 'hex'); + return Buffer.concat([Buffer.from([0x76, 0xa9, 0x14]), keyBuffer, Buffer.from([0x88, 0xac])]); +}; + +// Alloc/Write UInt16LE +exports.packUInt16LE = function (num) { + const buff = Buffer.alloc(2); + buff.writeUInt16LE(num, 0); + return buff; +}; + +// Alloc/Write UInt32LE +exports.packUInt32LE = function (num) { + const buff = Buffer.alloc(4); + buff.writeUInt32LE(num, 0); + return buff; +}; + +// Alloc/Write UInt32BE +exports.packUInt32BE = function (num) { + const buff = Buffer.alloc(4); + buff.writeUInt32BE(num, 0); + return buff; +}; + +// Alloc/Write Int32LE +exports.packInt32LE = function (num) { + const buff = Buffer.alloc(4); + buff.writeInt32LE(num, 0); + return buff; +}; + +// Alloc/Write Int32BE +exports.packInt32BE = function (num) { + const buff = Buffer.alloc(4); + buff.writeInt32BE(num, 0); + return buff; +}; + +// Alloc/Write Int64LE +exports.packInt64LE = function (num) { + const buff = Buffer.alloc(8); + buff.writeUInt32LE(num % (2 ** 32), 0); + buff.writeUInt32LE(Math.floor(num / 2 ** 32), 4); + return buff; +}; + +// Convert Pubkey to Script +exports.pubkeyToScript = function (key) { + if (key.length !== 66) { + console.error(`Invalid pubkey: ${key}`); + throw new Error(); + } + const pubkey = Buffer.alloc(35); + pubkey[0] = 0x21; + pubkey[34] = 0xac; + Buffer.from(key, 'hex').copy(pubkey, 1); + return pubkey; +}; + +// Range Function +exports.range = function (start, stop, step) { + if (typeof stop === 'undefined') { + stop = start; + start = 0; + } + if (typeof step === 'undefined') { + step = 1; + } + if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { + return []; + } + const result = []; + for (let i = start; step > 0 ? i < stop : i > stop; i += step) { + result.push(i); + } + return result; +}; + +// Reverse Input Buffer +exports.reverseBuffer = function (buff) { + const reversed = Buffer.alloc(buff.length); + for (let i = buff.length - 1; i >= 0; i -= 1) reversed[buff.length - i - 1] = buff[i]; + return reversed; +}; + +// Reverse Byte Order of Input Buffer +exports.reverseByteOrder = function (buff) { + for (let i = 0; i < 8; i += 1) buff.writeUInt32LE(buff.readUInt32BE(i * 4), i * 4); + return exports.reverseBuffer(buff); +}; + +// Reverse Input Buffer + Hex String +exports.reverseHex = function (hex) { + return exports.reverseBuffer(Buffer.from(hex, 'hex')).toString('hex'); +}; + +// Serialize Height/Date Input +exports.serializeNumber = function (n) { + if (n >= 1 && n <= 16) return Buffer.from([0x50 + n]); + let l = 1; + const buff = Buffer.alloc(9); + while (n > 0x7f) { + buff.writeUInt8(n & 0xff, l += 1); + n >>= 8; + } + buff.writeUInt8(l, 0); + buff.writeUInt8(n, l += 1); + return buff.slice(0, l); +}; + +// Serialize Strings used for Signature +exports.serializeString = function (s) { + if (s.length < 253) { + return Buffer.concat([ + Buffer.from([s.length]), + Buffer.from(s), + ]); + } + if (s.length < 0x10000) { + return Buffer.concat([ + Buffer.from([253]), + exports.packUInt16LE(s.length), + Buffer.from(s), + ]); + } + if (s.length < 0x100000000) { + return Buffer.concat([ + Buffer.from([254]), + exports.packUInt32LE(s.length), + Buffer.from(s), + ]); + } + return Buffer.concat([ + Buffer.from([255]), + exports.packUInt16LE(s.length), + Buffer.from(s), + ]); +}; + +// Hash Input w/ Sha256 +exports.sha256 = function (buffer) { + const hash1 = crypto.createHash('sha256'); + hash1.update(buffer); + return hash1.digest(); +}; + +// Hash Input w/ Sha256d +exports.sha256d = function (buffer) { + return exports.sha256(exports.sha256(buffer)); +}; + +// Bitwise Right-Shift Max UInt256 +exports.shiftMax256Right = function (shiftRight) { + let arr256 = Array(...new Array(256)).map(Number.prototype.valueOf, 1); + const arrLeft = Array(...new Array(shiftRight)).map(Number.prototype.valueOf, 0); + arr256 = arrLeft.concat(arr256).slice(0, 256); + const octets = []; + for (let i = 0; i < 32; i += 1) { + octets[i] = 0; + const bits = arr256.slice(i * 8, i * 8 + 8); + for (let f = 0; f < bits.length; f += 1) { + const multiplier = 2 ** f; + octets[i] += bits[f] * multiplier; + } + } + return Buffer.from(octets); +}; + +// Generate Reverse Buffer from Input Hash +exports.uint256BufferFromHash = function (hex) { + let fromHex = Buffer.from(hex, 'hex'); + if (fromHex.length !== 32) { + const empty = Buffer.alloc(32); + empty.fill(0); + fromHex.copy(empty); + fromHex = empty; + } + return exports.reverseBuffer(fromHex); +}; + +// Generate VarInt Buffer +exports.varIntBuffer = function (n) { + let buff; + if (n < 0xfd) return Buffer.from([n]); + if (n <= 0xffff) { + buff = Buffer.alloc(3); + buff[0] = 0xfd; + buff.writeUInt16LE(n, 1); + return buff; + } + if (n <= 0xffffffff) { + buff = Buffer.alloc(5); + buff[0] = 0xfe; + buff.writeUInt32LE(n, 1); + return buff; + } + + buff = Buffer.alloc(9); + buff[0] = 0xff; + exports.packUInt16LE(n).copy(buff, 1); + return buff; +}; + +// Generate VarString Buffer +exports.varStringBuffer = function (string) { + const strBuff = Buffer.from(string); + return Buffer.concat([exports.varIntBuffer(strBuff.length), strBuff]); +}; diff --git a/test/merkle_test.js b/test/merkle_test.js new file mode 100644 index 0000000..a63fc26 --- /dev/null +++ b/test/merkle_test.js @@ -0,0 +1,20 @@ +const { describe, it } = require('mocha'); +const { expect } = require('chai'); +const Merkle = require('../scripts/merkle.js'); + +describe('merkle', () => { + it('calculates the merkle branch correctly', () => { + const args = ['foo', 'bar', 'baz', 'a', 'b', 'c', 'd'].map(Buffer.from); + args.unshift(null); + const expected = [ + '666f6f', + 'fbea6d88dad1e3dcd5999ce90e948f37088998c1dee0fd83c368a08935e86c1e', + '49a980a488222504a9112c2bf1afb9541b70020ed188ed92ac1cabed6ef16f99', + ]; + + const { branch } = new Merkle(args); + const hex = branch.map((step) => step.toString('hex')); + + expect(hex).to.deep.equal(expected); + }); +});